Beispiel #1
0
void RasterTerrain::OpenTerrain(void)
{
  TCHAR  szFile[MAX_PATH] = TEXT("\0");

  GetRegistryString(szRegistryTerrainFile, szFile, MAX_PATH);

  char zfilename[MAX_PATH];

  ExpandLocalPath(szFile);

  unicode2ascii(szFile, zfilename, MAX_PATH);

  if (strlen(zfilename)==0) {
    static TCHAR  szMapFile[MAX_PATH] = TEXT("\0");
    GetRegistryString(szRegistryMapFile, szMapFile, MAX_PATH);
    ExpandLocalPath(szMapFile);
    _tcscpy(szFile,szMapFile);
    _tcscat(szFile,TEXT("/terrain.jp2"));
    unicode2ascii(szFile, zfilename, MAX_PATH);
  }

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

  CreateTerrainMap(zfilename);
}
Beispiel #2
0
// Get the user id from Leonardo servername
// returns 0=no id, -1=transaction failed
static int GetUserIDFromServer()
{
    int retval = -1;
    int rxlen;
    char txbuf[512];
    char username[128];
    char password[128];
    char rxcontent[32];

    unicode2ascii(LiveTrackerusr_Config, txbuf, sizeof(username));
    UrlEncode(txbuf, username, sizeof(username));
    unicode2ascii(LiveTrackerpwd_Config, txbuf, sizeof(password));
    UrlEncode(txbuf, password, sizeof(username));
    sprintf(txbuf,"GET /client.php?op=login&user=%s&pass=%s HTTP/1.0\r\nHost: %s\r\n\r\n",
            username, password,
            _server_name);

    rxlen = DoTransactionToServer(txbuf, strlen(txbuf), rxcontent, sizeof(rxcontent));
    if ( rxlen > 0) {
        rxcontent[rxlen]=0;
        retval = -1;
        sscanf(rxcontent,"%d",&retval);
    }
    return retval;
}
Beispiel #3
0
/* ARGSUSED */
static void
output_trans2_findfirst(int flags, uchar_t *data, char *xtra, int xsz)
{
	int length;
	char filename[256];
	char infolevel[100];

	if (flags & F_SUM) {
		length = snprintf(xtra, xsz, " Findfirst");
		xtra += length;
		xsz -= length;
		data += 12;
		(void) unicode2ascii(filename, 256, data, 512);
		snprintf(xtra, xsz, " File=%s", filename);
	}

	if (flags & F_DTAIL) {
		show_line("FunctionName = Findfirst");
		show_printf("SearchAttributes = 0x%.4x", get2(data));
		data += 2;
		show_printf("FindCount = 0x%.4x", get2(data));
		data += 2;
		show_printf("FindFlags = 0x%.4x", get2(data));
		data += 2;
		get_info_level(infolevel, sizeof (infolevel), get2(data));
		show_printf("InfoLevel = %s", infolevel);
		data += 6;
		(void) unicode2ascii(filename, 256, data, 512);
		show_printf("FileName = %s", filename);
	}
}
Beispiel #4
0
FILE* _wfopen(const wchar_t* filename, const wchar_t* mode)
{
	char	filenameA[1024];
	char	modeA[10];
	unicode2ascii(filename, filenameA, 1024);
	unicode2ascii(mode, modeA, 10);
	return fopen(filenameA, modeA);
}
Beispiel #5
0
void
ReadAirspace(AirspaceDatabase &airspace_database, RasterTerrain *terrain)
{
  TCHAR tpath[MAX_PATH];

  // TODO bug: add exception handler to protect parser code against chrashes
  // TODO bug: second file should be opened even if first was not okay

  // Read the airspace filenames from the registry
  GetRegistryString(szRegistryAirspaceFile, tpath, MAX_PATH);
  if (tpath[0] != 0) {
    ExpandLocalPath(tpath);

    char path[MAX_PATH];
    unicode2ascii(tpath, path, sizeof(path));

    if (!ReadAirspace(airspace_database, path))
      StartupStore(TEXT("No airspace file 1\n"));
  } else {
    // TODO feature: airspace in xcm files should be a feature
    /*
    static TCHAR  szMapFile[MAX_PATH] = TEXT("\0");
    GetRegistryString(szRegistryMapFile, szMapFile, MAX_PATH);
    ExpandLocalPath(szMapFile);
    wcscat(szMapFile,TEXT("/"));
    wcscat(szMapFile,TEXT("airspace.txt"));
    unicode2ascii(szMapFile, zfilename, MAX_PATH);
    fp  = zzip_fopen(zfilename, "rt");
    */
  }

  GetRegistryString(szRegistryAdditionalAirspaceFile, tpath, MAX_PATH);
  if (tpath[0] != 0) {
    ExpandLocalPath(tpath);

    char path[MAX_PATH];
    unicode2ascii(tpath, path, sizeof(path));

    if (!ReadAirspace(airspace_database, path))
      StartupStore(TEXT("No airspace file 2\n"));
  }

  // Calculate the airspace boundaries
  FindAirspaceAreaBounds(airspace_database);
  FindAirspaceCircleBounds(airspace_database);

  if (terrain != NULL) {
    terrain->Lock();
    airspace_database.UpdateAGL(*terrain);
    terrain->Unlock();
  }
}
Beispiel #6
0
char* ts_strdup_unicode_to_ascii(const unsigned short* str)
{
	char* result = (char*)malloc(wcslen((const wchar_t *)str)+1);
	if (result == NULL)
		return NULL;
	unicode2ascii((const wchar_t *)str, result);
	return result;
}
Beispiel #7
0
char* ts_strcat(char* dest, const unsigned short* src)
{
	char* p = dest;
	while (*p != '\0')
		p++;
	unicode2ascii((const wchar_t *)src, p);
	return dest;
}
Beispiel #8
0
/* ARGSUSED */
static void
output_trans2_querypath(int flags, uchar_t *data, char *xtra, int xsz)
{
	int length;
	char filename[256];

	if (flags & F_SUM) {
		length = snprintf(xtra, xsz, " QueryPathInfo");
		xtra += length;
		xsz -= length;
		data += 6;
		(void) unicode2ascii(filename, 256, data, 512);
		snprintf(xtra, xsz, " File=%s", filename);
	}

	if (flags & F_DTAIL) {
		show_line("FunctionName = QueryPathInfo");
		show_printf("InfoLevel = 0x%.4x", get2(data));
		data += 6;
		(void) unicode2ascii(filename, 256, data, 512);
		show_printf("FileName = %s", filename);
	}
}
Beispiel #9
0
bool
ReadWayPointZipFile(const TCHAR *path, WayPointList &way_points,
                    RasterTerrain &terrain)
{
  char path_ascii[MAX_PATH];
  ZZIP_FILE *fp;

  unicode2ascii(path, path_ascii, sizeof(path_ascii));
  fp = zzip_fopen(path_ascii, "rt");
  if (fp == NULL)
    return false;

  ReadWayPointFile(fp, path, way_points, terrain);
  zzip_fclose(fp);
  return true;
}
Beispiel #10
0
static BOOL wildcardFindFirst(const char* arg, HANDLE* findHandle, char** expandedArg)
{
	WIN32_FIND_DATA	findData;
	WCHAR			argW[1024];
	int				filenameLen;
	ascii2unicode(arg, argW, 1024);
	*findHandle = FindFirstFile(argW, &findData);
	if (*findHandle == (HANDLE)0xffffffff)
		return FALSE;
	filenameLen = wcslen(findData.cFileName);
	*expandedArg = (char*)malloc(filenameLen+1);
	if (*expandedArg == NULL)
		return FALSE;
	unicode2ascii(findData.cFileName, *expandedArg, filenameLen+1);
	return TRUE;
}
Beispiel #11
0
// ---------------------------------------------------------------------------
//	ExportToXML()
//	
// ---------------------------------------------------------------------------
void
O2Boards::
ExportToXML(string &out)
{
	wstring xml;
	xml += L"<?xml version=\"1.0\" encoding=\"";
	xml += _T(DEFAULT_XML_CHARSET);
	xml += L"\"?>" EOL;
	xml += L"<boards>" EOL;
	ExLock.Lock();
	{
		for (O2BoardExMapIt it = exmap.begin(); it != exmap.end(); it++) {
			xml_AddElement(xml, L"board", NULL, it->first.c_str());
		}
	}
	ExLock.Unlock();
	xml += L"</boards>" EOL;
	unicode2ascii(xml, out);
}
Beispiel #12
0
static BOOL wildcardFindNext(HANDLE findHandle, char** expandedArg)
{
	WIN32_FIND_DATA	findData;
	int				filenameLen;
	if (!FindNextFile(findHandle, &findData))
	{
		FindClose(findHandle);
		return FALSE;
	}
	filenameLen = wcslen(findData.cFileName);
	*expandedArg = (char*)malloc(filenameLen+1);
	if (*expandedArg == NULL)
	{
		FindClose(findHandle);
		return FALSE;
	}
	unicode2ascii(findData.cFileName, *expandedArg, filenameLen+1);
	return TRUE;
}
Beispiel #13
0
bool
ReadWayPointFile(const TCHAR *path, WayPointList &way_points,
                 RasterTerrain &terrain)
{
  char path_ascii[MAX_PATH];
  FILE *fp;

  unicode2ascii(path, path_ascii, sizeof(path_ascii));
  fp = fopen(path_ascii, "rt");
  if (fp == NULL)
    /* fall back to ReadWayPointZipFile() if the file was not found */
    return
#ifdef HAVE_POSIX
      errno == ENOTDIR &&
#endif
      ReadWayPointZipFile(path, way_points, terrain);

  ReadWayPointFile(fp, path, way_points, terrain);
  fclose(fp);
  return true;
}
Beispiel #14
0
// Init Live Tracker services, if available
void LiveTrackerInit()
{
    if (LiveTrackerInterval == 0) {
        // If livetracker is not enabled at startup, we do nothing,
        // but in this case LK must be restarted, if user enables it!
        StartupStore(TEXT(". LiveTracker disabled.%s"), NEWLINE);
        return;
    }
    //Init winsock if available
    if (InitWinsock()) {
        _ws_inited = true;
        _hNewDataEvent = CreateEvent(NULL, TRUE, FALSE, TEXT("livetrknewdata"));
        // Create a thread for sending data to the server
        if ((_hThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)&LiveTrackerThread, 0, 0, &_dwThreadID)) != NULL)
        {
            SetThreadPriority(_hThread, THREAD_PRIORITY_NORMAL);
            unicode2ascii(LiveTrackersrv_Config, _server_name, SERVERNAME_MAX);
            _server_name[SERVERNAME_MAX-1]=0;
            StartupStore(TEXT(". LiveTracker will use server %s if available.%s"), LiveTrackersrv_Config, NEWLINE);
            _inited = true;
        }
    }
    if (!_inited) StartupStore(TEXT(". LiveTracker init failed.%s"),NEWLINE);
}
Beispiel #15
0
void
TopWindow::set(LPCTSTR cls, LPCTSTR text,
                int left, int top, unsigned width, unsigned height)
{
#ifdef ENABLE_SDL
  int ret;

  ret = ::SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);
  if (ret != 0)
    fprintf(stderr, "SDL_Init() has failed\n");

  ret = ::TTF_Init();
  if (ret != 0)
    fprintf(stderr, "TTF_Init() has failed: %s\n", TTF_GetError());

  screen.set();
  ContainerWindow::set(NULL, 0, 0, width, height);

  char text2[512];
  unicode2ascii(text, text2);
  ::SDL_WM_SetCaption(text2, NULL);
#else /* !ENABLE_SDL */
  Window::set(NULL, cls, text, left, top, width, height,
              (DWORD)(WS_SYSMENU|WS_CLIPCHILDREN|WS_CLIPSIBLINGS));

#if defined(GNAV) && !defined(PCGNAV)
  // TODO code: release the handle?
  HANDLE hTmp = LoadIcon(XCSoarInterface::hInst,
                         MAKEINTRESOURCE(IDI_XCSOARSWIFT));
  SendMessage(hWnd, WM_SETICON,
	      (WPARAM)ICON_BIG, (LPARAM)hTmp);
  SendMessage(hWnd, WM_SETICON,
	      (WPARAM)ICON_SMALL, (LPARAM)hTmp);
#endif
#endif /* !ENABLE_SDL */
}
Beispiel #16
0
static void navigation_task(struct state_machine_context *state_m)
{
  static size_t item_updated;
  static uint16_t temp_cursor_pos;
  size_t i;

  // By default, the command executed is asynchronous.
  state_m->async_cmd = true;
  state_m->view = GUI_UPDATE_VIEW_NAVIGATION;

  switch (state_m->state)
  {
  // This state id the entry point of the navigation view.
  // It must be call on every access to this view.
  case STATE_NAVIGATION_ENTRY_POINT:
    state_m->view_elt = GUI_UPDATE_ELT_NAVIGATION_CURSOR;
    state_m->async_cmd = false;
    state_m->cmd_status = true;
    // Update file_list relatives info.
    state_m->list.file_pos = 0;
    state_m->list.nb_files = 0xFFFF;
    state_m->list.nb_valid_entries = 0;
    temp_cursor_pos = 0;
    state_m->cursor_pointer = 0;
    // Invalidate all the items on the list
    for (i=0; i<MAX_BUFFER_FILE; i++)
      state_m->list.list[i].updated = false;
    state_m->state = STATE_NAVIGATION_UPDATE_LIST;
    break;
  // Update the file list from the current directory.
  case STATE_NAVIGATION_UPDATE_LIST:
    // Re-center the file list.
    if (temp_cursor_pos < state_m->list.file_pos &&
        state_m->list.nb_valid_entries)
    {
      // Scroll-down the list
      memmove((void *) &state_m->list.list[1],
              (const void *) &state_m->list.list[0],
              sizeof(state_m->list.list[0])*(MAX_BUFFER_FILE - 1));
      // Every element of the list have to be updated
      for (i=1; i<MAX_BUFFER_FILE; i++)
        state_m->list.list[i].updated = true;
      // Get information of the file.
      item_updated = 0;
      state_m->list.file_pos--;
      state_m->list.nb_valid_entries--;
      ai_async_nav_file_goto(state_m->list.file_pos + item_updated);
      state_m->view_elt |= GUI_UPDATE_ELT_IN_PROGRESS;
      state_m->state = STATE_NAVIGATION_UPDATE_LIST_GET_NAME;
      break;
    }
    if (temp_cursor_pos > state_m->list.file_pos &&
        state_m->list.nb_valid_entries)
    {
      // Scroll-up the list
      memmove((void *) &state_m->list.list[0],
              (const void *) &state_m->list.list[1],
              sizeof(state_m->list.list[0])*(MAX_BUFFER_FILE - 1));
      // Every element of the list have to be updated
      for (i=0; i<MAX_BUFFER_FILE-1; i++)
        state_m->list.list[i].updated = true;
      // Get information of the file.
      item_updated = MAX_BUFFER_FILE - 1;
      state_m->list.file_pos++;
      state_m->list.nb_valid_entries--;
      ai_async_nav_file_goto(state_m->list.file_pos + item_updated);
      state_m->view_elt |= GUI_UPDATE_ELT_IN_PROGRESS;
      state_m->state = STATE_NAVIGATION_UPDATE_LIST_GET_NAME;
      break;
    }
    // There is nothing to update
    state_m->async_cmd = false;
    state_m->view_elt |= GUI_UPDATE_ELT_IN_PROGRESS;
    state_m->state = STATE_NAVIGATION_WAIT_FOR_EVENT;
    break;
  // Read the file name of the file selected.
  case STATE_NAVIGATION_UPDATE_LIST_GET_NAME:
    // The case when there is no more files...
    if (state_m->cmd_status == false)
    {
      state_m->list.nb_files = state_m->list.file_pos + item_updated;
      // If no files/folders are found in the current directory...
      if (!state_m->list.nb_files)
        state_m->view_elt |= GUI_UPDATE_ELT_NAVIGATION_NO_FILES;
      state_m->cmd_status = true;
      state_m->async_cmd = false;
      navigation_update_view(state_m);
      state_m->state = STATE_NAVIGATION_WAIT_FOR_EVENT;
      break;
    }
    ai_async_nav_file_name();
    state_m->view_elt |= GUI_UPDATE_ELT_IN_PROGRESS;
    state_m->state = STATE_NAVIGATION_UPDATE_LIST_STORE_NAME;
    break;
  // Store the file name of the selected file.
  case STATE_NAVIGATION_UPDATE_LIST_STORE_NAME:
    unicode2ascii((char *) state_m->list.list[item_updated].file_name,
                  (const char *) ai_async_cmd_out_PtrArrayU8(),
                  Min(ai_async_cmd_out_SizeArrayU8(), STR_MAX_LENGTH*2));
    ai_async_nav_file_isdir();
    state_m->view_elt |= GUI_UPDATE_ELT_IN_PROGRESS;
    state_m->state = STATE_NAVIGATION_UPDATE_ISDIR;
    break;
  // Check if the selected file is a directory or not.
  case STATE_NAVIGATION_UPDATE_ISDIR:
    state_m->list.list[item_updated].type = (ai_async_cmd_out_u32())?FILE_TYPE_DIRECTORY:FILE_TYPE_FILE;
    state_m->list.list[item_updated].updated = true;
    state_m->list.nb_valid_entries++;
    navigation_update_view(state_m);
    state_m->async_cmd = false;
    state_m->view_elt |= GUI_UPDATE_ELT_IN_PROGRESS;
    state_m->state = STATE_NAVIGATION_UPDATE_LIST;
    break;
  // This state is the "idle" state of this view.
  case STATE_NAVIGATION_WAIT_FOR_EVENT:
    // Catch new track event
    state_m->cmd_status = true;
    if (state_m->player_status.flags.new_file_played)
    {
      state_m->async_cmd = false;
      state_m->player_status.flags.new_file_played = 0;
      state_m->recorded_state = STATE_NAVIGATION_WAIT_FOR_EVENT;
      state_m->state = STATE_TRACK_CHANGED_ENTRY_POINT;
      break;
    }
    // Switch to playback view
    else if (controller_switch_to_playback_view(GUI_UPDATE_VIEW_NAVIGATION))
    {
      controller_clear();
      state_m->async_cmd = false;
      state_m->state = STATE_PLAYBACK_ENTRY_POINT;
      break;
    }
    // Switch to configuration view
    else if (controller_switch_to_config_view(GUI_UPDATE_VIEW_NAVIGATION))
    {
      controller_clear();
      state_m->async_cmd = false;
      state_m->state = STATE_CONFIG_ENTRY_POINT;
      break;
    }
    // Go up in the file list.
    else if (controller_navigation_cursor_previous() &&
             temp_cursor_pos)
    {
      state_m->async_cmd = false;
      temp_cursor_pos--;
      state_m->state = STATE_NAVIGATION_UPDATE_LIST;
      break;
    }
    // Go down in the file list.
    else if (controller_navigation_cursor_next() &&
             (temp_cursor_pos + 1 < state_m->list.file_pos + state_m->list.nb_valid_entries))
    {
      state_m->async_cmd = false;
      temp_cursor_pos++;
      state_m->state = STATE_NAVIGATION_UPDATE_LIST;
      break;
    }
    // Enter directory of play the file.
    else if (controller_navigation_change_directory())
    {
      if (navigation_get_current_file_type(state_m) == FILE_TYPE_FILE)
      {
        ai_async_nav_file_goto(temp_cursor_pos);
        state_m->state = STATE_NAVIGATION_PLAY_SELECTED_FILE;
        break;
      }
      else
      {
        ai_async_nav_file_goto(temp_cursor_pos);
        state_m->state = STATE_NAVIGATION_CD;
        break;
      }
    }
    // Go to parent directory.
    else if (controller_navigation_go_to_parent_directory())
    {
      ai_async_nav_file_goto(temp_cursor_pos);
      state_m->state = STATE_NAVIGATION_GOTOPARENT;
      break;
    }
    // Play the file or the directory.
    else if (controller_navigation_play())
    {
      ai_async_nav_file_goto(temp_cursor_pos);
      state_m->state = STATE_NAVIGATION_PLAY_SELECTED_FILE;
      break;
    }
    // Fill the file list with valid data.
    else if (state_m->list.nb_valid_entries < MAX_BUFFER_FILE &&
             state_m->list.file_pos + state_m->list.nb_valid_entries < state_m->list.nb_files)
    {
      item_updated = state_m->list.nb_valid_entries;
      ai_async_nav_file_goto(state_m->list.file_pos + state_m->list.nb_valid_entries);
      state_m->view_elt |= GUI_UPDATE_ELT_IN_PROGRESS;
      state_m->state = STATE_NAVIGATION_UPDATE_LIST_GET_NAME;
      break;
    }
    state_m->async_cmd = false;
    state_m->state = STATE_CHECK_DEVICE_ENTRY_POINT;
    state_m->recorded_state = STATE_NAVIGATION_WAIT_FOR_EVENT;
    break;
  // Enter directory.
  case STATE_NAVIGATION_CD:
    ai_async_nav_dir_cd();
    state_m->state = STATE_NAVIGATION_ENTRY_POINT;
    break;
  // Go to parent directory.
  case STATE_NAVIGATION_GOTOPARENT:
    state_m->cmd_status = true;
    ai_async_nav_dir_gotoparent();
    state_m->state = STATE_NAVIGATION_GOTOPARENT_ERROR_HANDLING;
    break;
  // This state handle a gotoparent error.
  case STATE_NAVIGATION_GOTOPARENT_ERROR_HANDLING:
    state_m->async_cmd = false;
    if (state_m->cmd_status == false)
      state_m->state = STATE_NAVIGATION_WAIT_FOR_EVENT;
    else
      state_m->state = STATE_NAVIGATION_ENTRY_POINT;
    state_m->cmd_status = true;
    break;
  // This states play the file selected by the cursor.
  case STATE_NAVIGATION_PLAY_SELECTED_FILE:
    if (state_m->cmd_status)
      ai_async_audio_nav_playfile();
    else
    {
      state_m->cmd_status = true;
      state_m->async_cmd = false;
      state_m->state = STATE_NAVIGATION_ENTRY_POINT;
      break;
    }
    state_m->state = STATE_NAVIGATION_WAIT_FOR_SELECTION;
    break;
  // This states makes sure the file has been selected
  case STATE_NAVIGATION_WAIT_FOR_SELECTION:
    // If we were not able to play the selected song, then play any song
    if (!state_m->cmd_status)
    {
      state_m->cmd_status = true;
      state_m->state = STATE_COMMAND_PLAY_ANY_SONG;
    }
    else
    state_m->state = STATE_CHECK_DEVICE_ENTRY_POINT;
    state_m->recorded_state = STATE_NAVIGATION_UPDATE_METADATA_AND_PLAY;
    state_m->async_cmd = false;
    break;
  // This state update the status of the audio player.
  case STATE_NAVIGATION_UPDATE_METADATA_AND_PLAY:
    state_m->async_cmd = false;
    state_m->player_status.flags.new_file_played = 0;
    state_m->recorded_state = STATE_PLAYBACK_ENTRY_POINT;
    state_m->state = STATE_TRACK_CHANGED_ENTRY_POINT;
    break;

  default:
    return;
  }

  // Error management.
  if (state_m->cmd_status == false)
    state_m->state = STATE_NAVIGATION_WAIT_FOR_EVENT;
}
Beispiel #17
0
/* ARGSUSED */
static void
interpret_negprot(int flags, uchar_t *data, int len, char *xtra, int xsz)
{
	int i, last, length;
	int bytecount;
	int key_len;
	int wordcount;
	char tbuf[256];
	struct smb *smbdata;
	uchar_t *protodata;
	uchar_t *byte0;
	uint64_t nttime;
	uint32_t caps;
	ushort_t smb_flags2;

	smbdata  = (struct smb *)data;
	smb_flags2 = get2(smbdata->flags2);
	protodata = (uchar_t *)data + sizeof (struct smb);
	wordcount = *protodata++;

	if ((smbdata->flags & SERVER_RESPONSE) == 0) {
		/*
		 * request packet:
		 * short bytecount;
		 * struct { char fmt; char name[]; } dialects
		 */
		bytecount = get2(protodata);
		protodata += 2;
		byte0 = protodata;

		if (flags & F_DTAIL)
			show_printf("ByteCount = %d", bytecount);
		if (bytecount > len)
			bytecount = len;

		/* Walk the list of dialects. */
		i = last = 0;
		tbuf[0] = '\0';
		while (protodata < (byte0 + bytecount - 2)) {
			if (*protodata++ != 2)	/* format code */
				break;
			length = strlcpy(tbuf, (char *)protodata,
			    sizeof (tbuf));
			protodata += (length + 1);
			if (flags & F_DTAIL) {
				show_printf("Dialect[%d] = %s",
				    i, tbuf);
			}
			last = i++;
		}
		if (flags & F_SUM) {
			/*
			 * Just print the last dialect, which is
			 * normally the interesting one.
			 */
			snprintf(xtra, xsz, " Dialect[%d]=%s", last, tbuf);
		}
	} else {
		/* Parse reply */
		if (flags & F_SUM) {
			snprintf(xtra, xsz, " Dialect#=%d", protodata[0]);
		}
		if ((flags & F_DTAIL) == 0)
			return;
		if (wordcount < 13)
			return;
		show_printf("WordCount = %d", wordcount);
		show_printf("Dialect Index = %d", protodata[0]);
		protodata += 2;
		show_printf("Security Mode = 0x%x", protodata[0]);
		protodata++;
		show_printf("MaxMPXRequests = %d", get2(protodata));
		protodata += 2;
		show_printf("MaxVCs = %d", get2(protodata));
		protodata += 2;
		show_printf("MaxBufferSize = %d", get4(protodata));
		protodata += 4;
		show_printf("MaxRawBuffer = %d", get4(protodata));
		protodata += 4;
		show_printf("SessionKey = 0x%.8x", get4(protodata));
		protodata += 4;

		caps = get4(protodata);
		protodata += 4;
		show_printf("Capabilities = 0x%.8x", caps);

		/* Server Time */
		nttime = get8(protodata);
		protodata += 8;
		show_printf("Server Time = %s", format_nttime(nttime));

		show_printf("Server TZ = %d", get2(protodata));
		protodata += 2;

		key_len = *protodata++;
		show_printf("KeyLength = %d", key_len);
		bytecount = get2(protodata);
		protodata += 2;
		show_printf("ByteCount = %d", bytecount);

		if (smb_flags2 & FLAGS2_EXT_SEC) {
			show_printf("Server GUID (16)");
			output_bytes(protodata, 16);
			protodata += 16;
			show_printf("Security Blob (SPNEGO)");
			output_bytes(protodata, bytecount - 16);
		} else {
			show_printf("NTLM Challenge: (%d)", key_len);
			output_bytes(protodata, key_len);
			protodata += key_len;
			/*
			 * Get Unicode from capabilities here,
			 * as flags2 typically doesn't have it.
			 * Also, this one is NOT aligned!
			 */
			tbuf[0] = '\0';
			if (caps & 4) {
				(void) unicode2ascii(tbuf, sizeof (tbuf),
				    protodata, 2 * sizeof (tbuf));
			} else {
				(void) strlcpy(tbuf, (char *)protodata,
				    sizeof (tbuf));
			}
			show_printf("Server Domain = %s", tbuf);
		}
	}
}
Beispiel #18
0
void
O2Profile_SAX2Handler::
endElement(const XMLCh* const uri
		 , const XMLCh* const localname
		 , const XMLCh* const qname)
{
	switch (CurElm) {
		case PROF_XMLELM_ID:
			Profile->ID.assign(buf.c_str(), buf.size());
			break;
		case PROF_XMLELM_PRIVKEY:
			Profile->PrivKey.assign(buf.c_str(), buf.size());
			break;
		case PROF_XMLELM_PUBKEY:
			Profile->PubKey.assign(buf.c_str(), buf.size());
			break;
		case PROF_XMLELM_IP:
			Profile->IP = e2ip(buf.c_str(), buf.size());
			break;
		case PROF_XMLELM_P2PPORT:
			Profile->P2PPort = (ushort)wcstoul(buf.c_str(), NULL, 10);
			break;
		case PROF_XMLELM_PROXYPORT:
			Profile->ProxyPort = (ushort)wcstoul(buf.c_str(), NULL, 10);
			break;
		case PROF_XMLELM_ADMINPORT:
			Profile->AdminPort = (ushort)wcstoul(buf.c_str(), NULL, 10);
			break;
		case PROF_XMLELM_NAME:
			if (buf.size() <= O2_MAX_NAME_LEN) {
				Profile->SetNodeName(buf.c_str());
			}
			break;
		case PROF_XMLELM_COMMENT:
			if (buf.size() <= O2_MAX_COMMENT_LEN) {
				for (size_t i = 0; i < buf.size(); i++) {
					if (buf[i] == L'\n')
						Profile->Comment += L"\r\n";
					else
						Profile->Comment += buf[i];
				}
			}
			break;
		case PROF_XMLELM_DBDIR:
			Profile->SetDBDir(buf.c_str());
			break;
		case PROF_XMLELM_CACHEROOT:
			Profile->SetCacheRoot(buf.c_str());
			break;
		case PROF_XMLELM_ADMINROOT:
			Profile->SetAdminRoot(buf.c_str());
			break;
		case PROF_XMLELM_ADMIN_BROWSER_TYPE:
			Profile->AdminBrowserType = buf;
			break;
		case PROF_XMLELM_ADMIN_BROWSER_PATH:
			Profile->AdminBrowserPath = buf;
			break;
		case PROF_XMLELM_UPNP_ADAPTERNAME:
			unicode2ascii(buf, Profile->UPnPAdapterName);
			break;
		case PROF_XMLELM_UPNP_LOCATION:
			unicode2ascii(buf, Profile->UPnPLocation);
			break;
		case PROF_XMLELM_UPNP_SERVICEID:
			unicode2ascii(buf, Profile->UPnPServiceId);
			break;

		case PROF_XMLELM_LIMIT:
			if (plimit)
				*plimit = wcstoul(buf.c_str(), NULL, 10);
			break;
		case PROF_XMLELM_SIZE_T:
			if (puint64)
				*puint64 = _wcstoui64(buf.c_str(), NULL, 10);
			break;
		case PROF_XMLELM_BOOL:
			*pbool = buf[0] == '1' ? true : false;
			break;
	}

	buf = L"";

	CurElm = PROF_XMLELM_NONE;
	if (!MATCHLNAME(L"profile"))
		return;

	if (Profile->PrivKey.size() != RSA_PRIVKEY_SIZE
			|| Profile->PubKey.size() != RSA_PUBKEY_SIZE) {
		Profile->SetRSAKey(NULL, 0, NULL, 0);
	}
}
Beispiel #19
0
static bool SendStartOfTrackPacket(unsigned int *packet_id, unsigned int *session_id, int userid)
{
    char username[128];
    char password[128];
    char txbuf[500];
    char rxbuf[32];
    int rxlen;
    char phone[64];
    char gps[64];
    unsigned int vehicle_type = 8;
    char vehicle_name[64];
    int rnd;
    TCHAR wgps[254];

    if (1) {
        CCriticalSection::CGuard guard(_t_mutex);
        // START OF TRACK PACKET
        // /track.php?leolive=2&sid=42664778&pid=1&client=YourProgramName&v=1&user=yourusername&pass=yourpass&phone=Nokia 2600c&gps=BT GPS&trk1=4&vtype=16388&vname=vehicle name and model
        // PARAMETERS
        // leolive=2  // 2 means this is the start of track packet
        // sid=42664778 // the session ID , see below on sessionID section for more information
        // pid=1 // the packet numner of this packet, we start with 1 and increase with each packet send either start/end or with GPS data.
        // client=YourClientName// fixed value use only alphanumerics no spaces, first Letter of words in capitals
        // user=yourusername // there is no need to have a registered user, the user can input his preferred username on the fly, he will be displayed in black instead of blue if not registered.
        // pass=yourpass
        // v=1 // version of your program you can use free text like 1.4.5
        // trk1=4 // the interval in secs that we will be sending gps points
        // phone=Nokia 2600c // the phone model as it is acquired from a system  call
        // &gps=BT GPS // the GPS name , use the string Internal GPS for phones with integrated GPS
        // vname // the brand + name of the vehicle/glider ie Gradient Golden 2 26
        //
        // Values for vtype
        // 1=>"Paraglider"
        // 8=>"Glider"
        // 64=>"Powered flight"
        // 17100=>"Car"
        if (_tcslen(LiveTrackerusr_Config)>0 ) {
            unicode2ascii(LiveTrackerusr_Config, txbuf, sizeof(txbuf));
        } else {
            strncpy(txbuf, "guest", sizeof(txbuf));
        }
        UrlEncode(txbuf, username, sizeof(username));
        if (_tcslen(LiveTrackerpwd_Config)>0 ) {
            unicode2ascii(LiveTrackerpwd_Config, txbuf, sizeof(txbuf));
        } else {
            strncpy(txbuf, "guest", sizeof(txbuf));
        }
        UrlEncode(txbuf, password, sizeof(password));
#ifdef PNA
        unicode2ascii(GlobalModelName, txbuf, sizeof(txbuf));
        UrlEncode(txbuf, phone, sizeof(phone));
#else
#if (WINDOWSPC>0)
        UrlEncode("PC", phone, sizeof(phone));
#else
        UrlEncode("PDA", phone, sizeof(phone));
#endif
#endif
        if (SIMMODE) UrlEncode("SIMULATED", gps, sizeof(gps));
        else {
            GetBaroDeviceName(_t_barodevice, wgps);
            unicode2ascii(wgps, txbuf, sizeof(txbuf));
            UrlEncode(txbuf, gps, sizeof(gps));
        }

        unicode2ascii(AircraftType_Config, txbuf, sizeof(txbuf));
        UrlEncode(txbuf, vehicle_name, sizeof(vehicle_name));
        vehicle_type = 8;
        if (AircraftCategory == umParaglider) vehicle_type = 1;
        if (AircraftCategory == umCar) vehicle_type = 17100;
        if (AircraftCategory == umGAaircraft) vehicle_type = 64;

        *packet_id = 1;
        rnd = rand();
        *session_id = ( (rnd<<24) &  0x7F000000 ) | ( userid & 0x00ffffff) | 0x80000000;

        sprintf(txbuf,"GET /track.php?leolive=2&sid=%u&pid=1&client=%s&v=%s%s&user=%s&pass=%s&phone=%s&gps=%s&trk1=%u&vtype=%u&vname=%s HTTP/1.0\r\nHost: %s\r\n\r\n",
                *session_id,
                LKFORK,LKVERSION,LKRELEASE,
                username, password,
                phone, gps,
                LiveTrackerInterval,
                vehicle_type,
                vehicle_name,
                _server_name);
    }

    rxlen = DoTransactionToServer(txbuf, strlen(txbuf), rxbuf, sizeof(rxbuf));
    if (rxlen==2 && rxbuf[0]=='O' && rxbuf[1]=='K') {
        (*packet_id)++;
        return true;
    }
    return false;
}
Beispiel #20
0
bool
O2IPFilter::
add(bool enable, uint flag, const wchar_t *cond, bool do_add)
{
	O2IPFilterRecord filter;

	if (flag != O2_ALLOW && flag != O2_DENY)
		return false;
	filter.enable = enable;
	filter.flag = flag;
	filter.cond = cond;

	string condstr;
	unicode2ascii(cond, wcslen(cond), condstr);

	size_t pos = condstr.find_first_not_of("0123456789./");
	if (!FOUND(pos)) {
		string ip;
		string mask;
		pos = condstr.find('/');
		if (FOUND(pos)) {
			ip = condstr.substr(0, pos);
			mask = condstr.substr(pos+1);
		}
		else
			ip = condstr;

		strarray iptoken;
		if (split(ip.c_str(), ".", iptoken) == 0)
			return false;
		switch (iptoken.size()) {
			case 1:
				ip += ".0.0.0";
				filter.ip = inet_addr(ip.c_str());
				filter.mask = inet_addr("255.0.0.0");
				break;
			case 2:
				ip += ".0.0";
				filter.ip = inet_addr(ip.c_str());
				filter.mask = inet_addr("255.255.0.0");
				break;
			case 3:
				ip += ".0";
				filter.ip = inet_addr(ip.c_str());
				filter.mask = inet_addr("255.255.255.0");
				break;
			case 4:
				filter.ip = inet_addr(ip.c_str());
				filter.mask = inet_addr("255.255.255.255");
				break;
		}
		if (filter.ip == INADDR_NONE)
			return false;

		if (!mask.empty()) {
			if (!FOUND(mask.find('.'))) {
				int bitnum = atoi(mask.c_str());
				if (bitnum > 32)
					return false;
				ulong m = 0;
				for (int i = 0; i < bitnum; i++)
					m |= (1<<(31-i));
				filter.mask = htonl(m);
					
			}
			else {
				if (mask == "255.255.255.255")
					filter.mask = 0xffffffff;
				else {
					filter.mask = inet_addr(mask.c_str());
					if (filter.mask == INADDR_NONE)
						return false;
				}
			}
		}
	}
	else {
		boost::wregex::flag_type f = boost::regex_constants::normal
									| boost::regex_constants::icase;
		boost::wregex regex(L"^[a-z0-9][a-z0-9.-]+[a-z0-9]$", f);
		if (!boost::regex_search(cond, regex))
			return false;
		filter.host = L".";
		filter.host += cond;
	}

	if (do_add) {
		Lock();
		records.push_back(filter);
		Unlock();
	}

	/*
	wchar_t abc[256];
	wstring is, ms;
	ulong2ipstr(filter.ip, is);
	ulong2ipstr(filter.mask, ms);
	swprintf(abc, L"IP:%s MASK:%s HOST:%s", is.c_str(), ms.c_str(), filter.host.c_str());
	MessageBoxW(NULL,abc,NULL,MB_OK);
	*/

	return true;
}
Beispiel #21
0
// if childData is NULL, the size will be returned in childDataLen
bool ChildData::decode(void* childData)//, int childDataSize)
{
	bool	result = false;
	int		strLen;

	if (childData == NULL)// || childDataSize < sizeof(DWORD))
		return false;

	char* p = (char*)childData;

	// total size
	DWORD size;
	memcpy(&size, p, sizeof(DWORD));
	p += sizeof(DWORD);
//	// check that size encoded in buffer isn't bigger that passed-in size
//	if (size > childDataSize)
//		return false;
	size -= sizeof(DWORD);

	// reserved (ignore)
	p += sizeof(DWORD);
	size -= sizeof(DWORD);

	// get current directory
	strLen = ts_strlen((WCHAR*)p);
	if ((strLen+1)*2 > (int)size)
		goto cleanup;
	if (strLen == 0)
		resetCurrentDirectory();
	else
	{
#ifdef UNICODE
		setCurrentDirectory((WCHAR*)p);
#else
		char buf[256];
		unicode2ascii((WCHAR*)p, buf);
		setCurrentDirectory(buf);
#endif
	}
	p += (strLen + 1) * 2;
	size -= (strLen + 1)*2;

	// num redirs
	memcpy(&numRedirArgs, p, sizeof(DWORD));
	p += sizeof(DWORD);
	size -= sizeof(DWORD);

	// allocate redirs array
	if (redirArgs != NULL)
		free(redirArgs);
	redirArgs = (RedirArg*)malloc(sizeof(RedirArg)*numRedirArgs);
	if (redirArgs == NULL)
		goto cleanup;

	// redirs
	{
	for (int i=0; i<numRedirArgs; i++)
	{
		// flags
		DWORD flags;
		memcpy(&flags, p, sizeof(DWORD));
		p += sizeof(DWORD);
		size -= sizeof(DWORD);
		switch (flags&0x00000003)
		{
			case 0:
				redirArgs[i].redirType = RT_PIPE_UNSPEC;
				break;
			case 1:
				redirArgs[i].redirType = RT_FILE;
				break;
			case 2:
				redirArgs[i].redirType = RT_HANDLE;
				break;
		}
		bool filenamePresent = false;
		if (flags & 0x00000004)
			filenamePresent = true;
		redirArgs[i].append			= ((flags & 0x00000008) != 0);
		redirArgs[i].openForRead	= ((flags & 0x00000010) != 0);
		redirArgs[i].openForWrite	= ((flags & 0x00000020) != 0);
		// fd
		memcpy(&redirArgs[i].fd, p, sizeof(DWORD));
		p += sizeof(DWORD);
		size -= sizeof(DWORD);
		// fd2
		memcpy(&redirArgs[i].fd2, p, sizeof(DWORD));
		p += sizeof(DWORD);
		size -= sizeof(DWORD);
		// pipe/file name
		if (filenamePresent)
		{
			int strLen = ts_strlen((WCHAR*)p);
			if ((strLen+1)*2 > (int)size)
				goto cleanup;
			redirArgs[i].filename = _tcsdup((WCHAR*)p);
			p += (strLen + 1)*2;
			size -= (strLen + 1)*2;
		}
		else
			redirArgs[i].filename = NULL;
	}
	}

	// get environment
	if (size <= 0)
		return false;
	p += sizeof(DWORD);	// skip env size
	resetEnvironment();
	addEnvironmentList((WCHAR*)p);

	// success
	result = true;

cleanup:

	return result;
}
Beispiel #22
0
// generate argc/argv from program name and lpCmdLine
// returns 0 on failure, or argc on success
int processCmdLine(LPTSTR lpCmdLine, char*** pArgv)
{
	BOOL		success = FALSE;
	int			argc = 0;
	char**		argv = NULL;
	TCHAR		programName[1024];
	const int	maxArgChars = 1024;
	TCHAR		argW[maxArgChars];
	char		arg[maxArgChars];
	ArgType		argType;

	// get program name
	if (GetModuleFileName(NULL, programName, 1024) <= 0)
		goto cleanup;
	programName[1023] = 0;	// make sure it's terminated when result is truncated

	// add program name to args
	argc++;
	argv = (char**)realloc(argv, argc*sizeof(char*));
	if (argv == NULL)
		goto cleanup;
	argv[argc-1] = (char*)malloc((wcslen(programName)+1)*2);
	if (argv[argc-1] == NULL)
		goto cleanup;
	unicode2ascii(programName, argv[argc-1], wcslen(programName)+1);

	while ((argType = getCmdLineArg(&lpCmdLine, argW, maxArgChars, NULL, NULL)) > 0)
	{
		ts_strcpy(arg, argW);	// convert to unicode (if we're in unicode)
		if (argType == TOK_STRING)
		{
			HANDLE	findHandle;
			char*	expandedArg;
			if ((strchr(arg,'*')==NULL && strchr(arg,'?')==NULL) || !wildcardFindFirst(arg, &findHandle, &expandedArg))
			{	// not a wildcard, or is but doesn't match anything, so just add arg to argv
				argc++;
				argv = (char**)realloc(argv, argc*sizeof(char*));
				if (argv == NULL)
					goto cleanup;
				argv[argc-1] = (char*)malloc(strlen(arg)+1);
				if (argv[argc-1] == NULL)
					goto cleanup;
				strcpy(argv[argc-1], arg);
			}
			else
			{	// handle wildcards
				int		firstExpandedArgIndex = argc;
				int		lastExpandedArgIndex = argc;
				int		numPathCharsToCopyFromArg = 0;
				char*	lastSlash = max(strrchr(arg,'\\'), strrchr(arg,'/'));
				if (lastSlash != NULL)
					numPathCharsToCopyFromArg = lastSlash - arg + 1;
				do
				{
					argc++;
					argv = (char**)realloc(argv, argc*sizeof(char*));
					if (argv == NULL)
					{
						free(expandedArg);
						goto cleanup;
					}
					if (numPathCharsToCopyFromArg == 0)
						argv[argc-1] = expandedArg;
					else
					{
						argv[argc-1] = (char*)malloc(numPathCharsToCopyFromArg + strlen(expandedArg) + 1);
						if (argv[argc-1] == NULL)
							goto cleanup;
						strncpy(argv[argc-1], arg, numPathCharsToCopyFromArg);
						strcpy(argv[argc-1]+numPathCharsToCopyFromArg, expandedArg);
					}
					lastExpandedArgIndex = argc-1;
				} while (wildcardFindNext(findHandle, &expandedArg));
				qsort(&argv[firstExpandedArgIndex], lastExpandedArgIndex-firstExpandedArgIndex+1, sizeof(char*), qsort_stricmp);
			}
		}
	}

	// success
	success = TRUE;

cleanup:

	if (!success)
	{
		if (argv != NULL)
		{
			int	i;
			for (i=0; i<argc; i++)
				free(argv[i]);
			free(argv);
		}
		argc = 0;
	}
	else
		*pArgv = argv;

	return argc;
}
Beispiel #23
0
static void track_changed_task(struct state_machine_context *state_m)
{
  // By default, the command executed is asynchronous.
  state_m->async_cmd = true;
  Ai_player_flag_t player_flag_temp;

  switch (state_m->state)
  {
  case STATE_TRACK_CHANGED_ENTRY_POINT:
    memset(&state_m->info, 0, sizeof(struct file_info));
    ai_async_audio_nav_file_info_duration();
    state_m->state = STATE_TRACK_CHANGED_TOTAL_TIME;
    break;
  // Record total time info and call file name.
  case STATE_TRACK_CHANGED_TOTAL_TIME:
    state_m->info.total_time = ai_async_cmd_out_u32();
    ai_async_audio_nav_getname();
    state_m->state = STATE_TRACK_CHANGED_FILE_NAME;
    break;
  // Record file name information and call for artist metadata.
  case STATE_TRACK_CHANGED_FILE_NAME:
    unicode2ascii((char *) state_m->info.name,
                  (const char *) ai_async_cmd_out_PtrArrayU8(),
                  Min(ai_async_cmd_out_SizeArrayU8(), STR_MAX_LENGTH*2));
    ai_async_audio_nav_file_info_artist();
    state_m->state = STATE_TRACK_CHANGED_ARTIST;
    break;
  // Record artist metadata and call title metadata.
  case STATE_TRACK_CHANGED_ARTIST:
    unicode2ascii((char *) state_m->info.artist,
                  (const char *) ai_async_cmd_out_PtrArrayU8(),
                  Min(ai_async_cmd_out_SizeArrayU8(), STR_MAX_LENGTH*2));
    ai_async_audio_nav_file_info_title();
    state_m->state = STATE_TRACK_CHANGED_TITLE;
    break;
  // Record title metadata.
  case STATE_TRACK_CHANGED_TITLE:
    unicode2ascii((char *) state_m->info.title,
                  (const char *) ai_async_cmd_out_PtrArrayU8(),
                  Min(ai_async_cmd_out_SizeArrayU8(), STR_MAX_LENGTH*2));
#if defined(SUPPORT_EMBEDDED_COVER_ARTS) && SUPPORT_EMBEDDED_COVER_ARTS == true
    state_m->info.size.width = 100;
    state_m->info.size.height = 100;
    ai_async_audio_nav_file_info_image(&state_m->info.size);
    state_m->state = STATE_TRACK_CHANGED_IMAGE;
#else
    ai_async_audio_ctrl_status();
    state_m->state = STATE_TRACK_CHECK_RESUME;
#endif
    break;
  // Record image data.
  case STATE_TRACK_CHANGED_IMAGE:
    state_m->info.image_data = (void *) ai_async_cmd_out_u32();
    ai_async_audio_ctrl_status();
    state_m->state = STATE_TRACK_CHECK_RESUME;
    break;
  // Resume the track
  case STATE_TRACK_CHANGED_RESUME:
    state_m->async_cmd = false;
    state_m->state = state_m->recorded_state;
    break;
    // Check if the device is in pause before sending a ai_async_audio_ctrl_resume()
    // command.
  case STATE_TRACK_CHECK_RESUME:
    player_flag_temp.all = ai_async_cmd_out_u32();
    if (player_flag_temp.status == PLAYER_FLAG_PAUSE)
      ai_async_audio_ctrl_resume();
    state_m->state = STATE_TRACK_CHANGED_RESUME;
    break;
  default:
    return;
  }

  // Error management
  if (state_m->cmd_status == false)
    state_m->state = STATE_DEVICE_DISCONNECTED;
}
Beispiel #24
0
void TopologyStore::Open() {
  StartupStore(TEXT("OpenTopology\n"));
  XCSoarInterface::CreateProgressDialog(gettext(TEXT("Loading Topology File...")));
  Poco::ScopedRWLock protect(lock, true);

  // Start off by getting the names and paths
  static TCHAR  szOrigFile[MAX_PATH] = TEXT("\0");
  static TCHAR  szFile[MAX_PATH] = TEXT("\0");
  static  TCHAR Directory[MAX_PATH] = TEXT("\0");

  for (int z=0; z<MAXTOPOLOGY; z++) {
    topology_store[z] = 0;
  }

  GetRegistryString(szRegistryTopologyFile, szFile, MAX_PATH);
  ExpandLocalPath(szFile);
  _tcscpy(szOrigFile,szFile); // make copy of original
  ContractLocalPath(szOrigFile);

  // remove it in case it causes a crash (will restore later)
  SetRegistryString(szRegistryTopologyFile, TEXT("\0"));

  if (_tcslen(szFile)==0) {

    // file is blank, so look for it in a map file
    static TCHAR  szMapFile[MAX_PATH] = TEXT("\0");
    GetRegistryString(szRegistryMapFile, szMapFile, MAX_PATH);
    if (_tcslen(szMapFile)==0) {
      return;
    }
    ExpandLocalPath(szMapFile);

    // Look for the file within the map zip file...
    _tcscpy(Directory,szMapFile);
    _tcscat(Directory,TEXT("/"));
    szFile[0]=0;
    _tcscat(szFile,Directory);
    _tcscat(szFile,TEXT("topology.tpl"));

  } else {
    ExtractDirectory(Directory,szFile);
  }

  // Ready to open the file now..

  static ZZIP_FILE* zFile;
  char zfilename[MAX_PATH];
  unicode2ascii(szFile, zfilename, MAX_PATH);
  zFile = zzip_fopen(zfilename, "rt");
  if (!zFile) {
    StartupStore(TEXT("No topology file\n%s\n"), szFile);
    return;
  }

  TCHAR ctemp[80];
  TCHAR TempString[READLINE_LENGTH+1];
  TCHAR ShapeName[50];
  double ShapeRange;
  long ShapeIcon;
  long ShapeField;
  TCHAR wShapeFilename[MAX_PATH];
  TCHAR *Stop;
  int numtopo = 0;
  char ShapeFilename[MAX_PATH];

  while(ReadString(zFile,READLINE_LENGTH,TempString)) {

    if((_tcslen(TempString) > 0)
       && (_tcsstr(TempString,TEXT("*")) != TempString)) // Look For Comment
      {

        BYTE red, green, blue;
        // filename,range,icon,field

        // File name
        PExtractParameter(TempString, ctemp, 0);
        _tcscpy(ShapeName, ctemp);

        _tcscpy(wShapeFilename, Directory);

        _tcscat(wShapeFilename,ShapeName);
        _tcscat(wShapeFilename,TEXT(".shp"));

#ifdef _UNICODE
        WideCharToMultiByte( CP_ACP, 0, wShapeFilename,
                             _tcslen(wShapeFilename)+1,
                             ShapeFilename,
                             200, NULL, NULL);
#else
        strcpy(ShapeFilename, wShapeFilename);
#endif

        // Shape range
        PExtractParameter(TempString, ctemp, 1);
        ShapeRange = StrToDouble(ctemp,NULL);

        // Shape icon
        PExtractParameter(TempString, ctemp, 2);
        ShapeIcon = _tcstol(ctemp, &Stop, 10);

        // Shape field for text display

        // sjt 02NOV05 - field parameter enabled
        PExtractParameter(TempString, ctemp, 3);
        if (_istalnum(ctemp[0])) {
          ShapeField = _tcstol(ctemp, &Stop, 10);
          ShapeField--;
        } else {
          ShapeField = -1;
	}

        // Red component of line / shading colour
        PExtractParameter(TempString, ctemp, 4);
        red = (BYTE)_tcstol(ctemp, &Stop, 10);

        // Green component of line / shading colour
        PExtractParameter(TempString, ctemp, 5);
        green = (BYTE)_tcstol(ctemp, &Stop, 10);

        // Blue component of line / shading colour
        PExtractParameter(TempString, ctemp, 6);
        blue = (BYTE)_tcstol(ctemp, &Stop, 10);

        if ((red==64)
            && (green==96)
            && (blue==240)) {
          // JMW update colours to ICAO standard
          red =    85; // water colours
          green = 160;
          blue =  255;
        }

        if (ShapeField<0) {
          Topology* newtopo;
          newtopo = new Topology(ShapeFilename, Color(red,green,blue));
          topology_store[numtopo] = newtopo;
        } else {
          TopologyLabel *newtopol;
          newtopol = new TopologyLabel(ShapeFilename,
                                       Color(red,green,blue),
                                       ShapeField);
          topology_store[numtopo] = newtopol;
        }
        if (ShapeIcon!=0)
          topology_store[numtopo]->loadBitmap(ShapeIcon);

        topology_store[numtopo]->scaleThreshold = ShapeRange;

        numtopo++;
      }
  }

  zzip_fclose(zFile);

  // file was OK, so save it
  SetRegistryString(szRegistryTopologyFile, szOrigFile);
}