aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIain Holmes <iain@src.gnome.org>2001-06-09 04:47:52 +0800
committerIain Holmes <iain@src.gnome.org>2001-06-09 04:47:52 +0800
commitd09d4962997e9056652815aab81f49311a6a59a8 (patch)
tree807d49e73be441e0332b67f889b38c0b518f74ef
parentda6c1c4d2ef41c60130e4de31160ee8107227588 (diff)
downloadgsoc2013-evolution-d09d4962997e9056652815aab81f49311a6a59a8.tar
gsoc2013-evolution-d09d4962997e9056652815aab81f49311a6a59a8.tar.gz
gsoc2013-evolution-d09d4962997e9056652815aab81f49311a6a59a8.tar.bz2
gsoc2013-evolution-d09d4962997e9056652815aab81f49311a6a59a8.tar.lz
gsoc2013-evolution-d09d4962997e9056652815aab81f49311a6a59a8.tar.xz
gsoc2013-evolution-d09d4962997e9056652815aab81f49311a6a59a8.tar.zst
gsoc2013-evolution-d09d4962997e9056652815aab81f49311a6a59a8.zip
Committing the new My Evolution.
svn path=/trunk/; revision=10163
-rw-r--r--ChangeLog7
-rw-r--r--Makefile.am2
-rw-r--r--art/ChangeLog13
-rw-r--r--art/Makefile.am10
-rw-r--r--art/bcg.pngbin0 -> 526 bytes
-rw-r--r--art/empty.gifbin0 -> 104 bytes
-rw-r--r--art/es-appointments.pngbin0 -> 433 bytes
-rw-r--r--art/es-weather.pngbin0 -> 1002 bytes
-rw-r--r--art/ico-calendar.pngbin0 -> 2677 bytes
-rw-r--r--art/ico-mail.pngbin0 -> 2937 bytes
-rw-r--r--art/ico-rdf.pngbin0 -> 4048 bytes
-rw-r--r--art/ico-weather.pngbin0 -> 4343 bytes
-rw-r--r--art/pattern.pngbin0 -> 271 bytes
-rw-r--r--art/rdf.pngbin0 -> 3802 bytes
-rw-r--r--calendar/ChangeLog10
-rw-r--r--calendar/gui/Makefile.am7
-rw-r--r--calendar/gui/calendar-component.c10
-rw-r--r--calendar/gui/component-factory.c10
-rw-r--r--configure.in6
-rw-r--r--default_user/ChangeLog6
-rw-r--r--default_user/local/Executive-Summary/.cvsignore2
-rw-r--r--default_user/local/Executive-Summary/Makefile.am6
-rw-r--r--default_user/local/Executive-Summary/folder-metadata.xml5
-rw-r--r--default_user/local/Makefile.am1
-rw-r--r--default_user/shortcuts.xml1
-rw-r--r--mail/ChangeLog17
-rw-r--r--mail/GNOME_Evolution_Mail.oaf.in18
-rw-r--r--mail/Mail.idl11
-rw-r--r--mail/Makefile.am18
-rw-r--r--mail/component-factory.c15
-rw-r--r--mail/folder-info.c229
-rw-r--r--my-evolution/.cvsignore12
-rw-r--r--my-evolution/GNOME_Evolution_Summary.oaf.in29
-rw-r--r--my-evolution/Locations3000
-rw-r--r--my-evolution/Makefile.am85
-rw-r--r--my-evolution/component-factory.c132
-rw-r--r--my-evolution/component-factory.h14
-rw-r--r--my-evolution/e-summary-calendar.c286
-rw-r--r--my-evolution/e-summary-calendar.h18
-rw-r--r--my-evolution/e-summary-factory.c132
-rw-r--r--my-evolution/e-summary-factory.h15
-rw-r--r--my-evolution/e-summary-mail.c276
-rw-r--r--my-evolution/e-summary-mail.h26
-rw-r--r--my-evolution/e-summary-rdf.c440
-rw-r--r--my-evolution/e-summary-rdf.h18
-rw-r--r--my-evolution/e-summary-type.h14
-rw-r--r--my-evolution/e-summary-weather.c419
-rw-r--r--my-evolution/e-summary-weather.h128
-rw-r--r--my-evolution/e-summary.c549
-rw-r--r--my-evolution/e-summary.h67
-rw-r--r--my-evolution/main.c67
-rw-r--r--my-evolution/metar.c590
-rw-r--r--my-evolution/metar.h46
-rw-r--r--my-evolution/my-evolution-html.h52
-rw-r--r--my-evolution/weather.h42
-rw-r--r--shell/ChangeLog28
-rw-r--r--shell/e-setup.c75
-rw-r--r--shell/e-shell-importer.c1
-rw-r--r--shell/e-shell-view.c92
-rw-r--r--shell/e-storage-set-view.c52
-rw-r--r--shell/evolution-storage.c1
-rw-r--r--ui/ChangeLog4
-rw-r--r--ui/Makefile.am3
-rw-r--r--ui/evolution-executive-summary.xml19
-rw-r--r--ui/my-evolution.xml23
65 files changed, 7022 insertions, 137 deletions
diff --git a/ChangeLog b/ChangeLog
index 0e59cbaac6..da632a9a14 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2001-06-08 Iain Holmes <iain@ximian.com>
+
+ * Makefile.am: Byebye executive-summary, hello my-evolution
+
+ * configure.in: Remove all the executive-summary Makefiles. Add the
+ my-evolution.
+
2001-06-08 Jon Trowbridge <trow@ximian.com>
* AUTHORS: Vanity, thy name is trow.
diff --git a/Makefile.am b/Makefile.am
index 5c72dc6a19..daab400ad3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -20,7 +20,6 @@ SUBDIRS = \
e-util \
widgets \
shell \
- executive-summary \
libibex \
camel \
filter \
@@ -32,6 +31,7 @@ SUBDIRS = \
calendar \
wombat \
importers \
+ my-evolution \
art \
ui \
default_user \
diff --git a/art/ChangeLog b/art/ChangeLog
index a40a898548..c94fdd0789 100644
--- a/art/ChangeLog
+++ b/art/ChangeLog
@@ -1,3 +1,16 @@
+2001-06-07 Iain Holmes <iain@ximian.com>
+
+ * empty.gif:
+ es-weather.png
+ es-appointments.png
+ ico-calendar.png
+ ico-mail.png
+ ico-rdf.png
+ ico-weather.png
+ bcg.png
+ rdf.png
+ pattern.png: Added all these for the new My Evolution
+
2001-06-04 Jakub Steiner <jimmac@ximian.com>
* timezone-16.xpm: for events in a diffrent timezone
diff --git a/art/Makefile.am b/art/Makefile.am
index 8ae91ca7d5..d7184a3a4d 100644
--- a/art/Makefile.am
+++ b/art/Makefile.am
@@ -1,21 +1,31 @@
imagesdir = $(datadir)/images/evolution
images_DATA = \
+ bcg.png \
configure_16_addressbook.xpm \
configure_16_calendar.xpm \
configure_16_folder.xpm \
configure_16_mail.xpm \
copy_16_message.xpm \
edit.xpm \
+ empty.gif \
encrypt.xpm \
+ es-appointments.png \
+ es-weather.png \
folder.xpm \
forward.xpm \
+ ico-calendar.png \
+ ico-mail.png \
+ ico-rdf.png \
+ ico-weather.png \
import.png \
import.xpm \
move_message.xpm \
offline.png \
online.png \
+ pattern.png \
print.xpm \
print-preview.xpm \
+ rdf.png \
reply.xpm \
reply_to_all.xpm \
save.xpm \
diff --git a/art/bcg.png b/art/bcg.png
new file mode 100644
index 0000000000..ec03f8ab6e
--- /dev/null
+++ b/art/bcg.png
Binary files differ
diff --git a/art/empty.gif b/art/empty.gif
new file mode 100644
index 0000000000..0be4006193
--- /dev/null
+++ b/art/empty.gif
Binary files differ
diff --git a/art/es-appointments.png b/art/es-appointments.png
new file mode 100644
index 0000000000..e194232051
--- /dev/null
+++ b/art/es-appointments.png
Binary files differ
diff --git a/art/es-weather.png b/art/es-weather.png
new file mode 100644
index 0000000000..3d31469e78
--- /dev/null
+++ b/art/es-weather.png
Binary files differ
diff --git a/art/ico-calendar.png b/art/ico-calendar.png
new file mode 100644
index 0000000000..3010528d7f
--- /dev/null
+++ b/art/ico-calendar.png
Binary files differ
diff --git a/art/ico-mail.png b/art/ico-mail.png
new file mode 100644
index 0000000000..66a4ba89cd
--- /dev/null
+++ b/art/ico-mail.png
Binary files differ
diff --git a/art/ico-rdf.png b/art/ico-rdf.png
new file mode 100644
index 0000000000..ad1a8a42f5
--- /dev/null
+++ b/art/ico-rdf.png
Binary files differ
diff --git a/art/ico-weather.png b/art/ico-weather.png
new file mode 100644
index 0000000000..25eb161f8c
--- /dev/null
+++ b/art/ico-weather.png
Binary files differ
diff --git a/art/pattern.png b/art/pattern.png
new file mode 100644
index 0000000000..33abc187ef
--- /dev/null
+++ b/art/pattern.png
Binary files differ
diff --git a/art/rdf.png b/art/rdf.png
new file mode 100644
index 0000000000..7d84d64583
--- /dev/null
+++ b/art/rdf.png
Binary files differ
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index 2f0b1e412e..15bf30af5a 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,13 @@
+2001-06-08 Iain Holmes <iain@ximian.com>
+
+ * gui/component-factory.c: Removed the executive-summary includes.
+ (component_factory_init): Don't init the summary factory.
+
+ * gui/calendar-summary.[ch]: Removed.
+
+ * gui/Makefile.am: Remove executive-summary stuff, move some libs
+ around a bit.
+
2001-06-04 JP Rosevear <jpr@ximian.com>
* gui/dialogs/recurrence-page.c (recurrence_page_set_dates):
diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am
index 5d48feff95..59850d48f5 100644
--- a/calendar/gui/Makefile.am
+++ b/calendar/gui/Makefile.am
@@ -30,7 +30,6 @@ INCLUDES = \
-I$(top_srcdir)/libical/src/libical \
-I$(top_builddir)/libical/src/libical \
-I$(top_srcdir)/widgets \
- -I$(top_srcdir)/executive-summary \
-I$(includedir) \
$(BONOBO_HTML_GNOME_CFLAGS) \
$(GNOME_VFS_CFLAGS) \
@@ -54,8 +53,6 @@ evolution_calendar_SOURCES = \
calendar-commands.h \
calendar-model.c \
calendar-model.h \
- calendar-summary.c \
- calendar-summary.h \
comp-util.c \
comp-util.h \
control-factory.c \
@@ -112,8 +109,8 @@ evolution_calendar_SOURCES = \
evolution_calendar_LDADD = \
alarm-notify/libalarm.a \
- $(top_builddir)/executive-summary/evolution-services/libevolution-services.la \
$(DB3_LDADD) \
+ $(top_builddir)/widgets/menus/libmenus.la \
$(top_builddir)/shell/libeshell.la \
$(top_builddir)/calendar/cal-client/libcal-client.la \
$(top_builddir)/calendar/cal-util/libcal-util.la \
@@ -122,7 +119,7 @@ evolution_calendar_LDADD = \
$(top_builddir)/libical/src/libical/libical.la \
$(top_builddir)/widgets/meeting-time-sel/libevolutionmtsel.a \
$(top_builddir)/widgets/misc/libemiscwidgets.a \
- $(top_builddir)/widgets/menus/libmenus.la \
+ $(EXTRA_GNOME_LIBS) \
dialogs/libcal-dialogs.a \
$(BONOBO_HTML_GNOME_LIBS) \
$(GNOME_VFS_LIBS) \
diff --git a/calendar/gui/calendar-component.c b/calendar/gui/calendar-component.c
index 8dae53c707..da68cabf05 100644
--- a/calendar/gui/calendar-component.c
+++ b/calendar/gui/calendar-component.c
@@ -29,13 +29,12 @@
#include <libgnomevfs/gnome-vfs-uri.h>
#include <libgnomevfs/gnome-vfs-ops.h>
+#include <bonobo/bonobo-generic-factory.h>
#include "evolution-shell-component.h"
-#include <executive-summary/evolution-services/executive-summary-component.h>
#include "component-factory.h"
#include "tasks-control-factory.h"
#include "control-factory.h"
#include "calendar-config.h"
-#include "calendar-summary.h"
#include "tasks-control.h"
#include "tasks-migrate.h"
@@ -44,7 +43,6 @@
#define COMPONENT_FACTORY_ID "OAFIID:GNOME_Evolution_Calendar_ShellComponentFactory"
static BonoboGenericFactory *factory = NULL;
-static BonoboGenericFactory *summary_factory = NULL;
char *evolution_dir;
static const EvolutionShellComponentFolderType folder_types[] = {
@@ -332,16 +330,12 @@ factory_fn (BonoboGenericFactory *factory,
void
component_factory_init (void)
{
- if (factory != NULL && factory != NULL)
+ if (factory != NULL)
return;
factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID, factory_fn, NULL);
- summary_factory = calendar_summary_factory_init ();
-
if (factory == NULL)
g_error ("Cannot initialize Evolution's calendar component.");
- if (summary_factory == NULL)
- g_error ("Cannot initialize Evolution's calendar summary component.");
}
diff --git a/calendar/gui/component-factory.c b/calendar/gui/component-factory.c
index 8dae53c707..da68cabf05 100644
--- a/calendar/gui/component-factory.c
+++ b/calendar/gui/component-factory.c
@@ -29,13 +29,12 @@
#include <libgnomevfs/gnome-vfs-uri.h>
#include <libgnomevfs/gnome-vfs-ops.h>
+#include <bonobo/bonobo-generic-factory.h>
#include "evolution-shell-component.h"
-#include <executive-summary/evolution-services/executive-summary-component.h>
#include "component-factory.h"
#include "tasks-control-factory.h"
#include "control-factory.h"
#include "calendar-config.h"
-#include "calendar-summary.h"
#include "tasks-control.h"
#include "tasks-migrate.h"
@@ -44,7 +43,6 @@
#define COMPONENT_FACTORY_ID "OAFIID:GNOME_Evolution_Calendar_ShellComponentFactory"
static BonoboGenericFactory *factory = NULL;
-static BonoboGenericFactory *summary_factory = NULL;
char *evolution_dir;
static const EvolutionShellComponentFolderType folder_types[] = {
@@ -332,16 +330,12 @@ factory_fn (BonoboGenericFactory *factory,
void
component_factory_init (void)
{
- if (factory != NULL && factory != NULL)
+ if (factory != NULL)
return;
factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID, factory_fn, NULL);
- summary_factory = calendar_summary_factory_init ();
-
if (factory == NULL)
g_error ("Cannot initialize Evolution's calendar component.");
- if (summary_factory == NULL)
- g_error ("Cannot initialize Evolution's calendar summary component.");
}
diff --git a/configure.in b/configure.in
index b312186a6c..3e914ca63a 100644
--- a/configure.in
+++ b/configure.in
@@ -940,11 +940,7 @@ po/Makefile.in
e-util/Makefile
e-util/ename/Makefile
libibex/Makefile
-executive-summary/Makefile
-executive-summary/evolution-services/Makefile
-executive-summary/idl/Makefile
-executive-summary/component/Makefile
-executive-summary/test-service/Makefile
+my-evolution/Makefile
camel/Makefile
camel/providers/Makefile
camel/providers/pop3/Makefile
diff --git a/default_user/ChangeLog b/default_user/ChangeLog
index 5b69c01e21..0608e60a11 100644
--- a/default_user/ChangeLog
+++ b/default_user/ChangeLog
@@ -1,3 +1,9 @@
+2001-06-07 Iain Holmes <iain@ximian.com>
+
+ * shortcuts.xml: Removed the references to local/Executive-Summary.
+
+ * local/Executive-Summary: Removed.
+
2001-05-08 Not Zed <NotZed@Ximian.com>
* searches.xml: Reverted Gediminas patch.
diff --git a/default_user/local/Executive-Summary/.cvsignore b/default_user/local/Executive-Summary/.cvsignore
deleted file mode 100644
index 282522db03..0000000000
--- a/default_user/local/Executive-Summary/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/default_user/local/Executive-Summary/Makefile.am b/default_user/local/Executive-Summary/Makefile.am
deleted file mode 100644
index 6fae47d4ab..0000000000
--- a/default_user/local/Executive-Summary/Makefile.am
+++ /dev/null
@@ -1,6 +0,0 @@
-defaultcalendardir = $(datadir)/evolution/default_user/local/Executive-Summary
-
-defaultcalendar_DATA = \
- folder-metadata.xml
-
-EXTRA_DIST = $(defaultcalendar_DATA)
diff --git a/default_user/local/Executive-Summary/folder-metadata.xml b/default_user/local/Executive-Summary/folder-metadata.xml
deleted file mode 100644
index 86e9e425e4..0000000000
--- a/default_user/local/Executive-Summary/folder-metadata.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<efolder>
- <type>executive-summary</type>
- <description>Executive Summary folder</description>
-</efolder>
diff --git a/default_user/local/Makefile.am b/default_user/local/Makefile.am
index 9a2bf358d3..a1baef5052 100644
--- a/default_user/local/Makefile.am
+++ b/default_user/local/Makefile.am
@@ -2,7 +2,6 @@ SUBDIRS = \
Calendar \
Contacts \
Drafts \
- Executive-Summary \
Inbox \
Outbox \
Sent \
diff --git a/default_user/shortcuts.xml b/default_user/shortcuts.xml
index 4532b0a17b..32cf2dd096 100644
--- a/default_user/shortcuts.xml
+++ b/default_user/shortcuts.xml
@@ -1,7 +1,6 @@
<?xml version="1.0"?>
<shortcuts>
<group title="Evolution shortcuts">
- <item>evolution:/local/Executive-Summary</item>
<item>evolution:/local/Inbox</item>
<!-- <item>evolution:/local/Outbox</item>
<item>evolution:/local/Trash</item>
diff --git a/mail/ChangeLog b/mail/ChangeLog
index 0bee194cc6..b81d924a29 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,20 @@
+2001-06-07 Iain Holmes <iain@ximian.com>
+
+ * GNOME_Evolution_Mail.oaf.in: Add server info for FolderInfo
+ Remove server info for the Summary server
+
+ * Mail.idl: Add a FolderInfo interface to retreive information about
+ a mail folder.
+
+ * Makefile.am: Remove the executive summary stuff. Add the folder-info
+ files.
+
+ * component-factory.c: Remove the mail-summary.h include.
+ Remove summary_factory.
+ (summary_fn): Remove.
+ (component_factory_init): Remove the summary_factory creation.
+ Initialise the info_factory.
+
2001-06-08 Jon Trowbridge <trow@ximian.com>
* mail-ops.c (mail_send_message): Reattach X-Evolution-Account
diff --git a/mail/GNOME_Evolution_Mail.oaf.in b/mail/GNOME_Evolution_Mail.oaf.in
index 58a32dcfaa..1777903fc3 100644
--- a/mail/GNOME_Evolution_Mail.oaf.in
+++ b/mail/GNOME_Evolution_Mail.oaf.in
@@ -123,4 +123,22 @@
_value="Mail configuration interface"/>
</oaf_server>
+<oaf_server iid="OAFIID:GNOME_Evolution_FolderInfo_Factory"
+ type="exe"
+ location="evolution-mail">
+
+ <oaf_attribute name="repo_ids" type="stringv">
+ <item value="IDL:GNOME/GenericFactory:1.0"/>
+ </oaf_attribute>
+</oaf_server>
+
+<oaf_server iid="OAFIID:GNOME_Evolution_FolderInfo"
+ type="factory"
+ location="OAFIID:GNOME_Evolution_FolderInfo_Factory">
+
+ <oaf_attribute name="repo_ids" type="stringv">
+ <item value="IDL:GNOME/Evolution/FolderInfo:1.0"/>
+ </oaf_attribute>
+</oaf_server>
+
</oaf_info>
diff --git a/mail/Mail.idl b/mail/Mail.idl
index 09a625e4b0..429ed118ab 100644
--- a/mail/Mail.idl
+++ b/mail/Mail.idl
@@ -28,6 +28,17 @@ module Evolution {
MessageList getMessageList ();
};
+ interface FolderInfo : Bonobo::Unknown {
+ struct MessageCount {
+ string path;
+ long count;
+ long unread;
+ };
+
+ void getInfo (in string foldername,
+ in Bonobo::Listener listener);
+ };
+
interface MailConfig : Bonobo::Unknown {
struct Identity {
diff --git a/mail/Makefile.am b/mail/Makefile.am
index f3931514ea..b59fc1a9f0 100644
--- a/mail/Makefile.am
+++ b/mail/Makefile.am
@@ -17,8 +17,6 @@ INCLUDES = \
-I$(top_builddir)/composer \
-I$(top_builddir)/shell \
-I$(top_srcdir)/shell \
- -I$(top_builddir)/executive-summary \
- -I$(top_srcdir)/executive-summary \
-I$(top_srcdir)/shell/importer \
-I$(top_builddir)/shell/importer \
$(MAILER_CFLAGS) \
@@ -47,6 +45,8 @@ evolution_mail_SOURCES = \
folder-browser.h \
folder-browser-factory.c \
folder-browser-factory.h \
+ folder-info.c \
+ folder-info.h \
mail-accounts.c \
mail-accounts.h \
mail-account-editor.c \
@@ -85,8 +85,6 @@ evolution_mail_SOURCES = \
mail-send-recv.h \
mail-session.c \
mail-session.h \
- mail-summary.c \
- mail-summary.h \
mail-tools.c \
mail-tools.h \
mail-types.h \
@@ -113,7 +111,6 @@ evolution_mail_LDADD = \
$(top_builddir)/e-util/ename/libename.la \
$(top_builddir)/libibex/libibex.la \
$(top_builddir)/filter/libfilter.la \
- $(top_builddir)/executive-summary/evolution-services/libevolution-services.la \
$(top_builddir)/shell/importer/libevolution-importer.la \
$(top_builddir)/widgets/menus/libmenus.la \
$(MAILER_LIBS)
@@ -121,17 +118,6 @@ evolution_mail_LDADD = \
evolution_mail_LDFLAGS = \
-export-dynamic
-#evolution_outlook_importer_SOURCES = \
-# evolution-outlook-importer.c
-
-#evolution_outlook_importer_LDADD = \
-# $(BONOBO_GNOME_LIBS) \
-# $(EXTRA_GNOME_LIBS) \
-# $(top_builddir)/e-util/libeutil.la \
-# $(top_builddir)/shell/importer/libevolution-importer.la \
-# $(CAMEL_OBJS_EXTRA) \
-# $(top_builddir)/camel/libcamel.la
-
test_mail_SOURCES = \
test-mail.c
diff --git a/mail/component-factory.c b/mail/component-factory.c
index 0cbaaf3c41..ed8f8707c0 100644
--- a/mail/component-factory.c
+++ b/mail/component-factory.c
@@ -49,7 +49,6 @@
#include "component-factory.h"
-#include "mail-summary.h"
#include "mail-send-recv.h"
char *default_drafts_folder_uri;
@@ -64,7 +63,6 @@ char *evolution_dir;
#define SUMMARY_FACTORY_ID "OAFIID:GNOME_Evolution_Mail_ExecutiveSummaryComponentFactory"
static BonoboGenericFactory *component_factory = NULL;
-static BonoboGenericFactory *summary_factory = NULL;
static GHashTable *storages_hash;
/* EvolutionShellComponent methods and signals. */
@@ -326,7 +324,6 @@ idle_quit (gpointer user_data)
if (e_list_length (folder_browser_factory_get_control_list ()))
return TRUE;
- bonobo_object_unref (BONOBO_OBJECT (summary_factory));
bonobo_object_unref (BONOBO_OBJECT (component_factory));
g_hash_table_foreach (storages_hash, free_storage, NULL);
g_hash_table_destroy (storages_hash);
@@ -390,24 +387,16 @@ component_fn (BonoboGenericFactory *factory, void *closure)
return BONOBO_OBJECT (shell_component);
}
-static BonoboObject *
-summary_fn (BonoboGenericFactory *factory, void *closure)
-{
- return executive_summary_component_factory_new (create_summary_view,
- NULL);
-}
-
void
component_factory_init (void)
{
component_factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID,
component_fn, NULL);
- summary_factory = bonobo_generic_factory_new (SUMMARY_FACTORY_ID,
- summary_fn, NULL);
evolution_mail_config_factory_init ();
+ evolution_folder_info_factory_init ();
- if (component_factory == NULL || summary_factory == NULL) {
+ if (component_factory == NULL) {
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
_("Cannot initialize Evolution's mail component."));
exit (1);
diff --git a/mail/folder-info.c b/mail/folder-info.c
new file mode 100644
index 0000000000..e5b84b60cb
--- /dev/null
+++ b/mail/folder-info.c
@@ -0,0 +1,229 @@
+/*
+ * folder-info.c: Implementation of GNOME_Evolution_FolderInfo
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#include "Mail.h"
+
+#include <glib.h>
+#include <libgnome/gnome-defs.h>
+
+#include <bonobo/bonobo-xobject.h>
+#include <bonobo/bonobo-generic-factory.h>
+#include <bonobo/bonobo-context.h>
+#include <bonobo/bonobo-exception.h>
+
+#include "mail-mt.h"
+#include <camel/camel-exception.h>
+
+#define FOLDER_INFO_IID "OAFIID:GNOME_Evolution_FolderInfo_Factory"
+
+#define PARENT_TYPE BONOBO_X_OBJECT_TYPE
+static BonoboObjectClass *parent_class = NULL;
+
+typedef struct _EvolutionFolderInfo EvolutionFolderInfo;
+typedef struct _EvolutionFolderInfoClass EvolutionFolderInfoClass;
+
+struct _EvolutionFolderInfo {
+ BonoboXObject parent;
+};
+
+struct _EvolutionFolderInfoClass {
+ BonoboXObjectClass parent_class;
+
+ POA_GNOME_Evolution_FolderInfo__epv epv;
+};
+
+/* MT stuff */
+struct _folder_info_msg {
+ struct _mail_msg msg;
+
+ Bonobo_Listener listener;
+ char *foldername;
+
+ int read;
+ int unread;
+};
+
+static void
+do_get_info (struct _mail_msg *mm)
+{
+ struct _folder_info_msg *m = (struct _folder_info_msg *) mm;
+ char *uri_dup;
+ char *foldername, *start, *end;
+ char *storage, *protocol, *uri;
+ CamelFolder *folder;
+ CamelException *ex;
+#if 0
+ /* Fixme: Do other stuff. Different stuff to the stuff below */
+ uri_dup = g_strdup (m->foldername);
+ start = uri_dup + 11;
+ g_warning ("Start: %s", start);
+
+ end = strrchr (start, '/');
+ if (end == NULL) {
+ g_warning ("Bugger");
+ return;
+ }
+
+ storage = g_strndup (start, end - start);
+ start = end + 1;
+ foldername = g_strdup (start);
+
+ g_free (uri_dup);
+
+ /* Work out the protocol.
+ The storage is going to start as local, or vfolder, or an imap
+ server. */
+ g_warning ("Storage: %s", storage);
+ if (strncmp (storage, "local", 5) == 0) {
+ char *evolution_dir;
+ char *proto;
+
+ evolution_dir = gnome_util_prepend_user_home ("evolution/local");
+ proto = g_strconcat ("file://", evolution_dir, NULL);
+ uri = e_path_to_physical (proto, foldername);
+ g_free (evolution_dir);
+ g_free (proto);
+
+ } else if (strncmp (storage, "vfolder", 7) == 0) {
+ uri = g_strconcat ("vfolder://", foldername, NULL);
+ } else {
+ uri = g_strconcat ("imap://", storage, foldername, NULL);
+ }
+#endif
+
+ ex = camel_exception_new ();
+ folder = mail_tool_uri_to_folder (m->foldername, ex);
+ if (camel_exception_is_set (ex)) {
+ g_warning ("Camel exception: %s", camel_exception_get_description (ex));
+ }
+
+ camel_exception_free (ex);
+
+ m->read = camel_folder_get_message_count (folder);
+ m->unread = camel_folder_get_unread_message_count (folder);
+}
+
+static void
+do_got_info (struct _mail_msg *mm)
+{
+ struct _folder_info_msg *m = (struct _folder_info_msg *) mm;
+ CORBA_Environment ev;
+ CORBA_any a;
+ GNOME_Evolution_FolderInfo_MessageCount count;
+
+ g_print ("You've got mail: %d, %d\n", m->read, m->unread);
+
+ count.path = m->foldername;
+ count.count = m->read;
+ count.unread = m->unread;
+
+ a._type = (CORBA_TypeCode) TC_GNOME_Evolution_FolderInfo_MessageCount;
+ a._value = &count;
+
+ CORBA_exception_init (&ev);
+ Bonobo_Listener_event (m->listener, "youve-got-mail", &a, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Got exception on listener: %s", CORBA_exception_id (&ev));
+ }
+ CORBA_exception_free (&ev);
+}
+
+static void
+do_free_info (struct _mail_msg *mm)
+{
+ struct _folder_info_msg *m = (struct _folder_info_msg *) mm;
+
+ g_free (m->foldername);
+}
+
+struct _mail_msg_op get_info_op = {
+ NULL,
+ do_get_info,
+ do_got_info,
+ do_free_info,
+};
+
+typedef struct {
+ int read;
+ int unread;
+} MailFolderInfo;
+
+/* Returns a MailFolderInfo struct or NULL on error */
+static void
+mail_get_info (const char *foldername,
+ Bonobo_Listener listener)
+{
+ CORBA_Environment ev;
+ struct _folder_info_msg *m;
+
+ m = mail_msg_new (&get_info_op, NULL, sizeof (*m));
+
+ g_print ("Folder: %s", foldername);
+ m->foldername = g_strdup (foldername);
+
+ CORBA_exception_init (&ev);
+ m->listener = bonobo_object_dup_ref (listener, &ev);
+ CORBA_exception_free (&ev);
+
+ e_thread_put (mail_thread_new, (EMsg *) m);
+}
+
+static void
+impl_GNOME_Evolution_FolderInfo_getInfo (PortableServer_Servant servant,
+ const CORBA_char *foldername,
+ const Bonobo_Listener listener,
+ CORBA_Environment *ev)
+{
+ mail_get_info (foldername, listener);
+}
+
+static void
+evolution_folder_info_class_init (EvolutionFolderInfoClass *klass)
+{
+ POA_GNOME_Evolution_FolderInfo__epv *epv = &klass->epv;
+
+ parent_class = gtk_type_class (PARENT_TYPE);
+ epv->getInfo = impl_GNOME_Evolution_FolderInfo_getInfo;
+}
+
+static void
+evolution_folder_info_init (EvolutionFolderInfo *info)
+{
+}
+
+BONOBO_X_TYPE_FUNC_FULL (EvolutionFolderInfo,
+ GNOME_Evolution_FolderInfo,
+ PARENT_TYPE,
+ evolution_folder_info);
+
+static BonoboObject *
+evolution_folder_info_factory_fn (BonoboGenericFactory *factory,
+ void *closure)
+{
+ EvolutionFolderInfo *info;
+
+ info = gtk_type_new (evolution_folder_info_get_type ());
+ return BONOBO_OBJECT (info);
+}
+
+void
+evolution_folder_info_factory_init (void)
+{
+ BonoboGenericFactory *factory;
+
+ factory = bonobo_generic_factory_new (FOLDER_INFO_IID,
+ evolution_folder_info_factory_fn,
+ NULL);
+
+ if (factory == NULL) {
+ g_warning ("Error starting FolderInfo");
+ return;
+ }
+
+ bonobo_running_context_auto_exit_unref (BONOBO_OBJECT (factory));
+}
diff --git a/my-evolution/.cvsignore b/my-evolution/.cvsignore
new file mode 100644
index 0000000000..ab0d765740
--- /dev/null
+++ b/my-evolution/.cvsignore
@@ -0,0 +1,12 @@
+.deps
+.libs
+.pure
+Makefile
+Makefile.in
+Mail-stubs.c
+Mail-skels.c
+Mail-common.c
+Mail.h
+evolution-executive-summary
+evolution-executive-summary.pure
+GNOME_Evolution_Summary.oaf
diff --git a/my-evolution/GNOME_Evolution_Summary.oaf.in b/my-evolution/GNOME_Evolution_Summary.oaf.in
new file mode 100644
index 0000000000..eeffbe28c0
--- /dev/null
+++ b/my-evolution/GNOME_Evolution_Summary.oaf.in
@@ -0,0 +1,29 @@
+<oaf_info>
+
+<oaf_server iid="OAFIID:GNOME_Evolution_Summary_ShellComponentFactory"
+ type="exe"
+ location="evolution-executive-summary">
+ <oaf_attribute name="repo_ids" type="stringv">
+ <item value="IDL:GNOME/ObjectFactory:1.0"/>
+ </oaf_attribute>
+
+ <oaf_attribute name="description" type="string"
+ _value="Factory for the Evolution executive summary component."/>
+</oaf_server>
+
+<oaf_server iid="OAFIID:GNOME_Evolution_Summary_ShellComponent"
+ type="factory"
+ location="OAFIID:GNOME_Evolution_Summary_ShellComponentFactory">
+
+ <oaf_attribute name="repo_ids" type="stringv">
+ <item value="IDL:GNOME/Evolution/ShellComponent:1.0"/>
+ </oaf_attribute>
+
+ <oaf_attribute name="description" type="string"
+ _value="Evolution component for the executive summary."/>
+
+ <oaf_attribute name="evolution:shell-component-icon" type="string"
+ value="evolution-today.png"/>
+</oaf_server>
+
+</oaf_info>
diff --git a/my-evolution/Locations b/my-evolution/Locations
new file mode 100644
index 0000000000..ec9142053c
--- /dev/null
+++ b/my-evolution/Locations
@@ -0,0 +1,3000 @@
+[Main]
+regions=US CA EU AF OZ ME AS M_ AT
+
+[ME]
+name=Middle East
+states=DZ BH IR KW LB OM QA SA AE YE
+
+[ME_AE]
+name=United Arab Emirates
+loc0=Abu\\ Dhabi\\ -\\ Bateen OMAD ------ ---
+loc1=Abu\\ Dhabi OMAA ------ ---
+loc2=Al\\ Ain OMAL ------ ---
+loc3=Dubai OMDB ------ ---
+loc4=Fujairah OMFJ ------ ---
+loc5=Ras\\ Al\\ Khaimah OMRK ------ ---
+loc6=Sharjah OMSJ ------ ---
+
+[ME_QA]
+name=Qatar
+loc0=Doha OTBD ------ ---
+
+[ME_OM]
+name=Oman
+loc0=Masirah OOMA ------ ---
+loc1=Saiq OOSQ ------ ---
+loc2=Salalah OOSA ------ ---
+loc3=Seeb OOMS ------ ---
+loc4=Thumrait OOTH ------ ---
+
+[ME_YE]
+name=Yemen
+loc0=Aden OYAA ------ ---
+loc1=Hodeidah OYHD ------ ---
+loc2=Marib OYMB ------ ---
+loc3=Sana'A OYSN ------ ---
+loc4=Sayun OYSY ------ ---
+loc5=Socotra OYSQ ------ ---
+loc6=Taiz OYTZ ------ ---
+
+[ME_SA]
+name=Saudi Arabia
+loc0=Abha OEAB ------ ---
+loc1=Al\\ Ahsa OEAH ------ ---
+loc2=Al\\ Baha OEBA ------ ---
+loc3=Al\\ Qaysumah OEPA ------ ---
+loc4=Al-Jouf OESK ------ ---
+loc5=Arar OERR ------ ---
+loc6=Bisha OEBH ------ ---
+loc7=Dawadmi OEDW ------ ---
+loc8=Dhahran OEDR ------ ---
+loc9=Gassim OEGS ------ ---
+loc10=Gizan OEGN ------ ---
+loc11=Guriat OEGT ------ ---
+loc12=Hafr\\ Al-Batin OEKK ------ ---
+loc13=Hail OEHL ------ ---
+loc14=Jeddah\\ King\\ Abdul\\ Aziz\\ International\\ Airport OEJN ------ ---
+loc15=Khamis\\ Mushait OEKM ------ ---
+loc16=King\\ Khaled\\ International\\ Airport OERK ------ ---
+loc17=Madinah OEMA ------ ---
+loc18=Makkah OEMK ------ ---
+loc19=Najran OENG ------ ---
+loc20=Rafha OERF ------ ---
+loc21=Riyadh OERY ------ ---
+loc22=Sharurah OESH ------ ---
+loc23=Tabuk OETB ------ ---
+loc24=Taif OETF ------ ---
+loc25=Turaif OETR ------ ---
+loc26=Wadi\\ Al\\ Dawasser\\ Airport OEWD ------ ---
+loc27=Wejh OEWJ ------ ---
+loc28=Yenbo OEYN ------ ---
+
+[ME_DZ]
+name=Algeria
+loc0=Adrar DAUA ------ ---
+loc1=Annaba DABB ------ ---
+loc2=Constantine DABC ------ ---
+loc3=Dar-El-Beida DAAG ------ ---
+loc4=Ghardaia DAUG ------ ---
+loc5=Hassi-Messaoud DAUH ------ ---
+loc6=In\\ Amenas DAUZ ------ ---
+loc7=Oran/Es\\ Senia DAOO ------ ---
+loc8=Tamanrasset/Aguenna DAAT ------ ---
+loc9=Tebessa DABS ------ ---
+loc10=Tlemcen\\ Zenata DAON ------ ---
+
+[ME_BH]
+name=Bahrain
+loc0=Bahrain OBBI ------ ---
+
+[ME_LB]
+name=Lebanon
+loc0=Beirut OLBA ------ ---
+
+[ME_IR]
+name=Iran, Islamic Republic of
+loc0=Ahwaz OIAW ------ ---
+loc1=Bandarabbass OIKB ------ ---
+loc2=Esfahan OIFM ------ ---
+loc3=Kerman OIKK ------ ---
+loc4=Mashhad OIMM ------ ---
+loc5=Shiraz OISS ------ ---
+loc6=Tabriz OITT ------ ---
+loc7=Tehran-Mehrabad OIII ------ ---
+
+[ME_KW]
+name=Kuwait
+loc0=Kuwait OKBK ------ ---
+
+[US]
+name=United States
+states=AL AK AZ AR CA CO CT DE DC FL GA HI ID IL IN IA KS KY LA ME MA MD MI MS MN MO MT NE NH NM NV NY ND NJ NC OH OK OR PA RI SC SD TN TX UT VT VA WA WI WV WY
+
+[US_AK]
+name=Alaska
+loc0=Adak PADK AKZ020 ---
+loc1=Ambl\\er PAFM AKZ003 ---
+loc2=Anaktuvuk PAKP AKZ001 ---
+loc3=Anchorage PANC AKZ015 ---
+loc4=Anchorage\\ -\\ Elmendorf\\ AFB PAED AKZ015 ---
+loc5=Aniak PANI AKZ010 ---
+loc6=Annette PANT ------ ---
+loc7=Barrow PABR AKZ001 ---
+loc8=Barter\\ Island PABA ------ ---
+loc9=Bethel PABE AKZ010 ---
+loc10=Bettles PABT AKZ004 ---
+loc11=Big\\ River\\ Lake PALV AKZ001 ---
+loc12=Cantwell PATW AKZ004 ---
+loc13=Cape\\ Lisburne PALU ------ ---
+loc14=Cape\\ Newenham PAEH ------ ---
+loc15=Cape\\ Romanzoff PACZ ------ ---
+loc16=Chandalar\\ Lake PALR AKZ004 ---
+loc17=Chulitna PAEC ------ ---
+loc18=Circle\\ City PACR AKZ004 ---
+loc19=Cold\\ Bay PACD AKZ020 ---
+loc20=Cordova PACV AKZ017 ---
+loc21=Dead\\ Horse PASC AKZ001 ---
+loc22=Dillingham PADL AKZ010 ---
+loc23=Dutch\\ Harbor PADU AKZ020 ---
+loc24=Elfin\\ Cove PAEL AKZ022 ---
+loc25=Emmonak PAEM ------ ---
+loc26=Fairbanks PAFA AKZ007 ---
+loc27=Farbanks/Eielson\\ AFB PAEI AKZ007 ---
+loc28=Fort\\ Greely/Allen\\ AAF PABI ------ ---
+loc29=Galbraith\\ Lake PAGB ------ ---
+loc30=Galena PAGA ------ ---
+loc31=Gambell PAGM AKZ006 ---
+loc32=Gulkana PAGK AKZ015 ---
+loc33=Gustavus PAGS AKZ024 ---
+loc34=Haines PAHN AKZ002 ---
+loc35=Hayes\\ River PAHZ ------ ---
+loc36=Healy\\ River PAHV AKZ004 ---
+loc37=Homer PAHO AKZ017 ---
+loc38=Hoonah PAOH AKZ026 ---
+loc39=Iliamna PAIL AKZ010 ---
+loc40=Juneau PAJN AKZ025 ---
+loc41=Kake PAFE AKZ026 ---
+loc42=Kenai PAEN AKZ017 ---
+loc43=Ketchikan PAKT AKZ027 ---
+loc44=King\\ Salmon PAKN AKZ016 ---
+loc45=Klawock PAKW ------ ---
+loc46=Kodiak PADQ AKZ018 ---
+loc47=Kotzebue PAOT AKZ003 ---
+loc48=Lake\\ Hood PALH ------ ---
+loc49=McCarthy PAMX AKZ017 ---
+loc50=McGrath PAMC AKZ004 ---
+loc51=Mekoryuk PAMY AKZ010 ---
+loc52=Merril\\ Field PAMR ------ ---
+loc53=Middleton\\ Island PAMD ------ ---
+loc54=Minchumina PAMH ------ ---
+loc55=Nabesna/Devil\\ Mt. PABN ------ ---
+loc56=Nenana PANN AKZ004 ---
+loc57=Nome PAOM AKZ006 ---
+loc58=Northway PAOR AKZ007 ---
+loc59=Palmer PAAQ AKZ015 ---
+loc60=Paxson PAXK AKZ017 ---
+loc61=Petersburg PAPG AKZ026 ---
+loc62=Point\\ Hope PAPO AKZ001 ---
+loc63=Point\\ Lay PPIZ AKZ001 ---
+loc64=Port\\ Alexander PAAP AKZ026 ---
+loc65=Port\\ Alsworth PALJ ------ ---
+loc66=Port\\ Heiden PAPH AKZ010 ---
+loc67=Puntilla\\ Lake PAPT ------ ---
+loc68=Saint\\ Mary's PASM AKZ010 ---
+loc69=Saint\\ Paul PASN ------ ---
+loc70=Sand\\ Point PASD AKZ020 ---
+loc71=Selanik PASK AKZ003 ---
+loc72=Seward PAWD AKZ017 ---
+loc73=Shishmaref PASH AKZ006 ---
+loc74=Sitka PASI AKZ023 ---
+loc75=Skagway PAGY AKZ026 ---
+loc76=Skwentna PASW AKZ015 ---
+loc77=Slana PADT ------ ---
+loc78=Snowshoe\\ Lake PALK ------ ---
+loc79=Soldotna PASX AKZ017 ---
+loc80=Sparrevohn PASV ------ ---
+loc81=Sutton PAJV ------ ---
+loc82=Talkeetna PATK AKZ015 ---
+loc83=Tanana PATA AKZ004 ---
+loc84=Tatalina PATL ------ ---
+loc85=Tin\\ City PATC ------ ---
+loc86=Togiak\\ Village PATG AKZ010 ---
+loc87=Umiat PAUM AKZ001 ---
+loc88=Unalakleet PAUN AKZ006 ---
+loc89=Valdez\\ 2 PAVD AKZ017 ---
+loc90=Wainwright PAFB AKZ001 ---
+loc91=Whittier PAWR AKZ015 ---
+loc92=Willow\\ Airport PAUO AKZ015 ---
+loc93=Wrangell PAWG AKZ026 ---
+loc94=Yakutat PAYA AKZ022 ---
+
+[US_AR]
+name=Arkansas
+loc0=Batesville KBVX ARZ016 ---
+loc1=Bentonville KVBT ARZ001 ---
+loc2=El\\ Dorado KELD ARZ073 ---
+loc3=Fayetteville KFYV ARZ010 085
+loc4=Flippin KFLP ARZ004 ---
+loc5=Fort\\ Smith KFSM ------ 085
+loc6=Harrison KHRO ARZ003 085
+loc7=Hot\\ Springs KHOT ARZ042 ---
+loc8=Jonesboro KJBR ARZ026 085
+loc9=Little\\ Rock KLIT ARZ044 ---
+loc10=Little\\ Rock\\ AFB KLRF ARZ044 ---
+loc11=Pine\\ Bluff KPBF ARZ056 ---
+loc12=Rogers KROG ARZ001 ---
+loc13=Siloam\\ Springs KSLG ARZ001 ---
+loc14=Stuttgart KSGT ARZ057 ---
+loc15=Texarkana KTXK ARZ070 ---
+loc16=Walnut\\ Ridge KARG ARZ017 ---
+
+[US_DC]
+name=District of Columbia
+loc0=Washington/Dulles KIAD DCZ013 dca
+loc1=Washington KDCA DCZ013 dca
+
+[US_ID]
+name=Idaho
+loc0=Boise KBOI IDZ014 ---
+loc1=Burley KBYI IDZ022 ---
+loc2=Challis KU15 IDZ018 ---
+loc3=Coeur\\ d'Alene KCOE IDZ002 ---
+loc4=Elk\\ City KP69 IDZ006 ---
+loc5=Grangeville KS80 IDZ007 ---
+loc6=Hailey-Sun\\ Valley KSUN IDZ018 ---
+loc7=Idaho\\ Falls KIDA IDZ020 ---
+loc8=Lewiston KLWS IDZ003 ---
+loc9=Malad\\ City KMLD IDZ022 ---
+loc10=Malta K77M IDZ022 ---
+loc11=McCall KMYL IDZ011 ---
+loc12=Mountain\\ Home KMUO IDZ014 ---
+loc13=Mullan KS06 IDZ004 ---
+loc14=Pocatello KPIH IDZ021 ---
+loc15=Salmon KSMN IDZ009 ---
+loc16=Salmon\\ (2) K27U IDZ009 ---
+loc17=Soda\\ Springs KU78 IDZ023 ---
+loc18=Strevell K4SV ------ ---
+loc19=Twin\\ Falls KTWF IDZ015 ---
+
+[US_IA]
+name=Iowa
+loc0=Algona KAXA IAZ005 043
+loc1=Ames KAMW IAZ048 043
+loc2=Atlantic KAIO IAZ070 ---
+loc3=Boone KBNW IAZ047 ---
+loc4=Burlington KBRL IAZ089 058
+loc5=Carroll KCIN IAZ045 ---
+loc6=Cedar\\ Rapids KCID IAZ052 ---
+loc7=Chariton KCNC IAZ084 ---
+loc8=Charles\\ City KCCY IAZ018 ---
+loc9=Clarinda KICL IAZ091 ---
+loc10=Clarion KCAV IAZ025 ---
+loc11=Clinton KCWI IAZ066 ---
+loc12=Council\\ Bluffs KCBF IAZ069 ---
+loc13=Creston KCSQ IAZ082 ---
+loc14=Davenport KDVN IAZ068 ---
+loc15=Decorah KDEH IAZ010 ---
+loc16=Denison KDNS IAZ044 ---
+loc17=Des\\ Moines KDSM IAZ060 057
+loc18=Dubuque KDBQ IAZ042 ---
+loc19=Estherville KEST IAZ004 ---
+loc20=Fairfield KFFL IAZ087 ---
+loc21=Fort\\ Dodge KFOD IAZ035 043
+loc22=Fort\\ Madison KFSW IAZ099 ---
+loc23=Iowa\\ City KIOW IAZ064 ---
+loc24=Keokuk KEOK ------ ---
+loc25=Knoxville KOXV ------ ---
+loc26=Lamoni K0Y7 IAZ094 057
+loc27=Le\\ Marine KLRJ ------ ---
+loc28=Marshalltown KMIW IAZ049 ---
+loc29=Mason\\ City KMCW IAZ017 044
+loc30=Monticello KMXO IAZ053 ---
+loc31=Muscatine KMUT IAZ067 ---
+loc32=Newton KTNU IAZ061 ---
+loc33=Oelwen KOLZ IAZ029 ---
+loc34=Orange\\ City KORC IAZ012 ---
+loc35=Ottumwa KOTM IAZ086 058
+loc36=Red\\ Oak KRDK IAZ080 ---
+loc37=Sheldon KSHL IAZ012 ---
+loc38=Shenandoah KSDA IAZ091 ---
+loc39=Sioux\\ City KSUX IAZ031 043
+loc40=Spencer KSPW IAZ014 043
+loc41=Storm\\ Lake KSLB IAZ022 ---
+loc42=Washington KAWG IAZ077 ---
+loc43=Waterloo KALO IAZ039 044
+loc44=Webster\\ City KEBS ------ ---
+
+[US_KS]
+name=Kansas
+loc0=Chanute KCNU KSZ096 084
+loc1=Concordia KCNK KSZ020 071
+loc2=Dodge\\ City KDDC KSZ078 070
+loc3=Elkhart K1K5 KSZ084 ---
+loc4=Emporia KEMP KSZ054 071
+loc5=Fort\\ Riley KFRI KSZ036 ---
+loc6=Garden\\ City KGCK KSZ063 070
+loc7=Goodland KGLD KSZ013 070
+loc8=Hays KHYS KSZ031 ---
+loc9=Hill\\ City KHLC KSZ016 070
+loc10=Hutchinson KHUT KSZ067 084
+loc11=Liberal KLBL KSZ086 ---
+loc12=Manhattan KMHK KSZ022 071
+loc13=Medicine\\ Lodge KP28 KSZ090 ---
+loc14=Olathe KOJC KSZ105 071
+loc15=Olathe/Ind. KIXD KSZ105 071
+loc16=Russell KRSL KSZ032 070
+loc17=Salina KSLN KSZ049 071
+loc18=Topeka KTOP KSZ039 071
+loc19=Topeka-Forbes\\ Field KFOE KSZ039 071
+loc20=Wichita KICT KSZ083 084
+loc21=Wichita-Jabara K3KM KSZ083 084
+loc22=Wichita-McConnell\\ AFB KIAB KSZ083 084
+
+[US_KY]
+name=Kentucky
+loc0=Bowling\\ Green KBWG KYZ071 087
+loc1=Covington KCVG KYZ092 074
+loc2=Fort\\ Campbell KHOP KYZ017 ---
+loc3=Fort\\ Knox KFTK KYZ028 ---
+loc4=Frankfort KFFT KYZ035 ---
+loc5=Henderson KEHR KYZ018 ---
+loc6=Jackson KJKL KYZ112 087
+loc7=Lexington KLEX KYZ041 074
+loc8=London KLOZ ------ 087
+loc9=Louisville KLOU KYZ030 073
+loc10=Louisville-Standiford\\ Field KSDF KYZ030 073
+loc11=Owensboro KOWB KYZ019 086
+loc12=Paducah KPAH KYZ005 ---
+loc13=Pikeville K5I3 KYZ120 ---
+loc14=Somerset KSME KYZ079 ---
+
+[US_LA]
+name=Lousiana
+loc0=Alexandria KAEX LAZ028 115
+loc1=Alexandria-Esler KESF LAZ028 115
+loc2=Amelia K7R3 ------ ---
+loc3=Barksdale KBAD ------ ---
+loc4=Baton\\ Rouge KBTR LAZ048 121
+loc5=Cameron K7R5 LAZ051 ---
+loc6=Fort\\ Polk-Leesville KPOE LAZ027 115
+loc7=Fourchon K9F2 ------ ---
+loc8=Grand\\ Isle KAXO LAZ061 ---
+loc9=Houma KHUM LAZ066 ---
+loc10=Intracoastal K7R4 LAZ052 ---
+loc11=Lafayette KLFT LAZ044 121
+loc12=Lake\\ Charles KLCH LAZ041 121
+loc13=Monroe KMLU LAZ014 ---
+loc14=New\\ Iberia KARA LAZ053 ---
+loc15=New\\ Orleans KMSY LAZ062 121
+loc16=New\\ Orleans\\ NAS KNBG LAZ062 121
+loc17=New\\ Orleans-Lakefront KNEW LAZ062 121
+loc18=Patterson KPTN ------ ---
+loc19=Salt\\ point KP92 ------ ---
+loc20=Shreveport\\ Downtown KDTN LAZ001 107
+loc21=Shreveport\\ Regional KSHV LAZ001 107
+loc22=South\\ Marsh\\ Island K7R8 LAZ053 ---
+loc23=South\\ Timbalier KS58 ------ ---
+loc24=Venice K7R1 ------ 121
+loc25=Vermillion K9R9 ------ ---
+loc26=Vicksburg KTVR ------ ---
+
+[US_ME]
+name=Maine
+loc0=Augusta KAUG MEZ021 034
+loc1=Bangor KBGR MEZ015 034
+loc2=Bar\\ Harbor KBHB MEZ029 ---
+loc3=Brunswick KNHZ MEZ024 049
+loc4=Caribou KCAR MEZ002 ---
+loc5=Clayton\\ Lake K40B ------ ---
+loc6=Frenchville KFVE MEZ002 ---
+loc7=Fryeburg KIZG ------ ---
+loc8=Greenville K3B1 MEZ010 034
+loc9=Houlton KHUL MEZ002 ---
+loc10=Lewiston KLEW MEZ020 ---
+loc11=Millinocket KMLT MEZ015 ---
+loc12=Portland KPWM MEZ024 049
+loc13=Presque\\ Isle KPQI MEZ002 ---
+loc14=Rockland KRKD MEZ027 ---
+loc15=Sanford KSFM MEZ023 ---
+loc16=Turin K3B5 ------ ---
+loc17=Waterville KWVL MEZ021 ---
+loc18=Wiscasset KIWI MEZ026 ---
+
+[US_MS]
+name=Mississippi
+loc0=Columbus KGTR MSZ031 109
+loc1=Columbus-W\\ Point-Starkville KCBM MSZ031 109
+loc2=Greenville KGLH ------ 108
+loc3=Greenwood KGWO MSZ025 108
+loc4=Gulfport KGPT MSZ081 ---
+loc5=Jackson KJAN MSZ048 108
+loc6=Laurel KPIB MSZ066 ---
+loc7=McComb KMCB MSZ070 ---
+loc8=Meridian KMEI MSZ052 109
+loc9=Meridian-Lauderdale KNMM MSZ052 109
+loc10=Natchez KHEZ MSZ060 ---
+loc11=Tupelo KTUP MSZ016 098
+loc12=Vicksburg KTVR MSZ047 ---
+
+[US_MO]
+name=Missouri
+loc0=Cape\\ Girardeau KCGI MOZ087 ---
+loc1=Columbia KCOU MOZ041 072
+loc2=Fort\\ Leonard KTBN MOZ070 072
+loc3=Grandview KGVW MOZ037 ---
+loc4=Jefferson\\ City KJEF MOZ048 072
+loc5=Joplin KJLN MOZ088 084
+loc6=Kansas\\ City KMKC MOZ037 071
+loc7=Kansas\\ City-Gladstone KMCI MOZ029 071
+loc8=Kirksville KIRK MOZ017 058
+loc9=Poplar\\ Bluff KP02 MOZ109 ---
+loc10=Sedalia KSZL MOZ045 ---
+loc11=Spickard KP35 MOZ015 ---
+loc12=Springfield KSGF MOZ095 084
+loc13=St\\ Joseph KSTJ MOZ020 057
+loc14=St\\ Louis KSTL MOZ064 stl
+loc15=St\\ Louis-Spirit KSUS MOZ064 stl
+loc16=Vichy-Rolla KVIH MOZ058 072
+
+[US_MT]
+name=Montana
+loc0=Billings KBIL MTZ035 ---
+loc1=Bozeman KBZN MTZ015 013
+loc2=Broadus K4BQ MTZ036 ---
+loc3=Butte KBTM MTZ007 013
+loc4=Cut\\ Bank KCTB MTZ010 004
+loc5=Dillon KDLN MTZ008 025
+loc6=Drummond K3DU MTZ006 013
+loc7=Glasgow KGGW MTZ017 ---
+loc8=Glendive KGDV MTZ025 ---
+loc9=Great\\ Falls KGFA MTZ012 004
+loc10=Harlowton K3HT MTZ028 ---
+loc11=Havre KHVR MTZ011 004
+loc12=Helena KHLN MTZ014 013
+loc13=Jordan KJDN MTZ022 ---
+loc14=Kalispell KFCA MTZ003 004
+loc15=Lewistown KLWT MTZ013 013
+loc16=Livingston KLVM MTZ028 013
+loc17=Miles\\ City KMLS MTZ032 ---
+loc18=Missoula KMSO MTZ005 013
+loc19=Monida KMQM ------ ---
+loc20=Sidney KSDY MTZ024 ---
+loc21=Thompson\\ Falls K3TH MTZ004 ---
+loc22=West\\ Yellowstone KWYS MTZ015 025
+loc23=West\\ Yellowstone\\ (2) KWEY MTZ015 025
+loc24=Wolf\\ Point KOLF MTZ020 ---
+
+[US_NE]
+name=Nebraska
+loc0=Ainsworth KANW NEZ008 042
+loc1=Alliance KAIA NEZ003 ---
+loc2=Beatrice KBIE NEZ089 057
+loc3=Broken\\ Bow KBBW NEZ038 056
+loc4=Burwell KK20 ------ ---
+loc5=Chadron KCDR NEZ002 041
+loc6=Columbus KOLU NEZ042 ---
+loc7=Falls\\ City KFNB NEZ093 057
+loc8=Grand\\ Island KGRI NEZ062 056
+loc9=Hastings KHSI NEZ075 056
+loc10=Imperial KIML NEZ069 055
+loc11=Imperial\\ (2) K6V1 NEZ069 055
+loc12=Kearney KEAR NEZ061 ---
+loc13=Lincoln KLNK NEZ066 057
+loc14=McCook KMCK NEZ081 056
+loc15=Mullen KMHN NEZ007 042
+loc16=Norfolk KOFK NEZ031 042
+loc17=North\\ Platte KLBF NEZ059 ---
+loc18=O'Neill KONL NEZ010 042
+loc19=Omaha KOMA NEZ052 057
+loc20=Omaha-Bellevue KOFF NEZ052 057
+loc21=Ord-Sharp KODX NEZ039 ---
+loc22=Scottsbluff KBFF NEZ019 041
+loc23=Sidney KSNY NEZ055 055
+loc24=Valentine KVTN NEZ005 042
+
+[US_NH]
+name=New Hampshire
+loc0=Berlin KBML NHZ002 034
+loc1=Concord KCON NHZ008 049
+loc2=Jaffrey KAFN NHZ011 ---
+loc3=Keene KEEN NHZ011 049
+loc4=Laconia KLCI NHZ009 049
+loc5=Lebanon KLEB NHZ003 049
+loc6=Manchester KMHT NHZ012 049
+loc7=Mt\\ Washington KMWN ------ 034
+loc8=Nashua KASH NHZ012 ---
+loc9=North\\ Conway KCWN ------ ---
+loc10=Portsmouth KPSM NHZ013 049
+loc11=Whitefield KHIE ------ ---
+
+[US_NM]
+name=New Mexico
+loc0=Alamogordo KHMN NMZ024 ---
+loc1=Albuquerque KABQ NMZ009 abq
+loc2=Carlsbad KCNM NMZ028 ---
+loc3=Clayton KCAO NMZ007 ---
+loc4=Clovis-Cannon\\ AFB KCVS NMZ021 ---
+loc5=Corona K4CR NMZ016 ---
+loc6=Cuba\\ Awrs K4SL NMZ002 ---
+loc7=Deming KDMN NMZ031 ---
+loc8=Farmington KFMN NMZ001 081
+loc9=Gallup KGUP NMZ008 093
+loc10=Grants KGNT NMZ008 093
+loc11=Hobbs KHOB NMZ029 ---
+loc12=Las\\ Vegas KLVS NMZ005 abq
+loc13=Los\\ Alamos KLAM NMZ002 081
+loc14=Moriarty K4MY NMZ011 ---
+loc15=Roswell KROW NMZ019 ---
+loc16=Ruidoso-Sierra\\ Blanca KRUI NMZ016 ---
+loc17=Santa\\ Fe KSAF NMZ011 abq
+loc18=Silver\\ City KSVC NMZ022 ---
+loc19=Socorro KONM NMZ015 ---
+loc20=Taos KE23 NMZ004 ---
+loc21=Truth\\ or\\ Consequences KTCS NMZ023 ---
+loc22=Tucumcari KTCC NMZ013 ---
+loc23=Zuni\\ Pueblo KZUN ------ ---
+
+[US_ND]
+name=North Dakota
+loc0=Bismark KBIS NDZ035 016
+loc1=Devils\\ Lake KDVL NDZ015 007
+loc2=Devils\\ Lake\\ (2) KP11 NDZ015 007
+loc3=Dickinson KDIK NDZ033 015
+loc4=Fargo KFAR NDZ039 ---
+loc5=Grand\\ Forks KGFK NDZ027 007
+loc6=Jamestown KJMS NDZ037 016
+loc7=Lidgerwood KP67 NDZ053 ---
+loc8=Minot KMOT NDZ011 007
+loc9=Minot\\ AFB KMIB NDZ011 007
+loc10=Roseglen KP24 NDZ021 ---
+loc11=Williston KISN NDZ009 006
+
+[US_OK]
+name=Oklahoma
+loc0=Altus KLTS OKZ036 ---
+loc1=Ardmore KADM OKZ046 ---
+loc2=Bartlesville KBVO OKZ054 084
+loc3=Clinton KCSM OKZ016 ---
+loc4=Enid KEND OKZ012 ---
+loc5=Enid/Woodring KWDG OKZ012 084
+loc6=Fort\\ Sill KFSI OKZ038 ---
+loc7=Gage KGAG OKZ009 ---
+loc8=Guymon KGUY ------ 082
+loc9=Hobart KHBR OKZ035 095
+loc10=Lawton KLAW OKZ038 ---
+loc11=McAlester KMLC OKZ073 ---
+loc12=Oklahoma\\ City KOKC OKZ025 095
+loc13=Oklahoma\\ City-Bethany KPWA OKZ025 095
+loc14=Oklahoma\\ City-Midwest\\ City KTIK OKZ025 095
+loc15=Page KPGO OKZ076 ---
+loc16=Ponca\\ City KPNC OKZ008 084
+loc17=Stillwater KSWO OKZ020 084
+loc18=Tulsa KTUL OKZ060 084
+
+[US_SD]
+name=South Dakota
+loc0=Aberdeen KABR SDZ006 ---
+loc1=Brookings KBKX SDZ040 ---
+loc2=Chamberlain K9V9 SDZ057 ---
+loc3=Custer K0V1 SDZ029 ---
+loc4=Huron KHON SDZ038 028
+loc5=Lemmon KY22 SDZ002 ---
+loc6=Mitchell KMHE SDZ059 028
+loc7=Mobridge KY26 SDZ009 028
+loc8=Philip KPHP SDZ032 028
+loc9=Pierre KPIR SDZ035 028
+loc10=Rapid\\ City KRAP SDZ031 027
+loc11=Rapid\\ City-Ellsworth\\ AFB KRCA SDZ031 027
+loc12=Redig KREJ SDZ001 ---
+loc13=Sioux\\ Falls KFSD SDZ062 043
+loc14=Watertown KATY SDZ020 ---
+loc15=Yankton KYKN SDZ069 043
+
+[US_UT]
+name=Utah
+loc0=Blanding K4BL UTZ022 067
+loc1=Bryce\\ Canyon KBCE UTZ020 080
+loc2=Bullfrog KU17 UTZ021 ---
+loc3=Cedar\\ City KCDC UTZ016 080
+loc4=Delta KU24 UTZ015 ---
+loc5=Dugway KDPG UTZ005 slc
+loc6=Eagle\\ Range KU16 ------ ---
+loc7=Green\\ River KU28 UTZ013 ---
+loc8=Hanksville K4HV UTZ013 067
+loc9=Logan KLGU UTZ001 ---
+loc10=Milford KMLF UTZ016 ---
+loc11=Ogden KOGD UTZ002 slc
+loc12=Ogden-Hill\\ AFB KHIF UTZ002 slc
+loc13=Price-Carbon KPUC UTZ012 067
+loc14=Provo KPVU UTZ004 slc
+loc15=Roosevelt KU67 UTZ011 ---
+loc16=St.\\ George KSGU UTZ019 080
+loc17=Salt\\ Lake\\ City KSLC UTZ003 slc
+loc18=Vernal KVEL UTZ024 ---
+loc19=Wendover KENV UTZ005 slc
+
+[US_VT]
+name=Vermont
+loc0=Ball\\ Mountain K8B3 ------ ---
+loc1=Burlington KBTV VTZ005 ---
+loc2=Canaan KVT1 ------ ---
+loc3=Enosburg\\ Falls K3B8 ------ ---
+loc4=Montpelier KMPV VTZ008 034
+loc5=Newport KNPV VTZ003 034
+loc6=Pownal K5B5 ------ ---
+loc7=Rutland KRUT VTZ011 ---
+loc8=Springfield KVSF VTZ012 ---
+loc9=St\\ Johnsbury K9B2 VTZ007 ---
+loc10=Waterbury K5B1 ------ ---
+loc11=West\\ Burke KVT2 ------ ---
+loc12=Wilmington K0B0 VTZ014 049
+
+[US_WY]
+name=Wyoming
+loc0=Big\\ Piney KBPI WYZ020 ---
+loc1=Casper KCPR WYZ064 ---
+loc2=Cheyenne KCYS WYZ069 ---
+loc3=Cody KCOD WYZ002 026
+loc4=Douglas K4DG WYZ059 ---
+loc5=Evanston KEVW WYZ021 ---
+loc6=Gillette KGCC WYZ054 026
+loc7=Jackson KJAC WYZ006 ---
+loc8=Lander KLND WYZ012 040
+loc9=Laramie KLAR WYZ066 ---
+loc10=Rawlins KRWL WYZ061 040
+loc11=Riverton KRIW WYZ013 040
+loc12=Rock\\ Springs KRKS WYZ022 ---
+loc13=Sheridan KSHR WYZ099 ---
+loc14=Worland KWRL WYZ009 026
+loc15=Yellowstone KP60 WYZ001 ---
+
+
+[US_PA]
+name=Pennsylvania
+loc0=Allentown KABE PAZ061 062
+loc1=Altoona KAOO PAZ025 061
+loc2=Bradford KBFD PAZ005 047
+loc3=Du\\ Bois KDUJ PAZ017 061
+loc4=Erie KERI PAZ002 047
+loc5=Franklin KFKL PAZ008 061
+loc6=Harrisburg KCXY PAZ057 062
+loc7=Johnstown KJST PAZ024 pit
+loc8=Lancaster KLNS PAZ066 phl
+loc9=Latrobe KLBE PAZ030 pit
+loc10=Middletown KMDT PAZ057 062
+loc11=Muir KMUI PAZ058 062
+loc12=Northeast\\ Philadelphia KPNE PAZ071 phl
+loc13=Philadelphia KPHL PAZ071 phl
+loc14=Philipsburg KPSB PAZ019 061
+loc15=Pittsburgh KPIT PAZ021 pit
+loc16=Pittsburgh-West\\ Mifflin KAGC PAZ021 pit
+loc17=Reading KRDG PAZ060 phl
+loc18=Scranton KAVP PAZ047 062
+loc19=State\\ College KUNV PAZ019 061
+loc20=Wilkes\\ -\\ Barre KAVP PAZ047 062
+loc21=Williamsport KIPT PAZ046 062
+
+[US_CA]
+name=California
+loc0=Alturas KS11 CAZ012 ---
+loc1=Arcata KACV CAZ001 ---
+loc2=Avalon KAVX ------ ---
+loc3=Bakersfield KBFL CAZ021 ---
+loc4=Beaumont KBUO CAZ056 ---
+loc5=Bicycle\\ Lake KBYS ------ ---
+loc6=Bishop KBIH CAZ026 ---
+loc7=Blue\\ Canyon KBLU ------ ---
+loc8=Blythe KBLH CAZ031 ---
+loc9=Burbank KBUR CAZ047 ---
+loc10=Camarillo KCMA CAZ040 ---
+loc11=Campo KCZZ CAZ058 ---
+loc12=Carlsbad KCRQ CAZ043 ---
+loc13=Chico KCIC CAZ016 ---
+loc14=China\\ Lake KNID CAZ028 ---
+loc15=Chino KCNO CAZ048 ---
+loc16=Concord KCCR CAZ007 ---
+loc17=Crescent\\ City KCEC CAZ001 ---
+loc18=Daggett KDAG CAZ028 ---
+loc19=Edwards\\ AFB KEDW CAZ025 ---
+loc20=El\\ Centro KNJK CAZ033 ---
+loc21=El\\ Monte KEMT CAZ047 ---
+loc22=Fairfield KSUU CAZ018 ---
+loc23=Fresno KFAT CAZ020 078
+loc24=Fresno-Chandler KFCH CAZ020 078
+loc25=Fullerton KFUL CAZ042 ---
+loc26=Hawthorne KHHR CAZ041 ---
+loc27=Hayward KHWD CAZ007 ---
+loc28=Imperial KIPL CAZ033 ---
+loc29=Imperial\\ Beach KNRS CAZ043 ---
+loc30=Inyokern KIYK CAZ025 ---
+loc31=La\\ Verne KPOC CAZ047 ---
+loc32=Lake\\ Tahoe KTVL CAZ072 ---
+loc33=Lancaster KWJF CAZ059 ---
+loc34=Lemoore KNLC CAZ021 ---
+loc35=Livermore KLVK CAZ007 ---
+loc36=Lompoc KLPC CAZ035 ---
+loc37=Long\\ Beach KLGB CAZ041 lax
+loc38=Los\\ Angeles KLAX CAZ041 lax
+loc39=Mammoth\\ Lakes KMMH CAZ073 ---
+loc40=Marysville KMYV CAZ016 ---
+loc41=Marysville-Beale\\ AFB KBAB CAZ016 ---
+loc42=McClellan KMCC ------ ---
+loc43=Merced KMCE CAZ020 ---
+loc44=Modesto KMOD CAZ019 ---
+loc45=Mojave KMHV CAZ024 ---
+loc46=Montague KSIY CAZ011 ---
+loc47=Monterey KMRY CAZ009 ---
+loc48=Mount\\ Shasta KMHS CAZ011 ---
+loc49=Mount\\ Wilson KMWS CAZ047 ---
+loc50=Mountain\\ View KNUQ CAZ006 sfo
+loc51=Napa KAPC CAZ064 ---
+loc52=Needles KEED CAZ029 ---
+loc53=Oakland KOAK CAZ007 sfo
+loc54=Oceanside KNFG CAZ043 ---
+loc55=Ontario KONT CAZ048 lax
+loc56=Oxnard KOXR CAZ040 ---
+loc57=Palm\\ Springs KPSP CAZ061 ---
+loc58=Palmdale KPMD CAZ054 ---
+loc59=Palo\\ Alto KPAO CAZ006 sfo
+loc60=Paso\\ Robles KPRB CAZ037 ---
+loc61=Point\\ Mugu KNTD ------ ---
+loc62=Point\\ Piedras\\ Blanca K87Q ------ ---
+loc63=Porterville KPTV CAZ021 ---
+loc64=Red\\ Bluff KRBL CAZ015 ---
+loc65=Redding KRDD CAZ013 ---
+loc66=Riverside KRAL CAZ048 ---
+loc67=Riverside/March\\ AFB KRIV CAZ061 ---
+loc68=Sacramento KSAC CAZ017 ---
+loc69=Sacramento-Woodland KSMF CAZ017 ---
+loc70=Salinas KSNS CAZ009 ---
+loc71=San\\ Carlos KSQL CAZ006 ---
+loc72=San\\ Diego KSAN CAZ043 san
+loc73=San\\ Diego-Santee KSEE CAZ050 san
+loc74=San\\ Diego-Brown KSDM CAZ050 san
+loc75=San\\ Diego-Miramar KNKX CAZ043 san
+loc76=San\\ Diego-Montgomery KMYF CAZ043 san
+loc77=San\\ Diego-North\\ Island KNZY ------ san
+loc78=San\\ Francisco KSFO CAZ006 sfo
+loc79=San\\ Jose-Santa\\ Clara KSJC CAZ008 sfo
+loc80=San\\ Luis\\ Obispo KSBP CAZ034 ---
+loc81=San\\ Nicholas\\ Island KNSI CAZ039 ---
+loc82=Sandberg KSDB ------ ---
+loc83=Santa\\ Ana KSNA CAZ042 lax
+loc84=Santa\\ Barbara KSBA CAZ039 lax
+loc85=Santa\\ Maria KSMX CAZ035 090
+loc86=Santa\\ Monica KSMO CAZ041 ---
+loc87=Santa\\ Rosa KSTS CAZ005 ---
+loc88=Shelter\\ Cove KO87 CAZ001 ---
+loc89=Stockton KSCK CAZ019 ---
+loc90=Tahoe\\ Valley KTVL ------ ---
+loc91=Torrance KTOA CAZ042 lax
+loc92=Truckee KTRK CAZ072 ---
+loc93=Twentynine\\ Palms KNXP CAZ028 ---
+loc94=Ukiah KUKI CAZ003 ---
+loc95=Van\\ Nuys KVNY CAZ047 ---
+loc96=Vandenberg\\ AFB KVBG CAZ039 ---
+loc97=Vandenberg\\ Range KVBG CAZ039 ---
+loc98=Visalia KVIS CAZ021 ---
+
+[US_AL]
+name=Alabama
+loc0=Anniston KANB ALZ019 ---
+loc1=Auburn KAUO ALZ047 ---
+loc2=Birmingham KBHM ALZ024 019
+loc3=Decatur KDCU ------ ---
+loc4=Dothan KDHN ALZ066 ---
+loc5=Evergreen KGZH ------ ---
+loc6=Gadsden KGAD ALZ018 ---
+loc7=Huntsville KHSV ALZ006 ---
+loc8=Mobile\\ Regional\\ Airport KMOB ALZ061 ---
+loc9=Mobile\\ Downtown KBFM ALZ061 ---
+loc10=Montgomery KMGM ALZ044 109
+loc11=Montgomery-Maxwell\\ AFB KMXF ALZ044 109
+loc12=Muscle\\ Shoals KMSL ALZ002 ---
+loc13=Ozark KOZR ALZ066 ---
+loc14=Tuscaloosa KTCL ALZ023 ---
+
+[US_AZ]
+name=Arizona
+loc0=Casa\\ Granda KCGZ AZZ028 ---
+loc1=Chandler KIWA AZZ015 ---
+loc2=Douglas KDUG AZZ030 ---
+loc3=Flagstaff KFLG AZZ015 092
+loc4=Fort\\ Huachuca KFHU AZZ035 ---
+loc5=Gila\\ Bend KGBN AZZ027 ---
+loc6=Grand\\ Canyon KGCN AZZ006 ---
+loc7=Kingman KIGM AZZ003 ---
+loc8=Mesa-Falcon\\ Field KFFZ AZZ023 ---
+loc9=Nogales K13A AZZ034 ---
+loc10=Page KPGA AZZ005 ---
+loc11=Payson K0E4 AZZ018 ---
+loc12=Phoenix KPHX AZZ023 phx
+loc13=Phoenix-Deer\\ Valley KDVT AZZ023 phx
+loc14=Phoenix-Goodyear KGYR AZZ023 phx
+loc15=Phoenix-Luke\\ AFB KLUF AZZ023 phx
+loc16=Prescott KPRC AZZ008 ---
+loc17=Safford-Municipal\\ Airport KSAD AZZ030 ---
+loc18=Scottsdale KSDL AZZ023 ---
+loc19=Show\\ Low KSOW AZZ017 ---
+loc20=Tucson KTUS AZZ033 103
+loc21=Tucson-Davis\\ AFB KDMA AZZ033 103
+loc22=Winslow KINW AZZ013 ---
+loc23=Yuma\\ MCAS KNYL AZZ025 ---
+
+[US_CO]
+name=Colorado
+loc0=Air\\ Force KAFF COZ071 ---
+loc1=Akron KAKO COZ049 ---
+loc2=Alamosa KALS COZ063 ---
+loc3=Aspen KASE COZ010 068
+loc4=Colorado\\ Springs KCOS COZ071 ---
+loc5=Cortez KCEZ COZ021 ---
+loc6=Craig KCAG COZ002 ---
+loc7=Denver KDEN COZ040 den
+loc8=Denver-Aurora KAPA COZ040 den
+loc9=Denver-Broomfield KBKF COZ040 den
+loc10=Denver-Cherry\\ Knolls KBJC COZ040 den
+loc11=Durango KDRO COZ022 ---
+loc12=Durango\\ Awrs K4V5 COZ022 ---
+loc13=Eagle KEGE COZ010 ---
+loc14=Fort\\ Carson KFCS COZ071 ---
+loc15=Fort\\ Collins KFCL COZ035 ---
+loc16=Fort\\ Collins/Lovel KFNL COZ035 ---
+loc17=Grand\\ Junction KGJT COZ006 ---
+loc18=Greeley KGXY COZ043 ---
+loc19=Gunnison KGUC COZ012 ---
+loc20=Gunnison\\ (2) K2V9 COZ012 ---
+loc21=Hayden KHDN COZ005 ---
+loc22=La\\ Junta KLHX COZ076 ---
+loc23=Lamar K4LJ COZ080 ---
+loc24=Leadville KLXV COZ012 ---
+loc25=Limon KLIC COZ047 ---
+loc26=Montrose KMTJ COZ017 ---
+loc27=Montrose\\ (2) K6V8 COZ017 ---
+loc28=Pueblo KPUB COZ073 ---
+loc29=Rifle K1V1 COZ003 ---
+loc30=Salida KS29 COZ069 ---
+loc31=Salida-Harriet K0V2 COZ069 ---
+loc32=Steamboat\\ Springs KSBS COZ005 ---
+loc33=Trinidad KTAD COZ077 ---
+loc34=Winter\\ Park KC96 COZ033 ---
+
+[US_CT]
+name=Connecticut
+loc0=Bridgeport KBDR CTZ009 hfd
+loc1=Danbury KDXR CTZ009 ---
+loc2=Groton KGON CTZ012 hfd
+loc3=Hartford KHFD CTZ002 hfd
+loc4=New\\ Haven KHVN CTZ010 ---
+loc5=Oxford KOXC CTZ010 ---
+loc6=Windsor\\ Locks KBDL CTZ002 ---
+
+[US_DE]
+name=Delaware
+loc0=Dover KDOV DEZ002 076
+loc1=Wilmington KILG DEZ001 076
+
+[US_FL]
+name=Florida
+loc0=Apalachicola KAQQ FLZ015 ---
+loc1=Bartow KBOW ------ ---
+loc2=Brooksville KBKV FLZ048 ---
+loc3=Cecil\\ NAS KNZC FLZ025 ---
+loc4=Cocoa\\ Beach KCOF FLZ047 ---
+loc5=Crestview KCEW FLZ006 ---
+loc6=Cross\\ City KCTY FLZ034 ---
+loc7=Daytona\\ Beach KDAB FLZ041 ---
+loc8=Destin KDTS ------ ---
+loc9=Eglin KEGI FLZ006 ---
+loc10=Fort\\ Lauderdale\\ (International) KFLL FLZ072 ---
+loc11=Fort\\ Lauderdale KFXE FLZ072 ---
+loc12=Fort\\ Myers\\ (Page\\ Field) KFMY FLZ065 ---
+loc13=Fort\\ Myers\\ (Southwest\\ Florida\\ International) KRSW FLZ065 ---
+loc14=Gainesville KGNV FLZ036 ---
+loc15=Homestead\\ AFB KHST FLZ074 ---
+loc16=Hurlburt KHRT ------ ---
+loc17=Jacksonville KJAX FLZ025 ---
+loc18=Jacksonville\\ NAS KNIP FLZ025 ---
+loc19=Jacksonville-Craig\\ Airport KCRG FLZ025 ---
+loc20=Key\\ West KEYW FLZ075 ---
+loc21=Key\\ West\\ NAS KNQX FLZ075 ---
+loc22=Lakeland KLAL FLZ052 ---
+loc23=Leesburg KLEE ------ ---
+loc24=Marathon KMTH FLZ075 ---
+loc25=Marianna KMAI FLZ011 ---
+loc26=Mayport KNRB FLZ025 ---
+loc27=Melbourne KMLB FLZ047 ---
+loc28=Miami KMIA FLZ074 mia
+loc29=Miami-Kendall KTMB FLZ074 mia
+loc30=Miami-Opa\\ Locka KOPF FLZ074 mia
+loc31=Milton KNSE FLZ004 ---
+loc32=Nasa\\ Shuttle KTTS ------ ---
+loc33=Naples KAPF FLZ069 ---
+loc34=New\\ Port\\ Richey KRRF FLZ051 ---
+loc35=Ocala KOCF FLZ040 ---
+loc36=Orlando KORL FLZ045 ---
+loc37=Orlando\\ (Orlando\\ International) KMCO FLZ045 ---
+loc38=Panama\\ City KPFN FLZ012 ---
+loc39=Pensacola KPNS FLZ002 ---
+loc40=Pensacola\\ NAS KNPA FLZ002 ---
+loc41=Perry-Foley K40J ------ ---
+loc42=Pompano\\ Beach KPMP ------ ---
+loc43=Punta\\ Gorda KPGD ------ ---
+loc44=Sanford KSFB FLZ046 ---
+loc45=Sarasota KSRQ FLZ060 ---
+loc46=St\\ Petersburg KSPG FLZ050 ---
+loc47=St\\ Petersburg\\ /\\ Clearwater KPIE FLZ050 ---
+loc48=Tallahassee KTLH FLZ017 ---
+loc49=Tampa KTPA FLZ051 ---
+loc50=Tampa-Macdill\\ AFB KMCF FLZ051 ---
+loc51=Titusville KTIX FLZ047 ---
+loc52=Tyndall\\ AFB KPAM ------ ---
+loc53=Valparaiso KVPS FLZ006 ---
+loc54=Valparaiso-Eglin\\ AFB KEGI FLZ006 ---
+loc55=Vero\\ Beach KVRB FLZ054 ---
+loc56=West\\ Palm\\ Beach KPBI FLZ068 ---
+loc57=Winter\\ Haven KGIF ------ ---
+
+[US_GA]
+name=Georgia
+loc0=Albany KABY GAZ125 ---
+loc1=Alma KAMG GAZ134 ---
+loc2=Athens KAHN GAZ036 atl
+loc3=Atlanta KATL GAZ033 atl
+loc4=Augusta KAGS GAZ065 ---
+loc5=Brunswick KSSI GAZ154 ---
+loc6=Columbus KCSG GAZ089 ---
+loc7=Columbus-Fort\\ Benning KLSF GAZ089 ---
+loc8=Dekalb/Peachtree KPDK ------ ---
+loc9=Hinesville KLHW ------ ---
+loc10=Fort\\ Benning KLSF GAZ090 ---
+loc11=Fort\\ Stewart KLHW GAZ138 ---
+loc12=Macon KMCN GAZ082 ---
+loc13=Marietta KMGE GAZ032 ---
+loc14=Moultrie KMGR ------ ---
+loc15=Rome-Russell KRMG GAZ019 atl
+loc16=Savannah KSAV GAZ119 ---
+loc17=Savannah-Hunter\\ AAF KSVN GAZ119 ---
+loc18=St\\ Simon's\\ Island KSSI GAZ154 ---
+loc19=Valdosta KVLD GAZ160 ---
+loc20=Valdosta-Moody\\ AFB KVAD GAZ160 ---
+loc21=Warner\\ Robins KWRB GAZ095 ---
+loc22=West\\ Atlanta KFTY GAZ033 ---
+loc23=Waycross KAYS GAZ151 ---
+
+[US_HI]
+name=Hawaii
+loc0=Barbers\\ Point PHNA HIZ002 ---
+loc1=Barking\\ Sand PHBK ------ ---
+loc2=Bradshaw\\ Field PHSF ------ ---
+loc3=Hilo PHTO HIZ004 ---
+loc4=Honolulu PHNL HIZ002 ---
+loc5=Kahului PHOG HIZ003 ---
+loc6=Kailua-Kona PHKO HIZ002 ---
+loc7=Kaneohe PHNG HIZ002 ---
+loc8=Lahaina PHJH HIZ003 ---
+loc9=Lanai PHNY HIZ003 ---
+loc10=Lihue PHLI HIZ001 ---
+loc11=Molokai PHMK HIZ005 ---
+loc12=Oahu PHHI HIZ002 ---
+
+[US_IL]
+name=Illinois
+loc0=Alton KALN ILZ100 ---
+loc1=Aurora KARR ILZ013 ---
+loc2=Belleville KBLV ILZ101 ---
+loc3=Bloomington KBMI ILZ038 ---
+loc4=Cairo KCIR ILZ092 ---
+loc5=Carbondale KMDH ILZ084 ---
+loc6=Champaign KCMI ILZ045 059
+loc7=Chicago-DuPage KDPA ILZ014 ord
+loc8=Chicago-O'Hare KORD ILZ013 ord
+loc9=Chicago-Lakefront KCGX ILZ014 ord
+loc10=Chicago-Midway KMDW ILZ014 ord
+loc11=Danville KDNV ILZ046 ---
+loc12=Decatur KDEC ILZ053 ---
+loc13=East\\ St\\ Louis KCPS ILZ101 ---
+loc14=Galesburg KGBG ILZ027 ---
+loc15=Marion KMWA ILZ085 ---
+loc16=Marseilles KMMO ILZ019 ---
+loc17=Mattoon KMTO ILZ056 ---
+loc18=Moline-Quad\\ Cities KMLI ILZ015 ---
+loc19=Mount\\ Vernon KMVN ILZ075 ---
+loc20=Peoria KPIA ILZ029 ---
+loc21=Quincy KUIN ILZ095 ---
+loc22=Rockford KRFD ILZ003 ---
+loc23=Salem KSLO ILZ070 ---
+loc24=Springfield KSPI ILZ051 ---
+
+[US_IN]
+name=Indiana
+loc0=Bloomington KBMG INZ062 ---
+loc1=Elkhart KEKM INZ005 ---
+loc2=Evansville KEVV INZ086 ---
+loc3=Fort\\ Wayne KFWA INZ018 ---
+loc4=Gary KGYY INZ001 ---
+loc5=Indianapolis KIND INZ047 ---
+loc6=Lafayette KLAF INZ029 ---
+loc7=Marion KMZZ ------ ---
+loc8=Muncie KMIE INZ041 ---
+loc9=Peru KGUS INZ023 ---
+loc10=South\\ Bend KSBN INZ004 ---
+loc11=Terre\\ Haute KHUF INZ051 ---
+
+[US_MD]
+name=Maryland
+loc0=Aberdeen KAPG ------ ---
+loc1=Andrews\\ AFB KADW MDZ013 ---
+loc2=Baltimore KMTN MDZ011 dca
+loc3=Baltimore-Glen\\ Burnie KBWI MDZ014 dca
+loc4=Cumberland KCBE ------ ---
+loc5=Fort\\ Meade KFME MDZ014 ---
+loc6=Hagerstown KHGR MDZ003 ---
+loc7=Oakland K2G4 ------ 075
+loc8=Patuxent\\ River KNHK MDZ014 ---
+loc9=Salisbury KSBY MDZ022 ---
+
+[US_MI]
+name=Michigan
+loc0=Ann\\ Arbor KARB MIZ075 dtw
+loc1=Alpena KAPN MIZ024 ---
+loc2=Battle\\ Creek KBTL MIZ073 ---
+loc3=Benton\\ Harbor KBEH ------ ---
+loc4=Chippewa\\ County KCIU MIZ008 ---
+loc5=Copper\\ Harbor KP59 MIZ003 ---
+loc6=Detroit KDET MIZ076 dtw
+loc7=Detroit-Taylor KDTW MIZ076 dtw
+loc8=Detroit/Ypsilanti KYIP MIZ075 dtw
+loc9=Escanaba KESC MIZ013 ---
+loc10=Flint KFNT MIZ061 dtw
+loc11=Grand\\ Rapids KGRR MIZ057 ---
+loc12=Hancock KCMX MIZ003 ---
+loc13=Harbor\\ Beach KP58 MIZ049 ---
+loc14=Houghton\\ Lake KHTL MIZ034 ---
+loc15=Iron\\ Mountain KIMT MIZ011 ---
+loc16=Ironwood KIWD MIZ009 ---
+loc17=Jackson KJXN MIZ074 dtw
+loc18=Kalamazoo KAZO MIZ072 045
+loc19=Lansing KLAN MIZ066 ---
+loc20=Manistee KMBL MIZ031 ---
+loc21=Marquette KMQT MIZ005 ---
+loc22=Menominee KMNM MIZ012 ---
+loc23=Mount\\ Clemens KMTC MIZ070 ---
+loc24=Muskegon KMKG MIZ050 ---
+loc25=Oscoda KOSC MIZ036 ---
+loc26=Pellston KPLN MIZ016 ---
+loc27=Pontiac KPTK MIZ069 ---
+loc28=Saginaw KMBS MIZ053 ---
+loc29=Sault\\ Ste\\ Marie KSSM MIZ008 ---
+loc30=Sawyer\\ AFB KSAW MIZ077 ---
+loc31=Seul\\ Choix\\ Pt KP75 ------ ---
+loc32=Traverse\\ City KTVC MIZ020 ---
+loc33=Ypsilanti KYIP MIZ075 dtw
+
+[US_MN]
+name=Minnesota
+loc0=Alexandria KAXN MNZ041 ---
+loc1=Bemidji KBJI MNZ009 ---
+loc2=Brainerd KBRD MNZ034 ---
+loc3=Detroit\\ Lakes KDTL MNZ027 ---
+loc4=Duluth KDLH MNZ019 ---
+loc5=Ely KELO MNZ019 ---
+loc6=Fairmont KFRM MNZ091 ---
+loc7=Fergus\\ Falls KFFM MNZ031 ---
+loc8=Grand\\ Marais KP61 MNZ021 ---
+loc9=Grand\\ Rapids KGPZ MNZ026 ---
+loc10=Hibbing KHIB MNZ019 ---
+loc11=International\\ Falls KINL MNZ010 ---
+loc12=Litchfield KY69 MNZ058 ---
+loc13=Mankato KMKT MNZ083 ---
+loc14=Marshall KMML MNZ072 ---
+loc15=Minneapolis KMSP MNZ060 msp
+loc16=Minneapolis\\ [2] KFCM MNZ060 msp
+loc17=Minneapolis\\ [3] KMIC MNZ060 msp
+loc18=Pequot\\ Lakes KP39 MNZ034 ---
+loc19=Redwood\\ Falls KRWF MNZ073 ---
+loc20=Rochester KRST MNZ087 030
+loc21=St\\ Cloud KSTC MNZ051 ---
+loc22=St\\ Paul KSTP MNZ062 ---
+loc23=Thief\\ River\\ Falls KTVF MNZ013 ---
+loc24=Warroad KD45 MNZ005 ---
+loc25=Worthington KOTG MNZ089 ---
+
+[US_NV]
+name=Nevada
+loc0=Austin KU31 NVZ012 ---
+loc1=Battle\\ Mountain KBAM NVZ012 ---
+loc2=Caliente KP38 NVZ015 ---
+loc3=Desert\\ Rock KDRA ------ ---
+loc4=Elko KEKO NVZ008 ---
+loc5=Ely KELY NVZ011 ---
+loc6=Eureka KP68 NVZ012 ---
+loc7=Fallon KNFL NVZ004 ---
+loc8=Hawthorne KHTH NVZ001 ---
+loc9=Indian\\ Springs KL63 NVZ017 ---
+loc10=Las\\ Vegas KLAS NVZ020 079
+loc11=N\\ Las\\ Vegas KLSV NVZ020 079
+loc12=Lovelock KLOL NVZ004 ---
+loc13=Owyhee KOWY NVZ007 ---
+loc14=Reno KRNO NVZ003 065
+loc15=Tonopah KTPH NVZ014 ---
+loc16=Winnemucca KWMC NVZ006 ---
+
+[US_NJ]
+name=New Jersey
+loc0=Atlantic\\ City KACY NJZ022 ---
+loc1=Belmar-Farmingdale KBLM NJZ013 ---
+loc2=Caldwell KCDW NJZ005 ---
+loc3=Lakehurst KNEL ------ ---
+loc4=Millville KMIV NJZ021 ---
+loc5=Morristown KMMU NJZ008 ---
+loc6=Mount\\ Holly KVAY ------ ---
+loc7=Newark KEWR NJZ005 ---
+loc8=Teterboro KTEB NJZ003 ---
+loc9=Trenton KTTN NJZ015 ---
+loc10=Wildwood KWWD NJZ024 ---
+loc11=Wrightstown\\ /\\ Mcguire\\ AFB KWRI NJZ019 ---
+
+[US_NC]
+name=North Carolina
+loc0=Asheville KAVL NCZ053 ---
+loc1=Cape\\ Hatteras KHAT NCZ047 ---
+loc2=Charlotte KCLT NCZ071 100
+loc3=Cherry\\ Point KNKT ------ ---
+loc4=Elizabeth\\ City KECG NCZ016 ---
+loc5=Fayetteville KFAY NCZ088 100
+loc6=Fort\\ Bragg KFBG NCZ088 ---
+loc7=Goldsboro KGSB NCZ078 ---
+loc8=Greensboro KGSO NCZ022 rdu
+loc9=Hickory KHKY NCZ056 ---
+loc10=Hoffman KHFF ------ ---
+loc11=Hot\\ Springs KHSS NCZ048 ---
+loc12=Jacksonville KOAJ NCZ098 ---
+loc13=Kinston KISO NCZ091 ---
+loc14=New\\ Bern KEWN NCZ093 ---
+loc15=New\\ River KNCA NCZ098 ---
+loc16=Pope\\ AFB KPOB NCZ088 ---
+loc17=Raleigh-Durham KRDU NCZ041 rdu
+loc18=Rocky\\ Mount KRWI NCZ028 rdu
+loc19=Stumpy\\ Point K2DP ------ ---
+loc20=Wilmington KILM NCZ101 ---
+loc21=Winston-Salem KINT NCZ021 ---
+
+[US_OH]
+name=Ohio
+loc0=Akron KCAK OHZ021 ---
+loc1=Cincinnati KLUK OHZ077 074
+loc2=Cleveland KCLE OHZ011 cle
+loc3=Cleveland-Lakefront KBKL OHZ011 cle
+loc4=Cleveland/Cuyahoga KCGF OHZ011 cle
+loc5=Columbus-Gahanna KCMH OHZ055 ---
+loc6=Columbus-OSU KOSU OHZ055 ---
+loc7=Dayton KDAY OHZ061 074
+loc8=Dayton-Fairborn KFFO OHZ061 ---
+loc9=Dayton-South\\ Airport KMGY OHZ061 ---
+loc10=Findlay KFDY OHZ017 ---
+loc11=Hamilton KHAO OHZ070 ---
+loc12=Lancaster KLHQ OHZ067 ---
+loc13=Mansfield KMFD OHZ029 ---
+loc14=Rickenbacker KLCK OHZ070 ---
+loc15=Toledo KTOL OHZ003 ---
+loc16=Willoughby KLNN OHZ012 ---
+loc17=Wilmington KILN OHZ072 ---
+loc18=Wooster KBJJ OHZ031 ---
+loc19=Youngstown KYNG OHZ033 ---
+loc20=Zanesville KZZV OHZ057 ---
+
+[US_OR]
+name=Oregon
+loc0=Astoria KAST ORZ001 ---
+loc1=Aurora K3S2 ORZ005 ---
+loc2=Baker\\ City KBKE ORZ020 ---
+loc3=Brookings K4BK ORZ003 ---
+loc4=Burns KBNO ORZ022 ---
+loc5=Cascade KCZK ORZ015 ---
+loc6=Eugene KEUG ORZ006 ---
+loc7=Hillsboro KHIO ORZ004 ---
+loc8=Klamath\\ Falls KLMT ORZ012 ---
+loc9=Lakeview K4LW ORZ015 ---
+loc10=Meacham KMEH ORZ017 ---
+loc11=Medford KMFR ORZ008 ---
+loc12=Newport KONP ORZ002 ---
+loc13=North\\ Bend KOTH ORZ003 ---
+loc14=Ontario KONO ORZ021 ---
+loc15=Pendleton KPDT ORZ017 ---
+loc16=Portland KPDX ORZ004 ---
+loc17=Redmond KRDM ORZ014 ---
+loc18=Roseburg KRBG ORZ007 ---
+loc19=Salem KSLE ORZ005 ---
+loc20=Sexton\\ Summit KSXT ORZ008 ---
+loc21=The\\ Dalles KDLS ORZ010 ---
+loc22=Troutdale KTTD ORZ004 ---
+
+[US_RI]
+name=Rhode Island
+loc0=Block\\ Island KBID RIZ006 ---
+loc1=North\\ Kingstown KOQU RIZ006 ---
+loc2=Providence KPVD RIZ002 bos
+
+[US_SC]
+name=South Carolina
+loc0=Anderson KAND SCZ010 099
+loc1=Beaufort KNBC SCZ048 ---
+loc2=Charleston KCHS SCZ050 ---
+loc3=Columbia KCAE SCZ028 100
+loc4=Columbia-McEntire KMMT SCZ028 100
+loc5=Florence KFLO SCZ032 ---
+loc6=Greenville KGMU SCZ006 099
+loc7=Greenville-Spartanburg KGSP SCZ007 099
+loc8=Myrtle\\ Beach KMYR SCZ034 ---
+loc9=N\\ Myrtle\\ Beach KCRE SCZ034 ---
+loc10=Sumter KSSC SCZ031 ---
+loc11=Sumter\\ (2) K2PJ SCZ031 ---
+
+[US_TN]
+name=Tennessee
+loc0=Bristol KTRI TNZ017 ---
+loc1=Chattanooga KCHA TNZ099 ---
+loc2=Crossville KCSV TNZ066 ---
+loc3=Dyersburg KDYR TNZ019 ---
+loc4=Jackson KMKL TNZ052 ---
+loc5=Knoxville KTYS TNZ069 087
+loc6=Knoxville-Downtown KDKX TNZ069 087
+loc7=Memphis KMEM TNZ088 097
+loc8=Memphis-NAS KNQA TNZ088 097
+loc9=Nashville KBNA TNZ027 ---
+loc10=Smyrna KMQY TNZ062 ---
+
+[US_TX]
+name=Texas
+loc0=Abilene KABI TXZ127 ---
+loc1=Alice KALI TXZ241 ---
+loc2=Amarillo KAMA TXZ017 ---
+loc3=Angleton KLBX ------ ---
+loc4=Arlington KF54 TXZ119 ---
+loc5=Austin KAUS TXZ192 113
+loc6=Beaumont-Port\\ Arthur KBPT TXZ215 ---
+loc7=Bergstrom\\ AFB KBSM TXZ192 ---
+loc8=Borger KBGD TXZ008 ---
+loc9=Brownsville KBRO TXZ255 ---
+loc10=Burnet KBMQ ------ ---
+loc11=Childress KCDS TXZ026 ---
+loc12=College\\ Station KCLL TXZ196 ---
+loc13=Conroe KCXO ------ ---
+loc14=Corpus\\ Christi KCRP TXZ243 ---
+loc15=Corpus\\ Christi\\ NAS KNGP TXZ243 ---
+loc16=Corsicana KCRS TXZ146 ---
+loc17=Cotulla KCOT TXZ229 119
+loc18=Dalhart KDHT TXZ001 ---
+loc19=Dallas-Addison KADS TXZ119 ---
+loc20=Dallas-Fort\\ Worth KDFW TXZ119 ---
+loc21=Dallas-Love\\ Field KDAL TXZ119 ---
+loc22=Dallas-Redbird KRBD TXZ119 ---
+loc23=Del\\ Rio KDRT TXZ183 ---
+loc24=Denton KDTO ------ ---
+loc25=El\\ Paso KELP TXZ055 ---
+loc26=Fort\\ Stockton KFST TXZ075 ---
+loc27=Fort\\ Worth-Meacham KFTW TXZ118 ---
+loc28=Fort\\ Worth\\ NAS KNFW TXZ118 ---
+loc29=Fort\\ Worth-Alliance KAFW TXZ118 ---
+loc30=Galveston KGLS TXZ238 ---
+loc31=Georgetown KGTU TXZ173 ---
+loc32=Greenville KGVT ------ ---
+loc33=Guadalupe\\ Pass KGDP TXZ234 ---
+loc34=Harlingen KHRL TXZ255 ---
+loc35=Hondo KHDO TXZ204 ---
+loc36=Houston-Bush KIAH TXZ213 hou
+loc37=Houston-Hooks KDWH TXZ213 hou
+loc38=Houston-Ellington\\ Field KEFD TXZ213 hou
+loc39=Houston-Clover KT02 TXZ213 hou
+loc40=Houston-Hobby KHOU TXZ213 hou
+loc41=Huntsville KUTS ------ ---
+loc42=Junction KJCT TXZ169 ---
+loc43=Killeen KILE TXZ158 113
+loc44=Killeen-Ft\\ Hood KHLR TXZ158 113
+loc45=Killeen-Gray\\ AAF KGRK TXZ158 113
+loc46=Kingsville KNQI TXZ242 ---
+loc47=Laredo KLRD TXZ239 ---
+loc48=Laughlin KDLF ------ ---
+loc49=Longview KGGG TXZ138 ---
+loc50=Lubbock KLBB TXZ035 ---
+loc51=Lufkin KLFK TXZ165 ---
+loc52=Mc\\ Gregor KPWG ------ ---
+loc53=McAllen KMFE TXZ253 ---
+loc54=Midland KMAF TXZ062 ---
+loc55=Mineral\\ Wells KMWL TXZ117 ---
+loc56=Nacogdoches KOCH TXZ152 ---
+loc57=New\\ Braunfels K3R5 TXZ207 ---
+loc58=Palacios KPSX TXZ236 ---
+loc59=Paris KPRX TXZ095 ---
+loc60=Randolph\\ AFB KRND ------ ---
+loc61=Rockport KRKP TXZ245 ---
+loc62=Sabine\\ Pass KRPE ------ ---
+loc63=San\\ Angelo KSJT TXZ072 ---
+loc64=San\\ Antonio KSAT TXZ205 119
+loc65=San\\ Antonio-Kelly\\ AFB KSKF TXZ205 119
+loc66=San\\ Antonio-Stinson KSSF TXZ205 119
+loc67=Sanderson KP07 TXZ082 ---
+loc68=Sherman-Denison KF39 TXZ093 ---
+loc69=Temple KTPL TXZ158 ---
+loc70=Terrell KTRL ------ ---
+loc71=Tyler KTYR TXZ136 ---
+loc72=Victoria KVCT TXZ234 ---
+loc73=Waco KACT TXZ159 ---
+loc74=Wichita\\ Falls KSPS TXZ086 ---
+loc75=Wink KINK TXZ060 ---
+
+[US_VA]
+name=Virginia
+loc0=Abingdon KVJI VAZ008 ---
+loc1=Ashland KOFP VAZ063 ---
+loc2=Charlottesville KCHO VAZ037 ---
+loc3=Danville KDAN VAZ044 ---
+loc4=Dublin KPSK VAZ013 ---
+loc5=Farmville KFVX VAZ061 ---
+loc6=Fort\\ Belvoir KDAA VAZ053 ---
+loc7=Fort\\ Eustis KFAF ------ ---
+loc8=Franklin KFKN VAZ092 ---
+loc9=Galax-Hillsville KHLX VAZ016 ---
+loc10=Hampton KLFI VAZ094 ---
+loc11=Hot\\ Springs KHSP VAZ020 ---
+loc12=Langley\\ AFB KLFI VAZ094 ---
+loc13=Leesburg KJYO VAZ042 ---
+loc14=Lynchburg KLYH VAZ045 ---
+loc15=Manassas KHEF VAZ052 ---
+loc16=Marion-Wytheville KMKJ VAZ009 ---
+loc17=Martinsville KMTV VAZ043 ---
+loc18=Melfa KMFV VAZ099 ---
+loc19=Newport\\ News KPHF VAZ093 ---
+loc20=Norfolk KORF VAZ093 089
+loc21=Norfolk\\ NAS KNGU VAZ093 089
+loc22=Petersburg KPTB VAZ081 ---
+loc23=Quantico KNYG VAZ052 ---
+loc24=Richmond KRIC VAZ071 089
+loc25=Roanoke KROA VAZ022 ---
+loc26=Shannon KEZF ------ ---
+loc27=Staunton KSHD VAZ025 ---
+loc28=Virginia\\ Beach KNTU VAZ098 ---
+loc29=Virginia\\ Tech\\ Airport KBCB VAZ014 ---
+loc30=Wakefield KAKQ VAZ088 ---
+loc31=Wallops\\ Island KWAL ------ ---
+loc32=Waynesboro KSHD VAZ025 ---
+loc33=Winchester KOKV VAZ028 ---
+loc34=Wise KLNP VAZ002 ---
+
+[US_WV]
+name=West Virginia
+loc0=Beckley KBKW WVZ035 ---
+loc1=Bluefield KBLF WVZ042 ---
+loc2=Charleston KCRW WVZ015 074
+loc3=Clarksburg KCKB WVZ031 ---
+loc4=Elkins KEKN WVZ047 ---
+loc5=Huntington KHTS WVZ006 ---
+loc6=Lewisburg KLWB WVZ045 ---
+loc7=Martinsburg KMRB WVZ052 ---
+loc8=Morgantown KMGW WVZ022 075
+loc9=Parkersburg KPKB WVZ009 ---
+loc10=Wheeling KHLG WVZ004 ---
+loc11=White\\ Sulphur KSSU WVZ045 ---
+
+[US_WI]
+name=Wisconsin
+loc0=Antigo KAIG WIZ019 ---
+loc1=Appleton KATW WIZ038 ---
+loc2=Eau\\ Claire KEAU WIZ028 ---
+loc3=Fond\\ Du\\ Lac KFLD WIZ051 ---
+loc4=Green\\ Bay KGRB WIZ039 ---
+loc5=Hayward KHYR WIZ008 ---
+loc6=Janesville KJVL WIZ069 ---
+loc7=Kenosha KENW WIZ072 ---
+loc8=La\\ Crosse KLSE WIZ041 ---
+loc9=Lone\\ Rock KLNR WIZ055 ---
+loc10=Madison KMSN WIZ063 045
+loc11=Manitowoc KMTW WIZ050 ---
+loc12=Marshfield KMFI WIZ035 ---
+loc13=Milwaukee KMKE WIZ066 045
+loc14=Milwaukee-Timmerman KMWC WIZ066 045
+loc15=Minocqua KARV WIZ010 ---
+loc16=Mosinee KCWA WIZ030 ---
+loc17=Oshkosh KOSH WIZ048 ---
+loc18=Phillips KPBH WIZ009 ---
+loc19=Rhinelander KRHI WIZ010 ---
+loc20=Sheboygan KSBM WIZ052 045
+loc21=Sturgeon\\ Bay KSUE WIZ022 ---
+loc22=Superior KSUW WIZ001 ---
+loc23=Volk\\ Field KVOK ------ ---
+loc24=Waukesha KUES WIZ065 ---
+loc25=Wausau KAUW WIZ030 ---
+loc26=Wisconsin\\ Rapids KISW WIZ035 ---
+
+
+[US_MA]
+name=Massachusetts
+loc0=Ashburnam K9B4 ------ ---
+loc1=Ashfield K2B5 ------ ---
+loc2=Bedford KBED MAZ005 ---
+loc3=Beverly KBVY MAZ007 ---
+loc4=Boston KBOS MAZ015 bos
+loc5=Chatham KCQX MAZ022 bos
+loc6=Chicopee\\ Falls KCEF ------ ---
+loc7=Falmouth-Otis\\ AFB KFMH MAZ022 ---
+loc8=Fitchburg KFIT ------ ---
+loc9=Hyannis KHYA MAZ022 ---
+loc10=Lawrence KLWM MAZ007 ---
+loc11=Marthas\\ Vineyard KMVY MAZ023 ---
+loc12=Nantucket KACK MAZ024 ---
+loc13=New\\ Bedford KEWB MAZ017 ---
+loc14=North\\ Adams K2B6 MAZ001 ---
+loc15=Norwood KOWD MAZ013 ---
+loc16=Orange KORE ------ ---
+loc17=Plymouth KPYM MAZ018 ---
+loc18=Provincetown KPVC ------ ---
+loc19=Taunton K9B0 ------ ---
+loc20=Westfield KBAF MAZ011 ---
+loc21=Worcester KORH MAZ012 bos
+
+[US_NY]
+name=New York
+loc0=Albany KALB NYZ052 048
+loc1=Binghamton KBGM NYZ056 ---
+loc2=Buffalo KBUF NYZ010 047
+loc3=Elmira KELM NYZ024 ---
+loc4=Farmingdale KFRG NYZ077 ---
+loc5=Fort\\ Drum KGTB NYZ007 ---
+loc6=Glens\\ Falls KGFL NYZ042 ---
+loc7=Griffiss\\ AFB KRME ------ ---
+loc8=Islip KISP NYZ080 ---
+loc9=Ithaca KITH NYZ025 048
+loc10=Jamestown KJHW NYZ019 047
+loc11=Massena KMSS NYZ026 ---
+loc12=Montgomery KMGJ NYZ067 ---
+loc13=Monticello KMSV NYZ062 ---
+loc14=New\\ York-JFK\\ Arpt KJFK NYZ076 lga
+loc15=New\\ York-La\\ Guardia KLGA NYZ076 lga
+loc16=Newburgh KSWF NYZ067 ---
+loc17=Niagara\\ Falls KIAG NYZ001 047
+loc18=Ogdensburg KOGS NYZ026 ---
+loc19=Penn\\ Yan KPEO ------ ---
+loc20=Plattsburg KPBG NYZ031 ---
+loc21=Poughkeepsie KPOU NYZ065 ---
+loc22=Rochester KROC NYZ003 047
+loc23=Saranac\\ Lake KSLK NYZ027 ---
+loc24=Schenectady KSCH NYZ049 ---
+loc25=Syracuse KSYR NYZ018 048
+loc26=Utica KUCA NYZ037 ---
+loc27=Watertown KART NYZ007 ---
+loc28=Westhampton KFOK NYZ080 ---
+loc29=White\\ Plains KHPN NYZ070 ---
+
+[US_WA]
+name=Washington
+loc0=Bellingham KBLI WAZ002 ---
+loc1=Bremerton KPWT WAZ010 ---
+loc2=Burlington K75S WAZ005 ---
+loc3=Colville K63S WAZ035 ---
+loc4=Ephrata KEPH WAZ033 ---
+loc5=Everett KPAE WAZ006 sea
+loc6=Fairchild KSKA ------ ---
+loc7=Fort\\ Lewis KGRF WAZ008 ---
+loc8=Friday\\ Harbor KFHR WAZ001 ---
+loc9=Hoquiam KHQM WAZ016 ---
+loc10=Moses\\ Lake KMWH WAZ033 ---
+loc11=Oak\\ Harbor K76S WAZ009 ---
+loc12=Olympia KOLM WAZ008 sea
+loc13=Omak K4OM WAZ038 ---
+loc14=Pasco KPSC WAZ028 ---
+loc15=Port\\ Angeles KCLM WAZ013 ---
+loc16=Pullman KPUW WAZ032 ---
+loc17=Quillayute KUIL ------ ---
+loc18=Renton KRNT WAZ007 ---
+loc19=Seattle KSEA WAZ007 sea
+loc20=Seattle-Boeing KBFI WAZ007 sea
+loc21=Shelton KSHN WAZ010 ---
+loc22=Spokane KGEG WAZ034 002
+loc23=Spokane-Parkwater KSFF WAZ034 002
+loc24=Stampede\\ Pass KSMP ------ ---
+loc25=Tacoma KTIW WAZ007 sea
+loc26=Tacoma-Lakewood KTCM WAZ007 sea
+loc27=Toledo KTDO WAZ020 ---
+loc28=Walla\\ Walla KALW WAZ029 ---
+loc29=Wenatchee KEAT WAZ038 ---
+loc30=Whidbey\\ Island KNUW WAZ009 ---
+loc31=Yakima KYKM WAZ025 ---
+
+[CA]
+name=Canada
+states=AB BC MB NB NF NS NT ON QC SK YK
+
+[CA_AB]
+name=Alberta
+loc0=Calgary CYYC ------ ---
+loc1=Edmonton CYEG ------ ---
+loc2=Edmonton/Villeneuve CZVL ------ ---
+
+[CA_BC]
+name=British Columbia
+loc0=Abbotsford CYXX ------ ---
+loc1=Comox CYQQ ------ ---
+loc2=Port\\ Hardy CYZT ------ ---
+loc3=Smithers CYYD ------ ---
+loc4=Vancouver CYVR ------ ---
+loc5=Victoria CYYJ ------ ---
+
+[CA_MB]
+name=Manitoba
+loc0=Churchill CYYQ ------ ---
+loc1=Winnipeg CYWG ------ ---
+
+[CA_NB]
+name=New Brunswick
+loc0=Chatham CYCH ------ ---
+loc1=Fredericton CYFC ------ ---
+loc2=Moncton CYQM ------ ---
+
+[CA_NF]
+name=Newfoundland
+loc0=Churchill\\ Falls KZUM ------ ---
+loc1=Gander CYQX ------ ---
+loc2=Goose\\ Bay CYYR ------ ---
+loc3=Saint\\ Anthony CYAY ------ ---
+loc4=St.\\ John's CYYT ------ ---
+loc5=Stephenville CYJT ------ ---
+
+[CA_NS]
+name=Nova Scotia
+loc0=Greenwood CYZX ------ ---
+loc1=Halifax CYHZ ------ ---
+loc2=Shearwater CYAW ------ ---
+loc3=Sydney CYQY ------ ---
+
+[CA_NT]
+name=Northwest Territories
+loc0=Frobisher CYFB ------ ---
+loc1=Iqaluit CYFB ------ ---
+loc2=Yellowknife CYZF ------ ---
+
+[CA_ON]
+name=Ontario
+loc0=Ottawa CYOW ------ ---
+loc1=Toronto CYYZ ------ 047
+loc2=Trenton CYTR ------ ---
+loc3=Windsor CYQG ------ ---
+
+[CA_QC]
+name=Quebec
+loc0=Bagotville CYBG ------ ---
+loc1=Gatineau CYND ------ ---
+loc2=La\\ Grande CYGL ------ ---
+loc3=Montreal\\ Saint-Hubert CYHU ------ ---
+loc4=Montreal\\ Mirabel CYMX ------ ---
+loc5=Montreal\\ Dorval CYUL ------ ---
+loc6=Quebec\\ City CYQB ------ ---
+loc7=Sept-Iles CYZV ------ ---
+
+[CA_SK]
+name=Saskatchewan
+loc0=Nipawin CYBU ------ ---
+loc1=Regina CYQR ------ ---
+loc2=Saskatoon CYXE ------ ---
+loc3=Swift\\ Current CYYN ------ ---
+
+[CA_YK]
+name=Yukon
+loc0=Shingle\\ Point CYUA ------ ---
+
+[EU]
+name=Europe
+states=AB OS BE BA BG CZ HR CY DK EE FI FR MK DE GI GR HU IE IS IT LV LT LU MT MD NL NO PL PT RO RU SK SI SP SE CH TR UK YU
+
+[EU_AB]
+name=Albania
+loc0=Tirana LATI ------ ---
+
+[EU_OS]
+name=Austria
+loc0=Voslau LOAV ------ ---
+loc1=Hohenems LOIH ------ ---
+loc2=Graz LOWG ------ ---
+loc3=Innsbruck LOWI ------ ---
+loc4=Klagenfurt LOWK ------ ---
+loc5=Linz LOWL ------ ---
+loc6=Salzburg LOWS ------ ---
+loc7=Wien LOWW ------ ---
+loc8=Zell\\ Am\\ See LOWZ ------ ---
+
+[EU_BE]
+name=Belgium
+loc0=Antwerpen EBAW ------ ---
+loc1=Beauvechain EBBE ------ ---
+loc2=Brasschaat EBBT ------ ---
+loc3=Brussels/National EBBR ------ ---
+loc4=Charleroi/Brussels\\ South EBCI ------ ---
+loc5=Chievres EBCV ------ ---
+loc6=Elsenborn EBLB ------ ---
+loc7=Florennes EBFS ------ ---
+loc8=Goetsenhoven EBTN ------ ---
+loc9=Kleine\\ Brogel EBBL ------ ---
+loc10=Koksijde EBFN ------ ---
+loc11=Liege EBLG ------ ---
+loc12=Oostende EBOS ------ ---
+loc13=Sint-Truiden EBST ------ ---
+loc14=? EBDT ------ ---
+
+[EU_BA]
+name=Bosnia-Herzegovina
+loc0=Sarajevo LQSA ------ ---
+
+[EU_BG]
+name=Bulgaria
+loc0=Burgas LBBG ------ ---
+loc1=Plovdiv LBPD ------ ---
+loc2=Sofia LBSF ------ ---
+loc3=Varna LBWN ------ ---
+
+[EU_CZ]
+name=Czech Republic
+loc0=Brno LKTB ------ ---
+loc1=Ostrava LKMT ------ ---
+loc2=Praha LKPR ------ ---
+
+[EU_HR]
+name=Croatia
+loc0=Dubrovnik LDDU ------ ---
+loc1=Pula LDPL ------ ---
+loc2=Rijeka LDRI ------ ---
+loc3=Split LDSP ------ ---
+loc4=Zadar LDZD ------ ---
+loc5=Zagreb LDZA ------ ---
+
+[EU_DK]
+name=Denmark
+loc0=Aarhus EKAH ------ ---
+loc1=Billund EKBI ------ ---
+loc2=Esbjerg EKEB ------ ---
+loc3=Karup EKKA ------ ---
+loc4=Kobenhavn/Kastrup EKCH ------ ---
+loc5=Kobenhavn/Roskilde EKRK ------ ---
+loc6=Lolland\\ Falster EKMB ------ ---
+loc7=Odense EKOD ------ ---
+loc8=Bornholm EKRN ------ ---
+loc9=Sonderborg EKSB ------ ---
+loc10=Sindal EKSN ------ ---
+loc11=Vojens/Skrydstrup EKSP ------ ---
+loc12=Skive EKSV ------ ---
+loc13=Thisted EKTS ------ ---
+loc14=Vandel EKVA ------ ---
+loc15=Kolding/Vandrup EKVD ------ ---
+loc16=Vagar EKVG ------ ---
+loc17=Stauning EKVJ ------ ---
+loc18=Vaerlose EKVL ------ ---
+loc19=Alborg EKYT ------ ---
+
+[EU_EE]
+name=Estonia
+loc0=Talinn EETN ------ ---
+
+[EU_GI]
+name=Gibraltar
+loc0=Gibraltar LXGB ------ ---
+
+[EU_IS]
+name=Iceland
+loc0=Egilsstadir BIEG ------ ---
+loc1=Keflavik BIKF ------ ---
+loc2=Reykjavik BIRK ------ ---
+
+[EU_LV]
+name=Latvia
+loc0=Riga EVRA ------ ---
+
+[EU_LT]
+name=Lithuania
+loc0=Vilnius EVRA ------ ---
+
+[EU_LU]
+name=Luxembourg
+loc0=Luxembourg ELLX ------ ---
+
+[EU_MK]
+name=FYR Macedonia
+loc0=Ohrid LWOH ------ ---
+loc1=Skopje LWSK ------ ---
+
+[EU_MT]
+name=Malta
+loc0=Luqa LMML ------ ---
+
+[EU_MD]
+name=Moldova
+loc0=Kishineu LUKK ------ ---
+
+[EU_NO]
+name=Norway
+loc0=Alesund ENAL ------ ---
+loc1=Andoya ENAN ------ ---
+loc2=Alta ENAT ------ ---
+loc3=Forde/Bringeland ENBL ------ ---
+loc4=Bronnoysund ENBN ------ ---
+loc5=Bodo ENBO ------ ---
+loc6=Bergen ENBR ------ ---
+loc7=Berlevag ENBV ------ ---
+loc8=Kristiansand/Kjevik ENCN ------ ---
+loc9=Dagali ENDI ------ ---
+loc10=Bardufoss ENDU ------ ---
+loc11=Ekofisk ENEK ------ ---
+loc12=Harstad/Narvik/Evenes ENEV ------ ---
+loc13=Oslo/Fornebu ENFB ------ ---
+loc14=Fagernes ENFG ------ ---
+loc15=Floro ENFL ------ ---
+loc16=Frigg ENFR ------ ---
+loc17=Gullfax\\ C ENGC ------ ---
+loc18=Oslo/Gardenmoen ENGM ------ ---
+loc19=Haugesund ENHD ------ ---
+loc20=Hammerfest ENHF ------ ---
+loc21=Honningsvag ENHV ------ ---
+loc22=Kristiansund/Kvernberget ENKB ------ ---
+loc23=Kirkenes ENKR ------ ---
+loc24=Lista ENLI ------ ---
+loc25=Leknes ENLK ------ ---
+loc26=Mehamn ENMH ------ ---
+loc27=Molde ENML ------ ---
+loc28=Mosjoen ENMS ------ ---
+loc29=Banak ENNA ------ ---
+loc30=Narvik ENNK ------ ---
+loc31=Namsos ENNM ------ ---
+loc32=Notodden ENNO ------ ---
+loc33=Oseberg\\ A ENOA ------ ---
+loc34=Orland ENOL ------ ---
+loc35=Orsta-Volda ENOV ------ ---
+loc36=Mo\\ I\\ Rana ENRA ------ ---
+loc37=Rorvik/Ryum ENRM ------ ---
+loc38=Roros ENRO ------ ---
+loc39=Rost ENRS ------ ---
+loc40=Rygge ENRY ------ ---
+loc41=Svalbard ENSB ------ ---
+loc42=Sandane ENSD ------ ---
+loc43=Sogndal ENSG ------ ---
+loc44=Svolvaer/Helle ENSH ------ ---
+loc45=Stokmarknes/Skagen ENSK ------ ---
+loc46=Skien/Geiteryggen ENSN ------ ---
+loc47=Stord/Sorstokken ENSO ------ ---
+loc48=Sorkjosen ENSR ------ ---
+loc49=Sandnessjoen/Stokka ENST ------ ---
+loc50=Tromso/Langnes ENTC ------ ---
+loc51=Torp ENTO ------ ---
+loc52=Trondheim/Vaernes ENVA ------ ---
+loc53=Vadso ENVD ------ ---
+loc54=Stavanger/Sola ENZV ------ ---
+
+[EU_PL]
+name=Poland
+loc0=Gdansk EPGD ------ ---
+loc1=Krakow EPKK ------ ---
+loc2=Katowice EPKT ------ ---
+loc3=Poznan EPPO ------ ---
+loc4=Rzeszow EPRZ ------ ---
+loc5=Szczecin EPSC ------ ---
+loc6=Warszawa EPWA ------ ---
+
+[EU_PT]
+name=Portugal
+loc0=Beja LPBJ ------ ---
+loc1=Faro LPFR ------ ---
+loc2=Funchal LPFU ------ ---
+loc3=Lajes LPLA ------ ---
+loc4=Lisboa LPPT ------ ---
+loc5=Porto LPPR ------ ---
+loc6=Porto\\ Santo LPPS ------ ---
+loc7=Santa\\ Maria LPAZ ------ ---
+
+[EU_RO]
+name=Romania
+loc0=Arad LRAR ------ ---
+loc1=Bucuresti LRBS ------ ---
+loc2=Bucuresti-Otopeni LROP ------ ---
+loc3=Iasi LRIA ------ ---
+loc4=Kogalniceanu LRCK ------ ---
+loc5=Timisoara LRTR ------ ---
+loc6=Tirgu\\ Mures LRTM ------ ---
+loc7=Tulcea LRTC ------ ---
+
+[EU_RU]
+name=Russia
+loc0=Abakan UNAA ------ ---
+loc1=Anadyr UHMA ------ ---
+loc2=Anapa URKA ------ ---
+loc3=Arkhangelsk ULAA ------ ---
+loc4=Astrakhan URWA ------ ---
+loc5=Barnaul UNBB ------ ---
+loc6=Belgorod UUOB ------ ---
+loc7=Blagoveschensk UHBB ------ ---
+loc8=Bratsk UIBB ------ ---
+loc9=Bryansk UUBP ------ ---
+loc10=Cheboksary UWKS ------ ---
+loc11=Chelyabinsk USCC ------ ---
+loc12=Chita UIAA ------ ---
+loc13=Kliningrad UMKK ------ ---
+loc14=Kazan UWKD ------ ---
+loc15=Khabarovsk UHHH ------ ---
+loc16=Kogalym USRK ------ ---
+loc17=Krasnodar URKK ------ ---
+loc18=Krasnoyarsk UNKL ------ ---
+loc19=Magadan UHMM ------ ---
+loc20=Makhachkala URML ------ ---
+loc21=Mineralnye\\ Vody URMM ------ ---
+loc22=Moscow\\ Domodedovo UUDD ------ ---
+loc23=Moscow\\ Sheremetyevo UUEE ------ ---
+loc24=Murmansk ULMM ------ ---
+loc25=Nalchik URMN ------ ---
+loc26=Nizhny\\ Novgorod UWGG ------ ---
+loc27=Novosibirsk UNNT ------ ---
+loc28=Omsk UNOO ------ ---
+loc29=Orenburg UWOO ------ ---
+loc30=Perm USPP ------ ---
+loc31=Petropavlovsk-Kamchatsky UHPP ------ ---
+loc32=Petrozavodsk ULPB ------ ---
+loc33=Pskov ULOO ------ ---
+loc34=Raduzhny USNR ------ ---
+loc35=Rostov-Na-Donu URRR ------ ---
+loc36=Samara UWWW ------ ---
+loc37=Sankt-Peterburg ULLI ------ ---
+loc38=Saratov UWSS ------ ---
+loc39=Sochi URSS ------ ---
+loc40=Stavropol URMT ------ ---
+loc41=Syktyvkar UUYY ------ ---
+loc42=Tyumen USTR ------ ---
+loc43=Ufa UWUU ------ ---
+loc44=Ulan-Ude UIUU ------ ---
+loc45=Ulyanovsk UWLW ------ ---
+loc46=Vladikavkaz URMO ------ ---
+loc47=Vladivostok UHWW ------ ---
+loc48=Volgograd URWW ------ ---
+loc49=Voronezh UUOO ------ ---
+loc50=Yakutsk UEEE ------ ---
+loc51=Yekaterinburg USSS ------ ---
+loc52=Yuzhno-Sakhalinsk UHSS ------ ---
+
+[EU_SK]
+name=Slovakia
+loc0=Bratislava LZIB ------ ---
+loc1=Poprad LZTT ------ ---
+
+[EU_SI]
+name=Slovenia
+loc0=Ljubljana LJLJ ------ ---
+loc1=Maribor LJMB ------ ---
+loc2=Portoroz LJPZ ------ ---
+
+[EU_SE]
+name=Sweden
+loc0=Goteborg\\ (Landvetter) ESGG ------ ---
+loc1=Goteborg\\ (Save) ESGP ------ ---
+loc2=Jonkoping ESGJ ------ ---
+loc3=Kiruna ESNQ ------ ---
+loc4=Malmo/Sturup ESMS ------ ---
+loc5=Norrkoping ESSP ------ ---
+loc6=Ronneby ESDF ------ ---
+loc7=Stockholm\\ (Arlanda) ESSA ------ ---
+loc8=Stockholm\\ (Bromma) ESSB ------ ---
+loc9=Sundsvall-Harnosand ESNN ------ ---
+loc10=Umea ESNU ------ ---
+loc11=Vasteras ESOW ------ ---
+loc12=Vaxjo ESMX ------ ---
+loc13=Visby ESSV ------ ---
+
+[EU_CH]
+name=Switzerland
+loc0=Bern LSZB ------ ---
+loc1=Geneve LSGG ------ ---
+loc2=Lugano LSZA ------ ---
+loc3=Zurich LSZH ------ ---
+
+[EU_TR]
+name=Turkey
+loc0=Adana LTAF ------ ---
+loc1=Adana/Incirlik LTAG ------ ---
+loc2=Afyon LTAH ------ ---
+loc3=Amasya LTAP ------ ---
+loc4=Ankara/Esenboga LTAC ------ ---
+loc5=Ankara/Etimesgut LTAD ------ ---
+loc6=Antalya LTAI ------ ---
+loc7=Balikesir LTBF ------ ---
+loc8=Balikesir/Bandirma LTBG ------ ---
+loc9=Batman LTCJ ------ ---
+loc10=Bursa LTBE ------ ---
+loc11=Diyarbakir LTCC ------ ---
+loc12=Elazig LTCA ------ ---
+loc13=Erzurum LTCE ------ ---
+loc14=Eskisehir LTBI ------ ---
+loc15=Gaziantep LTAJ ------ ---
+loc16=Istanbul LTBA ------ ---
+loc17=Izmir/Adnan\\ Menderes LTBJ ------ ---
+loc18=Izmir/Cigli LTBL ------ ---
+loc19=Izmit LTBQ ------ ---
+loc20=Kayseri LTAU ------ ---
+loc21=Konya LTAN ------ ---
+loc22=Malatya LTAT ------ ---
+loc23=Manisa LTBT ------ ---
+loc24=Mugla/Dalaman LTBS ------ ---
+loc25=Mus LTCK ------ ---
+loc26=Samsun LTAQ ------ ---
+loc27=Sanliurfa LTCH ------ ---
+loc28=Sivas LTAR ------ ---
+loc29=Sivrihisar LTAV ------ ---
+loc30=Trabzon LTCG ------ ---
+loc31=Van LTCI ------ ---
+
+[EU_CY]
+name=Cyprus
+loc0=Akrotiri LCRA ------ ---
+loc1=Ercan LCEN ------ ---
+loc2=Larnaka LCLK ------ ---
+loc3=Paphos LCPH ------ ---
+
+[EU_FI]
+name=Finland
+loc0=Helsinki EFHK ------ ---
+loc1=Tampere EFTP ------ ---
+loc2=Turku EFTU ------ ---
+
+[EU_FR]
+name=France
+loc0=Agen LFBA ------ ---
+loc1=Ajaccio/Campo\\ dell'Oro LFKJ ------ ---
+loc2=Bale-Mulhouse LFSB ------ ---
+loc3=Bastia LFKB ------ ---
+loc4=Beauvais-Tille LFOB ------ ---
+loc5=Biarritz-Bayonne LFBZ ------ ---
+loc6=Bordeaux LFBD ------ ---
+loc7=Bourges LFLD ------ ---
+loc8=Brest LFRB ------ ---
+loc9=Caen-Carpiquet LFRK ------ ---
+loc10=Calvi-Ste-Catherine LFKC ------ ---
+loc11=Cannes-Mandelieu LFMD ------ ---
+loc12=Cazaux LFBC ------ ---
+loc13=Chambery LFLB ------ ---
+loc14=Cherbourg LFRC ------ ---
+loc15=Clermont-Ferrand LFLC ------ ---
+loc16=Colmar-Meyenheim LFSC ------ ---
+loc17=Deauville-Saint-Gatien LFRG ------ ---
+loc18=Dijon LFSD ------ ---
+loc19=Dinard LFRD ------ ---
+loc20=Dole LFGJ ------ ---
+loc21=Evreux-Fauville LFOE ------ ---
+loc22=Figari LFKF ------ ---
+loc23=Grenoble-Saint-Genoirs LFLS ------ ---
+loc24=Hyeres-Le\\ Palyvestre LFTH ------ ---
+loc25=Lannion LFRO ------ ---
+loc26=Le\\ Havre-Octeville LFOH ------ ---
+loc27=Le\\ Mans LFRM ------ ---
+loc28=Le\\ Touquet LFAT ------ ---
+loc29=Lille-Lesquin LFQQ ------ ---
+loc30=Limoges LFBL ------ ---
+loc31=Lorient-Lann-Bihoue LFRH ------ ---
+loc32=Lyon-Bron LFLY ------ ---
+loc33=Lyon-Satolas LFLL ------ ---
+loc34=Luxeuil LFSX ------ ---
+loc35=Marseille-Provence LFML ------ ---
+loc36=Metz-Frescaty LFSF ------ ---
+loc37=Monpellier-Mediterrannee LFMT ------ ---
+loc38=Mont-de-Marsan LFBM ------ ---
+loc39=Nancy-Essey LFSN ------ ---
+loc40=Nancy-Ochey LFSO ------ ---
+loc41=Nantes\\ Adlantique LFRS ------ ---
+loc42=Nice-Cote\\ d'Azur LFMN ------ ---
+loc43=Nimes-Garons LFTW ------ ---
+loc44=Paris/Charles\\ De\\ Gaulle LFPG ------ ---
+loc45=Paris/Le\\ Bourget LFPB ------ ---
+loc46=Paris/Orly LFPO ------ ---
+loc47=Pau/Pyrenees LFBP ------ ---
+loc48=Perpignan-Rivesaltes LFMP ------ ---
+loc49=Poitiers LFBI ------ ---
+loc50=Quimper LFRQ ------ ---
+loc51=Reims-Champagne LFSR ------ ---
+loc52=Rennes LFRN ------ ---
+loc53=Rouen-Valle\\ de\\ Seine LFOP ------ ---
+loc54=Saint-Brieuc-Armor LFRT ------ ---
+loc55=Saint-Dizier-Robinson LFSI ------ ---
+loc56=Saint-Etienne-Boutheon LFMH ------ ---
+loc57=Saint-Nazaire-Montoir LFRZ ------ ---
+loc58=Strasbourg LFST ------ ---
+loc59=Tarbes LFBT ------ ---
+loc60=Toul-Rosieres LFSL ------ ---
+loc61=Toulouse LFBO ------ ---
+loc62=Tours-St-Symphorien LFOT ------ ---
+loc63=Toussus-Le\\ Noble LFPN ------ ---
+loc64=Troyes/Barberey LFQB ------ ---
+loc65=Vichy-Charmeil LFLV ------ ---
+loc66=Villacoublay LFPV ------ ---
+
+[EU_DE]
+name=Germany
+loc0=Augsburg EDMA ------ ---
+loc1=Bayreuth EDQD ------ ---
+loc2=Berlin-Tegel EDDT ------ ---
+loc3=Berlin-Tempelhof EDDI ------ ---
+loc4=Braunschweig EDVE ------ ---
+loc5=Bremen EDDW ------ ---
+loc6=Dortmund-Wickede EDLW ------ ---
+loc7=Dusseldorf EDDL ------ ---
+loc8=Frankfurt/Main EDDF ------ ---
+loc9=Friedrichshafen EDNY ------ ---
+loc10=Hamburg EDDH ------ ---
+loc11=Hamburg-Finkenwerder EDHI ------ ---
+loc12=Hannover EDDV ------ ---
+loc13=Hof EDQM ------ ---
+loc14=Kassel-Calden EDVK ------ ---
+loc15=Koln/Bonn EDDK ------ ---
+loc16=Lubeck-Blankensee EDHL ------ ---
+loc17=Monchengladbach EDLN ------ ---
+loc18=Munchen EDDM ------ ---
+loc19=Munster/Osnabruck EDDG ------ ---
+loc20=Nurnberg EDDN ------ ---
+loc21=Oberpfaffenhofen EDMO ------ ---
+loc22=Paderborn-Haxterberg EDLP ------ ---
+loc23=Saarbrucken EDDR ------ ---
+loc24=Stuttgart EDDS ------ ---
+loc25=Westerland EDXW ------ ---
+
+[EU_GR]
+name=Greece
+loc0=Andravida LGAD ------ ---
+loc1=Alexandroupolis LGAL ------ ---
+loc2=Araxos LGRX ------ ---
+loc3=Athinai LGAT ------ ---
+loc4=Chania LGSA ------ ---
+loc5=Elefsis LGEL ------ ---
+loc6=Iraklion LGIR ------ ---
+loc7=Kalamata LGKL ------ ---
+loc8=Kavala LGKV ------ ---
+loc9=Kefallinia LGKF ------ ---
+loc10=Kerkira LGKR ------ ---
+loc11=Kos LGKO ------ ---
+loc12=Kozani LGKZ ------ ---
+loc13=Limnos LGLM ------ ---
+loc14=Mitilini LGMT ------ ---
+loc15=Mykonos LGMK ------ ---
+loc16=Preveza LGPZ ------ ---
+loc17=Rodos LGRP ------ ---
+loc18=Samos LGSM ------ ---
+loc19=Santorini LGSR ------ ---
+loc20=Skiathos LGSK ------ ---
+loc21=Thessaloniki LGTS ------ ---
+loc22=Zakinthos LGZA ------ ---
+
+[EU_HU]
+name=Hungary
+loc0=Budapest LHBP ------ ---
+loc1=Papa LHPA ------ ---
+loc2=Szombathely LHSY ------ ---
+
+[EU_IE]
+name=Ireland
+loc0=Connaught EIKN ------ ---
+loc1=Cork EICK ------ ---
+loc2=Dublin EIDW ------ ---
+loc3=Shannon EINN ------ ---
+
+[EU_IT]
+name=Italy
+loc0=Albenga LIMG ------ ---
+loc1=Alghero LIEA ------ ---
+loc2=Amendola LIBA ------ ---
+loc3=Ancona LIPY ------ ---
+loc4=Aviano LIPA ------ ---
+loc5=Bari LIBD ------ ---
+loc6=Bergamo LIME ------ ---
+loc7=Bologna LIPE ------ ---
+loc8=Bolzano LIPB ------ ---
+loc9=Brindisi LIBR ------ ---
+loc10=Cagliari LIEE ------ ---
+loc11=Capo\\ Mele LIMU ------ ---
+loc12=Catania LICC ------ ---
+loc13=Cervia LIPC ------ ---
+loc14=Crotone LIBC ------ ---
+loc15=Dobbiaco LIVD ------ ---
+loc16=Decimomannu LIED ------ ---
+loc17=Ferrara LIPF ------ ---
+loc18=Firenze LIRQ ------ ---
+loc19=Forli LIPK ------ ---
+loc20=Frontone LIVF ------ ---
+loc21=Frosinone LIRH ------ ---
+loc22=Genova LIMJ ------ ---
+loc23=Ghedi LIPL ------ ---
+loc24=Gioia\\ del\\ Colle LIBV ------ ---
+loc25=Grosseto LIRS ------ ---
+loc26=Guidonia LIRG ------ ---
+loc27=Lamezia LICA ------ ---
+loc28=Lampedusa LICD ------ ---
+loc29=Latina LIRL ------ ---
+loc30=Lecce LIBN ------ ---
+loc31=Marino\\ di\\ Ravenna LIVM ------ ---
+loc32=Milano/Linate LIML ------ ---
+loc33=Milano/Malpensa LIMC ------ ---
+loc34=Monte\\ Argentario LIQO ------ ---
+loc35=Monte\\ Bisbino LIMO ------ ---
+loc36=Monte\\ Calamita LIRX ------ ---
+loc37=Monte\\ Cimone LIVC ------ ---
+loc38=Monte\\ Malanotte LIMY ------ ---
+loc39=Monte\\ Scuro LIBQ ------ ---
+loc40=Monte\\ Terminillo LIRK ------ ---
+loc41=Napoli LIRN ------ ---
+loc42=Novara/Cameri LIMN ------ ---
+loc43=Olbia LIEO ------ ---
+loc44=Padova LIPU ------ ---
+loc45=Paganella LIVP ------ ---
+loc46=Palermo LICJ ------ ---
+loc47=Pantelleria LICG ------ ---
+loc48=Passo\\ della\\ Cisa LIMT ------ ---
+loc49=Passo\\ dei\\ Giovi LIMV ------ ---
+loc50=Passo\\ Resia LIVE ------ ---
+loc51=Passo\\ Rolle LIVR ------ ---
+loc52=Perugia LIRZ ------ ---
+loc53=Pescara LIBP ------ ---
+loc54=Piacenza LIMS ------ ---
+loc55=Pian\\ Rosa LIMH ------ ---
+loc56=Pisa LIRP ------ ---
+loc57=Pratica\\ di\\ Mare LIRE ------ ---
+loc58=Reggio\\ Calabria LICR ------ ---
+loc59=Rieti LIQN ------ ---
+loc60=Rimini LIPR ------ ---
+loc61=Rivolto LIPI ------ ---
+loc62=Roma/Ciampino LIRA ------ ---
+loc63=Roma/Fiumicino LIRF ------ ---
+loc64=Roma/Urbe LIRU ------ ---
+loc65=Ronchi\\ de'\\ Legionari LIPQ ------ ---
+loc66=Sarzana LIQW ------ ---
+loc67=Sigonella LICZ ------ ---
+loc68=Taranto LIBG ------ ---
+loc69=Tarvisio LIVO ------ ---
+loc70=Trapani LICT ------ ---
+loc71=Torino/Bric\\ Della\\ Croce LIMK ------ ---
+loc72=Torino/Caselle LIMF ------ ---
+loc73=Trevico LIRT ------ ---
+loc74=Treviso/S.Angelo LIPH ------ ---
+loc75=Treviso/Istrana LIPS ------ ---
+loc76=Trieste LIVT ------ ---
+loc77=Venezia LIPZ ------ ---
+loc78=Vicenza LIPT ------ ---
+loc79=Villafranca LIPX ------ ---
+loc80=Viterbo LIRV ------ ---
+
+[EU_NL]
+name=Netherlands
+loc0=Amsterdam EHAM ------ ---
+loc1=Deelen EHDL ------ ---
+loc2=Den\\ Helder/De\\ Kooy EHKD ------ ---
+loc3=Eindhoven EHEH ------ ---
+loc4=Gilze-Rijen EHGR ------ ---
+loc5=Groningen EHGG ------ ---
+loc6=Leeuwarden EHLW ------ ---
+loc7=Maastricht EHBK ------ ---
+loc8=Rotterdam EHRD ------ ---
+loc9=Twenthe EHTW ------ ---
+loc10=Utrecht/Soesterberg EHSB ------ ---
+loc11=Valkenburg EHVB ------ ---
+loc12=Vlieland EHVL ------ ---
+loc13=Volkel EHVK ------ ---
+loc14=Woensdrecht EHWO ------ ---
+
+[EU_SP]
+name=Spain
+loc0=Alicante LEAL ------ ---
+loc1=Almeria LEAM ------ ---
+loc2=Asturias LEAS ------ ---
+loc3=Barcelona LEBL ------ ---
+loc4=Bilbao LEBB ------ ---
+loc5=Canarias/Fuerteventura GCFV ------ ---
+loc6=Canarias/Gran\\ Canaria GCLP ------ ---
+loc7=Canarias/Hierro GCHI ------ ---
+loc8=Canarias/La\\ Palma GCLA ------ ---
+loc9=Canarias/Lanzarote GCRR ------ ---
+loc10=Canarias/Tenerife\\ Sur GCTS ------ ---
+loc11=Canarias/Tenerife\\ Norte GCXO ------ ---
+loc12=Girona LEGE ------ ---
+loc13=Granada LEGR ------ ---
+loc14=Ibiza LEIB ------ ---
+loc15=Jerez LEJR ------ ---
+loc16=La\\ Coruna LECO ------ ---
+loc17=Madrid\\ (Barajas) LEMD ------ ---
+loc18=Madrid\\ (Cuatro\\ Vientos) LEVS ------ ---
+loc19=Malaga LEMG ------ ---
+loc20=Melilla GEML ------ ---
+loc21=Menorca LEMH ------ ---
+loc22=Murcia LELC ------ ---
+loc23=Palma\\ de\\ Mallorca LEPA ------ ---
+loc24=Pamplona LEPP ------ ---
+loc25=Reus LERS ------ ---
+loc26=San\\ Sebastian LESO ------ ---
+loc27=Santander LEXJ ------ ---
+loc28=Santiago LEST ------ ---
+loc29=Sevilla LEZL ------ ---
+loc30=Valencia LEVC ------ ---
+loc31=Vigo LEVX ------ ---
+loc32=Vitoria LEVT ------ ---
+loc33=Zaragoza LEZG ------ ---
+
+[EU_UK]
+name=United Kingdom
+loc0=Aberdeen EGPD :RQPMS ---
+loc1=Alderney EGJA ------ ---
+loc2=Belfast/Aldergrove EGAA :AAPMS ---
+loc3=Belfast/Harbour EGAC :AAPMS ---
+loc4=Benbecula EGPL :RAPMS ---
+loc5=Biggin\\ Hill EGKB :RBPMS ---
+loc6=Birmingham EGBB :BBPMS ---
+loc7=Blackpool EGNH :RCPMS ---
+loc8=Boscombe\\ Down EGDM ------ ---
+loc9=Boulmer EGQM :RTPMS ---
+loc10=Bournemouth EGHH :RIPMS ---
+loc11=Bristol EGGD :RDPMS ---
+loc12=Cambridge EGSC :RNPMS- ---
+loc13=Cardiff EGFF :RGPMS ---
+loc14=Carlisle EGNC :RCPMS ---
+loc15=Coventry EGBE :BBPMS ---
+loc16=Cranfield EGTC :RIPMS ---
+loc17=Culdrose EGDR :RD2PMS ---
+loc18=Dundee EGPN :RAPMS ---
+loc19=East\\ Midlands EGNX :BBPMS ---
+loc20=Edinburgh EGPH :RAPMS ---
+loc21=Eglington/Londonderry EGAE :AAPMS ---
+loc22=Exeter EGTE :RD2PMS ---
+loc23=Glasgow EGPF :RAPMS ---
+loc24=Guernsey EGJB ------ ---
+loc25=Humberside EGNJ :RTPMS ---
+loc26=Inverness EGPE :RQPMS ---
+loc27=Isle\\ of\\ Man EGNS :RCPMS ---
+loc28=Jersey EGJJ ------ ---
+loc29=Kinloss EGQK :RQPMS ---
+loc30=Leeds\\ and\\ Bradford EGNM :RYPMS ---
+loc31=Leuchars EGQL :RQPMS ---
+loc32=Liverpool EGGP :RCPMS ---
+loc33=London/City EGLC :RBPMS ---
+loc34=London/Gatwick EGKK :RBPMS ---
+loc35=London/Heathrow EGLL :RBPMS ---
+loc36=London/Stansted EGSS :RBPMS ---
+loc37=Lossiemouth EGQS :RQPMS ---
+loc38=Luton EGGW :RBPMS ---
+loc39=Lyneham EGDL :BBPMS ---
+loc40=Manchester EGCC :RCPMS ---
+loc41=Newcastle EGNT :RTPMS ---
+loc42=Norwich EGSH :RNPMS ---
+loc43=Plymouth EGHD :RD2PMS ---
+loc44=Portland EGDP :RIPMS ---
+loc45=Prestwick EGPK :RAPMS ---
+loc46=Saint\\ Mawgan EGDG :RD2PMS ---
+loc47=Scatsta EGPM :RQPMS ---
+loc48=Scilly\\ Isles EGHE :RD2PMS ---
+loc49=Shawbury EGOS :BBPMS ---
+loc50=Shoreham EGKA :RBPMS ---
+loc51=Southampton EGHI :RIPMS ---
+loc52=Southend EGMC :RBPMS ---
+loc53=Staverton EGBJ :RDPMS ---
+loc54=Stornoway EGPO :RQPMS ---
+loc55=Sumburgh EGPB :RQPMS ---
+loc56=Tees-Side EGNV :RTPMS ---
+loc57=Tiree EGPU :RQPMS ---
+loc58=Unst EGPW :RQPMS ---
+loc59=Valley EGOV ------ ---
+loc60=Wick EGPC :RQPMS ---
+loc61=Yeovilton EGDY :RDPMS ---
+
+[EU_YU]
+name=Yugoslavia
+loc0=Beograd LYBE ------ ---
+loc1=Nis LYNI ------ ---
+loc2=Podgorica\\ Titograd LYTI ------ ---
+loc3=Podgorica LYPG ------ ---
+loc4=Pristina LYPR ------ ---
+loc5=Tivat LYTU ------ ---
+
+[AF]
+name=Africa
+states=DZ EG LY MO ZA
+
+[AF_MO]
+name=Morocco
+loc0=Rabat GMME ------ ---
+
+[AF_ZA]
+name=South Africa
+loc0=Bethlehem\\ Airport FABM ------ ---
+loc1=Bloemfontein\\ J.\\ B.\\ M.\\ Hertzog FABL ------ ---
+loc2=Cape\\ Town\\ D.\\ F.\\ Malan FACT ------ ---
+loc3=Durban\\ Louis\\ Botha FADN ------ ---
+loc4=East\\ London FAEL ------ ---
+loc5=George\\ Airport FAGG ------ ---
+loc6=Jan\\ Smuts FAJS ------ ---
+loc7=Langebaanweg FALW ------ ---
+loc8=Lichtenburg FALT ------ ---
+loc9=Pietersburg FAPB ------ ---
+loc10=Port\\ Elizabeth FAPE ------ ---
+loc11=Pretoria FAPR ------ ---
+loc12=Springbok FASB ------ ---
+loc13=Upington FAUP ------ ---
+
+[AF_LY]
+name=Libya
+loc0=Benina HLLB ------ ---
+loc1=Tripoli HLLT ------ ---
+
+[AF_EG]
+name=Egypt
+loc0=Alexandria/Nouzha HEAX ------ ---
+loc1=Asswan HESN ------ ---
+loc2=Cairo HECA ------ ---
+loc3=Luxor HELX ------ ---
+loc4=Mersa\\ Matruh HEMM ------ ---
+loc5=Port\\ Said HEPS ------ ---
+loc6=Sharm\\ El\\ Sheikhintl HESH ------ ---
+
+[AF_DZ]
+name=Algeria
+loc0=Annaba DABB ------ ---
+loc1=Constantine DABC ------ ---
+loc2=Dar-El-Beida DAAG ------ ---
+loc3=Ghardaia DAUG ------ ---
+loc4=Hassi-Messaoud DAUH ------ ---
+loc5=In\\ Amenas DAUZ ------ ---
+loc6=Oran DAOO ------ ---
+loc7=Tamanrasset DAAT ------ ---
+loc8=Tebessa DABS ------ ---
+loc9=Tlemcen\\ Zenata DAON ------ ---
+
+[OZ]
+name=Australasia
+states=AU NZ
+
+[OZ_AU]
+name=Australia
+loc0=Adelaide YPAD ------ ---
+loc1=Alice\\ Springs YBAS ------ ---
+loc2=Brisbane YBBN ------ ---
+loc3=Broome YBRM ------ ---
+loc4=Cairns YBCS ------ ---
+loc5=Canberra YSCB ------ ---
+loc6=Christmas\\ Island YPXM ------ ---
+loc7=Cocos\\ Island YPCC ------ ---
+loc8=Dubbo YSDU ------ ---
+loc9=Hobart YMHB ------ ---
+loc10=Learmouth YPLM ------ ---
+loc11=Melbourne YMML ------ ---
+loc12=Norfolk\\ Island YSNF ------ ---
+loc13=Perth YPPH ------ ---
+loc14=Port\\ Hedland YPPD ------ ---
+loc15=Sydney YSSY ------ ---
+loc16=Townsville YBTL ------ ---
+
+[OZ_NZ]
+name=New Zealand
+loc0=Auckland NZAA ------ ---
+loc1=Christchurch NZCH ------ ---
+loc2=Wellington NZWN ------ ---
+
+[AS]
+name=Asia
+states=CN HK IN JP KR KP PK SG TW VN
+
+[AS_VN]
+name=Viet Nam
+loc=Da\\ Nang VVDN ------ ---
+loc=Ha\\ Noi VVNB ------ ---
+loc=Ho\\ Chi\\ Minh VVTS ------ ---
+
+[AS_KR]
+name=Korea, Republic of
+loc0=Camp\\ Stanley/H-207 RKSX ------ ---
+loc1=Cheju RKPC ------ ---
+loc2=Chongju\\ Ab RKTU ------ ---
+loc3=Mangilsan\\ Ab RKTM ------ ---
+loc4=Osan\\ Ab RKSO ------ ---
+loc5=Paekado RKTB ------ ---
+loc6=Paengnyongdo\\ Ab RKSP ------ ---
+loc7=Pohang\\ Ab RKTH ------ ---
+loc8=Pusan/Kimhae RKPK ------ ---
+loc9=Pyongtaek\\ Ab RKSG ------ ---
+loc10=Sangju RKTS ------ ---
+loc11=Seoul/Kimp'O\\ International\\ Airport RKSS ------ ---
+loc12=Seoul/Yongdungp'O\\ Rokaf\\ Wc RKSF ------ ---
+loc13=Seoul\\ E\\ Ab RKSM ------ ---
+loc14=Songmu\\ Ab RKTE ------ ---
+loc15=Suwon\\ Ab RKSW ------ ---
+loc16=Taegu RKTT ------ ---
+loc17=Taegu\\ Ab RKTN ------ ---
+loc18=Taejon RKTF ------ ---
+loc19=Ulsan RKPU ------ ---
+loc20=Woong\\ Cheon RKTW ------ ---
+loc21=Yechon\\ Ab RKTY ------ ---
+loc22=Yeoju\\ Range RKSU ------ ---
+loc23=Yeonpyeungdo RKSQ ------ ---
+loc24=Yongsan/H-208\\ Hp RKSY ------ ---
+loc25=Yosu RKJY ------ ---
+
+[AS_KP]
+name=Korea, Democratic People's Republic of
+loc0=Pyongyang ZKPY ------ ---
+
+[AS_HK]
+name=Hong Kong
+loc=Hong\\ Kong VHHH ------ ---
+
+[AS_PK]
+name=Pakistan
+loc0=Islamabad OPRN ------ ---
+loc1=Karachi OPKC ------ ---
+loc2=Lahore OPLA ------ ---
+loc3=Nawabshah OPNH ------ ---
+
+[AS_IN]
+name=India
+loc0=Ahmadabad VAAH ------ ---
+loc1=Amritsar VIAR ------ ---
+loc2=Bombay/Santacruz VABB ------ ---
+loc3=Calcutta/Dum\\ Dum VECC ------ ---
+loc4=Hyderabad VOHY ------ ---
+loc5=Madras/Minambakkam VOMM ------ ---
+loc6=Nagpur\\ Sonegaon VANP ------ ---
+loc7=New\\ Delhi/Palam VIDP ------ ---
+loc8=Patna VEPT ------ ---
+loc9=Thiruvananthapuram VOTV ------ ---
+loc10=Tiruchchirapalli VOTR ------ ---
+loc11=Varanasi/Babatpur VIBN ------ ---
+
+[AS_CN]
+name=People's Republic of China
+loc0=Beijing ZBAA ------ ---
+loc1=Chengdu ZUUU ------ ---
+loc2=Dalian ZYTL ------ ---
+loc3=Guangzhou ZGGG ------ ---
+loc4=Hangzhou ZSHC ------ ---
+loc5=Hong\\ Kong VHHH ------ ---
+loc6=Kunming ZPPP ------ ---
+loc7=Lanzhou ZLLL ------ ---
+loc8=Nanning ZGNN ------ ---
+loc9=Shanghai ZSSS ------ ---
+loc10=Taiyuan ZBYN ------ ---
+loc11=Tianjin ZBTJ ------ ---
+loc12=Urumqi ZWWW ------ ---
+loc13=Xiamen ZSAM ------ ---
+
+[AS_JP]
+name=Japan
+loc0=Akeno\\ Ab RJOE ------ ---
+loc1=Akita\\ Airport RJSK ------ ---
+loc2=Amami\\ Airport RJKA ------ ---
+loc3=Aomori\\ Airport RJSA ------ ---
+loc4=Asahikawa\\ Ab RJCA ------ ---
+loc5=Asahikawa\\ Airport RJEC ------ ---
+loc6=Ashiya\\ Ab RJFA ------ ---
+loc7=Atsugi\\ US\\ NAS RJTA ------ ---
+loc8=Chichijima RJAO ------ ---
+loc9=Chitose\\ Ab RJCC ------ ---
+loc10=Chitose\\ ASDF RJCJ ------ ---
+loc11=Chofu\\ Airport RJTF ------ ---
+loc12=Fuji\\ Ab RJAT ------ ---
+loc13=Fukue\\ Airport RJFE ------ ---
+loc14=Fukui\\ Airport RJNF ------ ---
+loc15=Fukuoka\\ Airport RJFF ------ ---
+loc16=Gifu\\ Ab RJNG ------ ---
+loc17=Hachijojima\\ Airport RJTH ------ ---
+loc18=Hachinohe\\ Ab RJSH ------ ---
+loc19=Hakodate\\ Airport RJCH ------ ---
+loc20=Hamamatsu\\ Ab RJNH ------ ---
+loc21=Hanamaki\\ Airport RJSI ------ ---
+loc22=Hiroshima\\ Airport RJOA ------ ---
+loc23=Hofu\\ Ab RJOF ------ ---
+loc24=Hyakuri\\ Ab RJAH ------ ---
+loc25=Ichikawa RJAI ------ ---
+loc26=Iki\\ Airport RJDB ------ ---
+loc27=Iruma\\ Ab RJTJ ------ ---
+loc28=Iwakuni\\ MCAS RJOI ------ ---
+loc29=Iwojima RJAW ------ ---
+loc30=Izumo\\ Airport RJOC ------ ---
+loc31=Kadena\\ Ab RODN ------ ---
+loc32=Kagoshima\\ Airport RJFK ------ ---
+loc33=Kamigoto RJDK ------ ---
+loc34=Kanoya\\ Ab RJFY ------ ---
+loc35=Kansai\\ International\\ Airport RJBB ------ ---
+loc36=Kasumigaura\\ Ab RJAK ------ ---
+loc37=Kasuminome\\ Ab RJSU ------ ---
+loc38=Kikai\\ Island RJKI ------ ---
+loc39=Kisarazu\\ Ab RJTK ------ ---
+loc40=Kitakyushu\\ Airport RJFR ------ ---
+loc41=Kochi\\ Airport RJOK ------ ---
+loc42=Komatsu\\ Ab RJNK ------ ---
+loc43=Komatsujima\\ Ab RJOP ------ ---
+loc44=Kumamoto\\ Airport RJFT ------ ---
+loc45=Kushiro\\ Airport RJCK ------ ---
+loc46=Matsumoto\\ Airport RJAF ------ ---
+loc47=Matsushima\\ Ab RJST ------ ---
+loc48=Matsuyama\\ Airport RJOM ------ ---
+loc49=Memambetsu\\ Airport RJCM ------ ---
+loc50=Metabaru\\ Ab RJDM ------ ---
+loc51=Miho\\ Ab RJOH ------ ---
+loc52=Minamitorishima RJAM ------ ---
+loc53=Misawa\\ Ab RJSM ------ ---
+loc54=Miyakejima\\ Airport RJTQ ------ ---
+loc55=Miyazaki\\ Airport RJFM ------ ---
+loc56=Mombetsu\\ Airport RJEB ------ ---
+loc57=Nagasaki\\ Airport RJFU ------ ---
+loc58=Nagoya\\ Airport RJNN ------ ---
+loc59=Naha\\ Airport ROAH ------ ---
+loc60=Nakashibetsu\\ Airport RJCN ------ ---
+loc61=Nankishirahama\\ Airport RJBD ------ ---
+loc62=New\\ Tokyo\\ International\\ Airport RJAA ------ ---
+loc63=Niigata\\ Airport RJSN ------ ---
+loc64=Nyutabaru\\ Ab RJFN ------ ---
+loc65=Obihiro\\ Airport RJCB ------ ---
+loc66=Oita\\ Airport RJFO ------ ---
+loc67=Ojika\\ Island RJDO ------ ---
+loc68=Okayama\\ Airport RJOB ------ ---
+loc69=Oki\\ Airport RJNO ------ ---
+loc70=Okinoerabu RJKB ------ ---
+loc71=Okushiri\\ Island RJEO ------ ---
+loc72=Ominato\\ Ab RJSO ------ ---
+loc73=Osaka\\ International\\ Airport RJOO ------ ---
+loc74=Oshima\\ Airport RJTO ------ ---
+loc75=Ozuki\\ Ab RJOZ ------ ---
+loc76=Rebun\\ Island RJCR ------ ---
+loc77=Rishiri\\ Island RJER ------ ---
+loc78=Sapporo\\ Ab RJCO ------ ---
+loc79=Sendai\\ Airport RJSS ------ ---
+loc80=Shimofusa\\ Ab RJTL ------ ---
+loc81=Shizuhama\\ Ab RJNY ------ ---
+loc82=Tachikawa\\ Ab RJTC ------ ---
+loc83=Tajima RJBT ------ ---
+loc84=Takamatsu\\ Airport RJOT ------ ---
+loc85=Tanegashima\\ Airport RJFG ------ ---
+loc86=Tateyama\\ Ab RJTE ------ ---
+loc87=Tokachi\\ GSDF RJCT ------ ---
+loc88=Tokunoshima\\ Island RJKN ------ ---
+loc89=Tokushima\\ Ab RJOS ------ ---
+loc90=Tokyo\\ Heliport RJTI ------ ---
+loc91=Tokyo\\ International\\ Airport RJTT ------ ---
+loc92=Tokyo\\ New\\ International\\ Airport RJAA ------ ---
+loc93=Tottori\\ Airport RJOR ------ ---
+loc94=Toyama\\ Airport RJNT ------ ---
+loc95=Tsuiki\\ Ab RJFZ ------ ---
+loc96=Tsushima\\ Airport RJDT ------ ---
+loc97=Utsunomiya\\ Ab RJTU ------ ---
+loc98=Wakkanai\\ Airport RJCW ------ ---
+loc99=Yakushima RJFC ------ ---
+loc100=Yamagata\\ Airport RJSC ------ ---
+loc101=Yamaguchi\\ Ube\\ Airport RJDC ------ ---
+loc102=Yao\\ Airport RJOY ------ ---
+loc103=Yokosuka\\ Fwf RJTX ------ ---
+loc104=Yokota\\ Ab RJTY ------ ---
+loc105=Zama\\ Airfield RJTR ------ ---
+
+[AS_SG]
+name=Singapore
+loc0=Singapore WSSS ------ ---
+
+[AS_TW]
+name=Taiwan
+loc0=Chia\\ Tung RCFS ------ ---
+loc1=Chiang\\ Kai\\ Shek RCTP ------ ---
+loc2=Chiayi RCKU ------ ---
+loc3=Chihhang RCQS ------ ---
+loc4=Chinmem/Shatou RCBS ------ ---
+loc5=Dongsha RCLM ------ ---
+loc6=Dongshi RCNO ------ ---
+loc7=Feng\\ Nin RCFN ------ ---
+loc8=Hengchun RCKW ------ ---
+loc9=Hsinchu RCPO ------ ---
+loc10=Hulien RCYU ------ ---
+loc11=Ilan RCMS ------ ---
+loc12=Kangshan RCAY ------ ---
+loc13=Kaohsiung RCKH ------ ---
+loc14=Makung RCQC ------ ---
+loc15=Mazu RCFG ------ ---
+loc16=Pa\\ Kuei/Bakuai RCUK ------ ---
+loc17=Pingtung\\ North RCSQ ------ ---
+loc18=Pingtung\\ South RCDC ------ ---
+loc19=Sungshan/Taipei RCSS ------ ---
+loc20=Taichung RCLG ------ ---
+loc21=Tainan RCNN ------ ---
+loc22=Taoyuan RCGM ------ ---
+loc23=Wuchia\\ Observatory RCMQ ------ ---
+
+[M_]
+name=Central and South America
+states=BS BZ KY CU CR DO SV GT HT HN JM MX NI PA AR BR BO CL CO EC PY PE SR UY VE
+
+[M__BS]
+name=Bahamas
+loc0=Freeport MYGF ------ ---
+loc1=Nassau MYNN ------ ---
+
+[M__BZ]
+name=Belize
+loc0=Belize MZBZ ------ ---
+
+[M__KY]
+name=Cayman Islands
+loc0=Grand\\ Cayman MWCR ------ ---
+
+[M__CU]
+name=Cuba
+loc0=Baracoa MUBA ------ ---
+loc1=Bayamo MUBY ------ ---
+loc2=Camaguey MUCM ------ ---
+loc3=Cayo\\ Largo\\ del\\ Sur MUCL ------ ---
+loc4=Guantanamo MUGT ------ ---
+loc5=Habana MUHA ------ ---
+loc6=Holguin MUHG ------ ---
+loc7=Las\\ Tunas MUVT ------ ---
+loc8=Manzanillo MUMZ ------ ---
+loc9=Moa MUMO ------ ---
+loc10=Nueva\\ Gerona MUNG ------ ---
+loc11=Santiago\\ de\\ Cuba MUCU ------ ---
+loc12=Varadero MUVR ------ ---
+loc13=Venezuela MUCA ------ ---
+
+[M__CR]
+name=Costa Rica
+loc0=Chacarita MRCH ------ ---
+loc1=Juan\\ Santamaria MROC ------ ---
+loc2=Liberia MRLB ------ ---
+loc3=Puerto\\ Limon MRLM ------ ---
+loc4=Tobias\\ Bolanos MRPV ------ ---
+
+[M__DO]
+name=Dominican Republic
+loc0=La\\ Romana MDLR ------ ---
+loc1=Las\\ Americas MDSD ------ ---
+loc2=Puerto\\ Plata MDPP ------ ---
+loc3=Punta\\ Cana MDPC ------ ---
+loc4=Santiago MDST ------ ---
+
+[M__SV]
+name=El Salvador
+loc0=Acajutla MSAC ------ ---
+loc1=El\\ Salvador\\ Int. MSLP ------ ---
+loc2=San\\ Miguel MSSM ------ ---
+loc3=San\\ Salvador MSSS ------ ---
+loc4=Santa\\ Ana MSSA ------ ---
+
+[M__GT]
+name=Guatemala
+loc0=Flores MGFL ------ ---
+loc1=Guatemala MGGT ------ ---
+loc2=Huehuetenango MGHT ------ ---
+loc3=Puerto\\ Barrios MGPB ------ ---
+loc4=San\\ Jose MGSJ ------ ---
+
+[M__HT]
+name=Haiti
+loc0=Port-Au-Prince MTPP ------ ---
+
+[M__HN]
+name=Honduras
+loc0=Amapala MHAM ------ ---
+loc1=Catacamas MHCA ------ ---
+loc2=Choluteca MHCH ------ ---
+loc3=La\\ Ceiba MHLC ------ ---
+loc4=La\\ Esperanza MHLE ------ ---
+loc5=La\\ Mesa MHLM ------ ---
+loc6=Nueva\\ Ocotepeque MHSC ------ ---
+loc7=Puerto\\ Lempira MHPL ------ ---
+loc8=Roatan MHRO ------ ---
+loc9=Santa\\ Rosa\\ de\\ Copan MHSR ------ ---
+loc10=Tegucigalpa MHTG ------ ---
+loc11=Tela MHTE ------ ---
+loc12=Yoro MHYR ------ ---
+
+[M__JM]
+name=Jamaica
+loc0=Kingston MKJP ------ ---
+loc1=Montego\\ Bay MKJA ------ ---
+
+[M__NI]
+name=Nicaragua
+loc0=Bluefields MNBL ------ ---
+loc1=Chinandega MNCH ------ ---
+loc2=Jinotega MNJG ------ ---
+loc3=Juigalpa MNJU ------ ---
+loc4=Managua MNMG ------ ---
+loc5=Puerto\\ Cabezas MNPC ------ ---
+loc6=Rivas MNRS ------ ---
+
+[M__PA]
+name=Panama
+loc0=Bocas\\ del\\ Toro MPBO ------ ---
+loc1=David MPDA ------ ---
+loc2=Howard\\ AFB MPHO ------ ---
+loc3=Panama MPMG ------ ---
+loc4=Santiago MPSA ------ ---
+loc5=Tocumen MPTO ------ ---
+
+[M__BO]
+name=Bolivia
+loc0=Camiri SLCA ------ ---
+loc1=Cobija SLCO ------ ---
+loc2=Cochabamba SLCB ------ ---
+loc3=Concepcion SLCP ------ ---
+loc4=La\\ Paz/Alto SLLP ------ ---
+loc5=Magdalena SLMG ------ ---
+loc6=Oruro SLOR ------ ---
+loc7=Potosi SLPO ------ ---
+loc8=Puerto\\ Suarez SLPS ------ ---
+loc9=Reyes SLRY ------ ---
+loc10=Riberalta SLRI ------ ---
+loc11=Robore SLRB ------ ---
+loc12=Rurrenabaque SLRQ ------ ---
+loc13=San\\ Ignacio\\ De\\ Velasco SLSI ------ ---
+loc14=San\\ Joaquin SLJO ------ ---
+loc15=San\\ Jose\\ De\\ Chiquitos SLJE ------ ---
+loc16=Santa\\ Ana SLSA ------ ---
+loc17=Sucre SLSU ------ ---
+loc18=Tarija SLTJ ------ ---
+loc19=Trinidad SLTR ------ ---
+loc20=Villamontes SLVM ------ ---
+loc21=Viru-Viru SLVR ------ ---
+loc22=Yacuiba SLYA ------ ---
+
+[M__CL]
+name=Chile
+loc0=Antofagasta SCFA ------ ---
+loc1=Arica SCAR ------ ---
+loc2=Concepcion SCIE ------ ---
+loc3=Iquique/Diego\\ Arac SCDA ------ ---
+loc4=Pudahuel SCEL ------ ---
+loc5=Puerto\\ Montt SCTE ------ ---
+loc6=Punta\\ Arenas SCCI ------ ---
+
+[M__CO]
+name=Colombia
+loc0=Barranquilla/Ernestocortissoz SKBQ ------ ---
+loc1=Bogota/Eldorado SKBO ------ ---
+loc2=Bucaramanga/Palonegro SKBG ------ ---
+loc3=Cali/Alfonso\\ Bonillaaragon SKCL ------ ---
+loc4=Cartagena/Rafael\\ Nunez SKCG ------ ---
+loc5=Leticia/Vasquez\\ Cobo SKLT ------ ---
+loc6=Pereira/Matecana SKPE ------ ---
+loc7=Rionegro/J.M.Cordova SKRG ------ ---
+loc8=San\\ Andres\\ Isla/Sesquicentenario SKSP ------ ---
+loc9=Santa\\ Marta/Simon\\ Bolivar SKSM ------ ---
+
+[M__EC]
+name=Ecuador
+loc0=Guayaquil/Simon\\ Bolivar SEGU ------ ---
+loc1=Manta SEMT ------ ---
+loc2=Quito/Mariscal\\ Sucre SEQU ------ ---
+
+[M__PY]
+name=Paraguay
+loc0=Asuncion SGAS ------ ---
+loc1=Guarany SGES ------ ---
+
+[M__PE]
+name=Peru
+loc0=Andahuayla SPHY ------ ---
+loc1=Arequipa SPQU ------ ---
+loc2=Ayacucho SPHO ------ ---
+loc3=Chiclayo SPHI ------ ---
+loc4=Cuzco SPZO ------ ---
+loc5=Huanuco SPNC ------ ---
+loc6=Iquitos SPQT ------ ---
+loc7=Juanjui SPJI ------ ---
+loc8=Juliaca SPJL ------ ---
+loc9=Lima-Callao SPIM ------ ---
+loc10=Pisco SPSO ------ ---
+loc11=Pucallpa SPCL ------ ---
+loc12=Puerto\\ Maldonado SPTU ------ ---
+loc13=Rioja SPJA ------ ---
+loc14=Tacna SPTN ------ ---
+loc15=Talara SPYL ------ ---
+loc16=Yurimaguas SPMS ------ ---
+
+[M__SR]
+name=Suriname
+loc0=Johan\\ A.\\ Pengel SMJP ------ ---
+
+[M__UY]
+name=Uruguay
+loc0=Artigas SUAG ------ ---
+loc1=Capitan\\ Corbeta SULS ------ ---
+loc2=Colonia SUCA ------ ---
+loc3=Durazno SUDU ------ ---
+loc4=Maldonado/Punta\\ Est SUPE ------ ---
+loc5=Melilla SUAA ------ ---
+loc6=Montevideo/Carrasco SUMU ------ ---
+loc7=Paysandu SUPU ------ ---
+loc8=Rivera SURV ------ ---
+loc9=Salto SUSO ------ ---
+loc10=Tacuarembo SUTB ------ ---
+
+[M__VE]
+name=Venezuela
+loc0=Acarigua SVAC ------ ---
+loc1=Barcelona SVBC ------ ---
+loc2=Barinas SVBI ------ ---
+loc3=Barquisimeto SVBM ------ ---
+loc4=Calabozo SVCL ------ ---
+loc5=Caracas SVMI ------ ---
+loc6=Ciudad\\ Bolivar SVCB ------ ---
+loc7=Coro SVCR ------ ---
+loc8=Cumana SVCU ------ ---
+loc9=Guanare SVGU ------ ---
+loc10=Maracaibo-La\\ Chinita SVMC ------ ---
+loc11=Maracay-B.A.Sucre SVBS ------ ---
+loc12=Margarita SVMG ------ ---
+loc13=Mene\\ Grande SVMN ------ ---
+loc14=Merida SVMD ------ ---
+loc15=San\\ Antonio\\ Del\\ Tachira SVSA ------ ---
+loc16=San\\ Fernando\\ De\\ Apure SVSR ------ ---
+loc17=Valera* SVVL ------ ---
+
+[M__MX]
+name=Mexico
+loc0=Acapulco MMAA ------ ---
+loc1=Aeropuerto\\ del\\ Norte MMAN ------ ---
+loc2=Aguascaliantes MMAS ------ ---
+loc3=Bahias\\ de\\ Huatulco MMBT ------ ---
+loc4=Campeche MMCP ------ ---
+loc5=Cancun MMUN ------ ---
+loc6=Chetumal MMCM ------ ---
+loc7=Chihuahua MMCU ------ ---
+loc8=Ciudad\\ del\\ Carmen MMCE ------ ---
+loc9=Ciudad\\ Juarez MMCS ------ ---
+loc10=Ciudad\\ Obregon MMCN ------ ---
+loc11=Ciudad\\ Victoria MMCV ------ ---
+loc12=Colima MMIA ------ ---
+loc13=Cozumel MMCZ ------ ---
+loc14=Cuernavaca MMCB ------ ---
+loc15=Culiacan MMCL ------ ---
+loc16=Del\\ Bajio MMLO ------ ---
+loc17=Durango MMDO ------ ---
+loc18=Guadalajara MMGL ------ ---
+loc19=Guaymas MMGM ------ ---
+loc20=Hermosillo MMHO ------ ---
+loc21=Ixtapa MMZH ------ ---
+loc22=La\\ Paz MMLP ------ ---
+loc23=Los\\ Mochis MMLM ------ ---
+loc24=Manzanillo MMZO ------ ---
+loc25=Matamoros MMMA ------ ---
+loc26=Mazatlan MMMZ ------ ---
+loc27=Merida MMMD ------ ---
+loc28=Mexicali MMML ------ ---
+loc29=Mexico MMMX ------ ---
+loc30=Minatitlan MMMT ------ ---
+loc31=Monclova MMMV ------ ---
+loc32=Morelia MMMM ------ ---
+loc33=Monterrey MMMY ------ ---
+loc34=Nuevo\\ Laredo MMNL ------ ---
+loc35=Oaxaca MMOX ------ ---
+loc36=Piedras\\ Negras MMPG ------ ---
+loc37=Poza\\ Rica MMPA ------ ---
+loc38=Puebla MMPB ------ ---
+loc39=Puerto\\ Vallarta MMPR ------ ---
+loc40=Puerto\\ Escondido MMPS ------ ---
+loc41=Queretaro MMQT ------ ---
+loc42=Reynosa MMRX ------ ---
+loc43=Saltillo MMIO ------ ---
+loc44=San\\ Jose\\ del\\ Cabo MMSD ------ ---
+loc45=San\\ Luis\\ Potosi MMSP ------ ---
+loc46=Tampico MMTM ------ ---
+loc47=Tapachula MMTP ------ ---
+loc48=Tepic MMEP ------ ---
+loc49=Tijuana MMTJ ------ ---
+loc50=Toluca MMTO ------ ---
+loc51=Torreon MMTC ------ ---
+loc52=Tulancingo MMTL ------ ---
+loc53=Tuxtla\\ Gutierrez MMTG ------ ---
+loc54=Uruapan MMPN ------ ---
+loc55=Veracruz MMVR ------ ---
+loc56=Villahermosa MMVA ------ ---
+loc57=Zacatecas MMZC ------ ---
+
+[M__AR]
+name=Argentina
+loc0=Aeroparque SABE ------ ---
+loc1=Bahia\\ Blanca SAZB ------ ---
+loc2=Bariloche SAZS ------ ---
+loc3=Comodoro\\ Rivadavia SAVC ------ ---
+loc4=Concordia SAAC ------ ---
+loc5=Cordoba SACO ------ ---
+loc6=Corrientes SARC ------ ---
+loc7=Don\\ Torcuato SADD ------ ---
+loc8=Ezeiza SAEZ ------ ---
+loc9=Formosa SARF ------ ---
+loc10=Iguazu SARI ------ ---
+loc11=Jujuy SASJ ------ ---
+loc12=Mar\\ Del\\ Plata SAZM ------ ---
+loc13=Mendoza SAME ------ ---
+loc14=Neuquen SAZN ------ ---
+loc15=Paso\\ De\\ Los\\ Libres SARL ------ ---
+loc16=Posadas SARP ------ ---
+loc17=Resistencia SARE ------ ---
+loc18=Rio\\ Gallegos SAWG ------ ---
+loc19=Rio\\ Grande SAWE ------ ---
+loc20=Rosario SAAR ------ ---
+loc21=Salta SASA ------ ---
+loc22=San\\ Juan SANU ------ ---
+loc23=Santiago\\ Del\\ Estero SANE ------ ---
+loc24=Sauce\\ Viejo SAAV ------ ---
+loc25=Trelew SAVT ------ ---
+loc26=Tucuman SANT ------ ---
+loc27=Villa\\ Reynolds SAOR ------ ---
+
+[M__BR]
+name=Brazil
+loc0=Afonsos SBAF ------ ---
+loc1=Altamira SBHT ------ ---
+loc2=Aracaju SBAR ------ ---
+loc3=Bage SBBG ------ ---
+loc4=Bauru SBBU ------ ---
+loc5=Belem SBBE ------ ---
+loc6=Belo\\ Horizonte SBCF ------ ---
+loc7=Belo\\ Horizonte\\ Apt SBBH ------ ---
+loc8=Boa\\ Vista SBBV ------ ---
+loc9=Brasilia SBBR ------ ---
+loc10=Campinas SBKP ------ ---
+loc11=Campo\\ Grande SBCG ------ ---
+loc12=Caravelas SBCV ------ ---
+loc13=Conceicao\\ Do\\ Araguaia SBAA ------ ---
+loc14=Corumba SBCR ------ ---
+loc15=Cuiaba SBCY ------ ---
+loc16=Curitiba SBBI ------ ---
+loc17=Curitiba\\ Apt SBCT ------ ---
+loc18=Eduardo\\ Gomes\\ International SBEG ------ ---
+loc19=Fernando\\ De\\ Noronha SBFN ------ ---
+loc20=Florianopolis SBFL ------ ---
+loc21=Fortaleza SBFZ ------ ---
+loc22=Foz\\ Do\\ Iguacu SBFI ------ ---
+loc23=Galeao SBGL ------ ---
+loc24=Goiania SBGO ------ ---
+loc25=Guaratingueta SBGW ------ ---
+loc26=Guarulhos SBGR ------ ---
+loc27=Itaituba SBIH ------ ---
+loc28=Londrina SBLO ------ ---
+loc29=Macae SBME ------ ---
+loc30=Macapa SBMQ ------ ---
+loc31=Maceio SBMO ------ ---
+loc32=Manaus SBMN ------ ---
+loc33=Maraba SBMA ------ ---
+loc34=Marte SBMT ------ ---
+loc35=Natal SBNT ------ ---
+loc36=Pelotas SBPK ------ ---
+loc37=Pirassununga SBYS ------ ---
+loc38=Pocos\\ De\\ Caldas SBPC ------ ---
+loc39=Ponta\\ Pora SBPP ------ ---
+loc40=Porto\\ Alegre SBCO ------ ---
+loc41=Porto\\ Alegre\\ Apt SBPA ------ ---
+loc42=Porto\\ Velho SBPV ------ ---
+loc43=Presidente\\ Prudente SBDN ------ ---
+loc44=Recife SBRF ------ ---
+loc45=Rio\\ /\\ Jacarepagua SBJR ------ ---
+loc46=Rio\\ De\\ Janeiro SBRJ ------ ---
+loc47=Salvador SBSV ------ ---
+loc48=Santa\\ Cruz SBSC ------ ---
+loc49=Santa\\ Maria SBSM ------ ---
+loc50=Santarem SBSN ------ ---
+loc51=Santos SBST ------ ---
+loc52=Sao\\ Jose\\ Dos\\ Campo SBSJ ------ ---
+loc53=Sao\\ Luiz SBSL ------ ---
+loc54=Sao\\ Paulo SBSP ------ ---
+loc55=Tabatinga SBTT ------ ---
+loc56=Teresina SBTE ------ ---
+loc57=Tucurui SBTU ------ ---
+loc58=Uberaba SBUR ------ ---
+loc59=Uruguaiana SBUG ------ ---
+loc60=Vilhena SBVH ------ ---
+loc61=Vitoria SBVT ------ ---
+
+[AT]
+name=Atlantic
+states=AG PR
+
+[AT_PR]
+name=Puerto Rico
+loc0=Aquadilla TJBQ ------ ---
+loc1=San\\ Juan TJSJ ------ ---
+loc2=Mayaguez TJMZ ------ ---
+loc3=Ponce TJPS ------ ---
+
+[AT_AG]
+name=Antigua and Barbuda
+loc0=Antigua TAPA ------ ---
+
diff --git a/my-evolution/Makefile.am b/my-evolution/Makefile.am
new file mode 100644
index 0000000000..877b90818c
--- /dev/null
+++ b/my-evolution/Makefile.am
@@ -0,0 +1,85 @@
+bin_PROGRAMS = evolution-executive-summary
+
+INCLUDES = \
+ -I$(top_srcdir) \
+ -I$(top_builddir)/shell \
+ -I$(top_srcdir)/shell \
+ -I$(top_srcdir)/calendar \
+ $(EXTRA_GNOME_CFLAGS) \
+ $(GNOME_VFS_CFLAGS) \
+ $(GTKHTML_CFLAGS) \
+ -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \
+ -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \
+ -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \
+ -DEVOLUTION_DATADIR=\""$(datadir)"\" \
+ -DG_LOG_DOMAIN=\"evolution-executive-summary\"
+
+IDLS = \
+ $(top_srcdir)/mail/Mail.idl
+
+MAIL_GENERATED = \
+ Mail.h \
+ Mail-common.c \
+ Mail-skels.c \
+ Mail-stubs.c
+
+$(MAIL_GENERATED): $(IDLS)
+ $(ORBIT_IDL) -I $(srcdir) `$(GNOME_CONFIG) --cflags idl` $(top_srcdir)/mail/Mail.idl
+
+evolution_executive_summary_SOURCES = \
+ $(MAIL_GENERATED) \
+ component-factory.c \
+ component-factory.h \
+ e-summary.c \
+ e-summary.h \
+ e-summary-calendar.c \
+ e-summary-calendar.h \
+ e-summary-factory.c \
+ e-summary-factory.h \
+ e-summary-mail.c \
+ e-summary-mail.h \
+ e-summary-rdf.h \
+ e-summary-rdf.c \
+ e-summary-weather.c \
+ e-summary-weather.h \
+ main.c \
+ metar.c \
+ metar.h
+
+evolution_executive_summary_LDADD = \
+ $(top_builddir)/shell/libeshell.a \
+ $(top_builddir)/widgets/misc/libemiscwidgets.a \
+ $(top_builddir)/e-util/libeutil.la \
+ $(top_builddir)/calendar/cal-client/libcal-client.la \
+ $(top_builddir)/calendar/cal-util/libcal-util.la \
+ $(top_builddir)/libversit/libversit.la \
+ $(top_builddir)/libical/src/libical/libical.la \
+ $(BONOBO_VFS_GNOME_LIBS) \
+ $(EXTRA_GNOME_LIBS) \
+ -lgal \
+ $(GTKHTML_LIBS)
+
+Locationdir = $(datadir)/evolution
+Location_DATA = Locations
+
+oafdir = $(datadir)/oaf
+oaf_in_files = GNOME_Evolution_Summary.oaf.in
+oaf_DATA = $(oaf_in_files:.oaf.in=.oaf)
+
+@XML_I18N_MERGE_OAF_RULES@
+
+EXTRA_DIST = $(oaf_in_files) $(oaf_DATA) $(Location_DATA)
+
+if ENABLE_PURIFY
+PLINK = $(LIBTOOL) --mode=link $(PURIFY) $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+
+all-local: evolution-executive-summary.pure
+
+evolution-executive-summary.pure: evolution-executive-summary
+ @rm -f evolution-executive-summary.pure
+ $(PLINK) $(evolution_executive_summary_OBJECTS) $(evolution_executive_summary_LDADD) $(LIBS)
+
+endif
+
+dist-hook:
+ cd $(distdir); rm -f $(BUILT_SOURCES)
diff --git a/my-evolution/component-factory.c b/my-evolution/component-factory.c
new file mode 100644
index 0000000000..4e3f5eeec5
--- /dev/null
+++ b/my-evolution/component-factory.c
@@ -0,0 +1,132 @@
+/*
+ * component-factory.c: Component factory registration for Executive Summary.
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <bonobo/bonobo-object.h>
+#include <bonobo/bonobo-generic-factory.h>
+#include <bonobo/bonobo-context.h>
+
+#include <shell/evolution-shell-component.h>
+#include <shell/Evolution.h>
+
+#include "e-summary-factory.h"
+#include "component-factory.h"
+#include <gal/widgets/e-gui-utils.h>
+
+#define COMPONENT_FACTORY_IID "OAFIID:GNOME_Evolution_Summary_ShellComponentFactory"
+
+static gint running_objects = 0;
+
+static const EvolutionShellComponentFolderType folder_types[] = {
+ { "My Evolution", "evolution-today.png" },
+ { NULL, NULL }
+};
+
+static char *evolution_dir = NULL;
+
+/* EvolutionShellComponent methods and signals */
+
+static EvolutionShellComponentResult
+create_view (EvolutionShellComponent *shell,
+ const char *physical_uri,
+ const char *folder_type,
+ BonoboControl **control_return,
+ void *closure)
+{
+ EvolutionShellClient *shell_client;
+ GNOME_Evolution_Shell corba_shell;
+ BonoboControl *control;
+
+ if (g_strcasecmp (folder_type, "My Evolution") != 0) {
+ return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE;
+ }
+
+ shell_client = evolution_shell_component_get_owner (shell);
+ corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell_client));
+ control = e_summary_factory_new_control (physical_uri, corba_shell);
+ if (!control)
+ return EVOLUTION_SHELL_COMPONENT_NOTFOUND;
+
+ *control_return = control;
+
+ return EVOLUTION_SHELL_COMPONENT_OK;
+}
+
+static void
+owner_set_cb (EvolutionShellComponent *shell_component,
+ EvolutionShellClient *shell_client,
+ const char *evolution_homedir,
+ gpointer user_data)
+{
+ if (evolution_dir != NULL) {
+ evolution_dir = g_strdup (evolution_homedir);
+ }
+}
+
+static void
+owner_unset_cb (EvolutionShellComponent *shell_component,
+ gpointer user_data)
+{
+ gtk_main_quit ();
+}
+
+static void
+component_destroy (BonoboObject *factory,
+ gpointer user_data)
+{
+ running_objects--;
+
+ if (running_objects > 0) {
+ return;
+ }
+
+ gtk_main_quit ();
+}
+
+static BonoboObject *
+factory_fn (BonoboGenericFactory *factory,
+ void *closure)
+{
+ EvolutionShellComponent *shell_component;
+
+ running_objects++;
+
+ shell_component = evolution_shell_component_new (folder_types,
+ create_view,
+ NULL, NULL,
+ NULL, NULL,
+ NULL, NULL);
+ gtk_signal_connect (GTK_OBJECT (shell_component), "destroy",
+ GTK_SIGNAL_FUNC (component_destroy), NULL);
+ gtk_signal_connect (GTK_OBJECT (shell_component), "owner_set",
+ GTK_SIGNAL_FUNC (owner_set_cb), NULL);
+ gtk_signal_connect (GTK_OBJECT (shell_component), "owner_unset",
+ GTK_SIGNAL_FUNC (owner_unset_cb), NULL);
+
+ return BONOBO_OBJECT (shell_component);
+}
+
+void
+component_factory_init (void)
+{
+ BonoboGenericFactory *object;
+
+ object = bonobo_generic_factory_new (COMPONENT_FACTORY_IID,
+ factory_fn, NULL);
+
+ if (object == NULL) {
+ e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
+ _("Cannot initialize Evolution's Executive Summary component."));
+ exit (1);
+ }
+
+ bonobo_running_context_auto_exit_unref (BONOBO_OBJECT (object));
+}
diff --git a/my-evolution/component-factory.h b/my-evolution/component-factory.h
new file mode 100644
index 0000000000..f4b0c0e1a8
--- /dev/null
+++ b/my-evolution/component-factory.h
@@ -0,0 +1,14 @@
+/*
+ * component-factory.h: Header file for component-factory.c
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifndef __COMPONENT_FACTORY_H__
+#define __COMPONENT_FACTORY_H__
+
+void component_factory_init (void);
+
+#endif
diff --git a/my-evolution/e-summary-calendar.c b/my-evolution/e-summary-calendar.c
new file mode 100644
index 0000000000..2e2a1b5199
--- /dev/null
+++ b/my-evolution/e-summary-calendar.c
@@ -0,0 +1,286 @@
+/*
+ * e-summary-calendar.c:
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gnome.h>
+
+#include "e-summary-calendar.h"
+#include "e-summary.h"
+#include <cal-client/cal-client.h>
+#include <cal-util/timeutil.h>
+
+struct _ESummaryCalendar {
+ CalClient *client;
+
+ char *html;
+};
+
+const char *
+e_summary_calendar_get_html (ESummary *summary)
+{
+ if (summary->calendar == NULL) {
+ return NULL;
+ }
+
+ return summary->calendar->html;
+}
+
+/* list_sort_merge, and list_sort are copied from GNOME-VFS.
+ Author: Sven Oliver <sven.over@ob.kamp.net>
+ Modified by Ettore Perazzoli <ettore@comm2000.it> to let the compare
+ functions get an additional gpointer parameter.
+
+ Included here as using gnome-vfs for 1 20 line function
+ seems a bit of overkill.
+*/
+
+typedef gint (* CalSummaryListCompareFunc) (gconstpointer a,
+ gconstpointer b,
+ gpointer data);
+static GList *
+cal_list_sort_merge (GList *l1,
+ GList *l2,
+ CalSummaryListCompareFunc compare_func,
+ gpointer data)
+{
+ GList list, *l, *lprev;
+
+ l = &list;
+ lprev = NULL;
+
+ while (l1 && l2) {
+ if (compare_func (l1->data, l2->data, data) < 0) {
+ l->next = l1;
+ l = l->next;
+ l->prev = lprev;
+ lprev = l;
+ l1 = l1->next;
+ } else {
+ l->next = l2;
+ l = l->next;
+ l->prev = lprev;
+ lprev = l;
+ l2 = l2->next;
+ }
+ }
+
+ l->next = l1 ? l1 : l2;
+ l->next->prev = l;
+
+ return list.next;
+}
+
+static GList *
+cal_list_sort (GList *list,
+ CalSummaryListCompareFunc compare_func,
+ gpointer data)
+{
+ GList *l1, *l2;
+
+ if (!list)
+ return NULL;
+ if (!list->next)
+ return list;
+
+ l1 = list;
+ l2 = list->next;
+
+ while ((l2 = l2->next) != NULL) {
+ if ((l2 = l2->next) == NULL)
+ break;
+ l1 = l1->next;
+ }
+
+ l2 = l1->next;
+ l1->next = NULL;
+
+ return cal_list_sort_merge (cal_list_sort (list, compare_func, data),
+ cal_list_sort (l2, compare_func, data),
+ compare_func, data);
+}
+
+static int
+sort_uids (gconstpointer a,
+ gconstpointer b,
+ gpointer user_data)
+{
+ CalComponent *comp_a, *comp_b;
+ ESummary *summary = user_data;
+ ESummaryCalendar *calendar = summary->calendar;
+ CalClientGetStatus status;
+ CalComponentDateTime start_a, start_b;
+
+ /* a after b then return > 0 */
+
+ status = cal_client_get_object (calendar->client, a, &comp_a);
+ if (status != CAL_CLIENT_GET_SUCCESS)
+ return -1;
+
+ status = cal_client_get_object (calendar->client, b, &comp_b);
+ if (status != CAL_CLIENT_GET_SUCCESS)
+ return 1;
+
+ cal_component_get_dtstart (comp_a, &start_a);
+ cal_component_get_dtstart (comp_b, &start_b);
+
+ return icaltime_compare (*start_a.value, *start_b.value);
+}
+
+static gboolean
+generate_html (gpointer data)
+{
+ ESummary *summary = data;
+ ESummaryCalendar *calendar = summary->calendar;
+ GList *uids, *l;
+ GString *string;
+ char *tmp;
+ time_t t, day_begin, day_end;
+
+ t = time (NULL);
+ day_begin = time_day_begin (t);
+ day_end = time_day_end (t);
+
+ uids = cal_client_get_objects_in_range (calendar->client,
+ CALOBJ_TYPE_EVENT, day_begin,
+ day_end);
+ if (uids == NULL) {
+ if (calendar->html) {
+ g_free (calendar->html);
+ }
+ calendar->html = g_strdup ("<dl><dt><img src=\"ico-calendar.png\" align=\"middle\" "
+ "alt=\"\" width=\"48\" height=\"48\"> <b><a href=\"evolution:/local/Calendar\">Appointments</a>"
+ "</b></dt><dd><b>No appointments</b></dd></dl>");
+
+ e_summary_draw (summary);
+ return FALSE;
+ } else {
+ uids = cal_list_sort (uids, sort_uids, summary);
+
+ string = g_string_new ("<dl><dt><img src=\"ico-calendar.png\" align=\"middle\" "
+ "alt=\"\" width=\"48\" height=\"48\"> <b><a href=\"evolution:/local/Calendar\">Appointments</a>"
+ "</b></dt><dd>");
+ for (l = uids; l; l = l->next) {
+ char *uid, *start_str;
+ CalComponent *comp;
+ CalComponentText text;
+ CalClientGetStatus status;
+ CalComponentDateTime start, end;
+ time_t start_t;
+ struct tm *start_tm;
+
+ uid = l->data;
+ status = cal_client_get_object (calendar->client, uid, &comp);
+ if (status != CAL_CLIENT_GET_SUCCESS) {
+ continue;
+ }
+
+ cal_component_get_summary (comp, &text);
+ cal_component_get_dtstart (comp, &start);
+ cal_component_get_dtend (comp, &end);
+
+ start_t = icaltime_as_timet (*start.value);
+
+ start_str = g_new (char, 20);
+ start_tm = localtime (&start_t);
+ strftime (start_str, 19, _("%I:%M%p"), start_tm);
+
+#if 0
+ end_str = g_new (char, 20);
+ end_t = icaltime_as_timet (*end.value);
+ end_tm = localtime (&end_t);
+ strftime (end_str, 19, _("%I:%M%p"), end_tm);
+#endif
+ tmp = g_strdup_printf ("<img align=\"middle\" src=\"es-appointments.png\" "
+ "alt=\"\" width=\"16\" height=\"16\"> &#160; "
+ "<font size=\"-1\"><a href=\"#\">%s, %s</a></font><br>",
+ start_str, text.value);
+ g_free (start_str);
+
+ g_string_append (string, tmp);
+ g_free (tmp);
+ }
+
+ cal_obj_uid_list_free (uids);
+ g_string_append (string, "</ul>");
+ }
+
+ if (calendar->html) {
+ g_free (calendar->html);
+ }
+ calendar->html = string->str;
+ g_string_free (string, FALSE);
+
+ e_summary_draw (summary);
+ return FALSE;
+}
+
+static void
+cal_opened_cb (CalClient *client,
+ CalClientOpenStatus status,
+ ESummary *summary)
+{
+ if (status == CAL_CLIENT_OPEN_SUCCESS) {
+ g_idle_add (generate_html, summary);
+ } else {
+ /* Need to work out what to do if there's an error */
+ }
+}
+static void
+obj_changed_cb (CalClient *client,
+ const char *uid,
+ gpointer data)
+{
+ g_idle_add (generate_html, data);
+}
+
+static void
+e_summary_calendar_protocol (ESummary *summary,
+ const char *uri,
+ void *closure)
+{
+
+}
+
+void
+e_summary_calendar_init (ESummary *summary)
+{
+ ESummaryCalendar *calendar;
+ gboolean result;
+ char *uri;
+
+ g_return_if_fail (summary != NULL);
+
+ calendar = g_new (ESummaryCalendar, 1);
+ summary->calendar = calendar;
+ calendar->html = NULL;
+
+ calendar->client = cal_client_new ();
+ if (calendar->client == NULL) {
+ g_warning ("Error making the client");
+ return;
+ }
+
+ gtk_signal_connect (GTK_OBJECT (calendar->client), "cal-opened",
+ GTK_SIGNAL_FUNC (cal_opened_cb), summary);
+ gtk_signal_connect (GTK_OBJECT (calendar->client), "obj-updated",
+ GTK_SIGNAL_FUNC (obj_changed_cb), summary);
+ gtk_signal_connect (GTK_OBJECT (calendar->client), "obj-removed",
+ GTK_SIGNAL_FUNC (obj_changed_cb), summary);
+
+ uri = gnome_util_prepend_user_home ("evolution/local/Calendar/calendar.ics");
+ result = cal_client_open_calendar (calendar->client, uri, FALSE);
+ g_free (uri);
+ if (result == FALSE) {
+ g_message ("Open calendar failed");
+ }
+
+ e_summary_add_protocol_listener (summary, "calendar", e_summary_calendar_protocol, calendar);
+}
diff --git a/my-evolution/e-summary-calendar.h b/my-evolution/e-summary-calendar.h
new file mode 100644
index 0000000000..d485be3b7c
--- /dev/null
+++ b/my-evolution/e-summary-calendar.h
@@ -0,0 +1,18 @@
+/*
+ * e-summary-calendar.h
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifndef __E_SUMMARY_CALENDAR_H__
+#define __E_SUMMARY_CALENDAR_H__
+
+#include "e-summary-type.h"
+
+typedef struct _ESummaryCalendar ESummaryCalendar;
+
+const char *e_summary_calendar_get_html (ESummary *summary);
+void e_summary_calendar_init (ESummary *summary);
+#endif
diff --git a/my-evolution/e-summary-factory.c b/my-evolution/e-summary-factory.c
new file mode 100644
index 0000000000..1a85519584
--- /dev/null
+++ b/my-evolution/e-summary-factory.c
@@ -0,0 +1,132 @@
+/*
+ * e-summary-factory.c: Executive Summary Factory.
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <bonobo/bonobo-control.h>
+#include <bonobo/bonobo-exception.h>
+#include <bonobo/bonobo-ui-util.h>
+
+#include "e-util/e-gui-utils.h"
+#include "e-summary.h"
+#include "e-summary-factory.h"
+
+BonoboUIVerb verbs[] = {
+ BONOBO_UI_VERB ("PrintMyEvolution", e_summary_print),
+ BONOBO_UI_VERB_END
+};
+
+#if 0
+static EPixmap pixmaps [] = {
+ E_PIXMAP ("/menu/File/Print/Print", "print.xpm"),
+ E_PIXMAP_END
+};
+#endif
+
+static void
+control_activate (BonoboControl *control,
+ BonoboUIComponent *ui_component,
+ ESummary *summary)
+{
+ Bonobo_UIContainer container;
+
+ container = bonobo_control_get_remote_ui_container (control);
+ bonobo_ui_component_set_container (ui_component, container);
+ bonobo_object_release_unref (container, NULL);
+
+ bonobo_ui_component_add_verb_list_with_data (ui_component, verbs, summary);
+ bonobo_ui_component_freeze (ui_component, NULL);
+
+ bonobo_ui_util_set_ui (ui_component, EVOLUTION_DATADIR,
+ "my-evolution.xml", "my-evolution");
+/* e_pixmaps_update (ui_component, pixmaps); */
+
+ bonobo_ui_component_thaw (ui_component, NULL);
+}
+
+static void
+control_deactivate (BonoboControl *control,
+ BonoboUIComponent *ui_component,
+ ESummary *summary)
+{
+ bonobo_ui_component_unset_container (ui_component);
+}
+
+static void
+control_activate_cb (BonoboControl *control,
+ gboolean activate,
+ ESummary *summary)
+{
+ BonoboUIComponent *ui_component;
+
+ ui_component = bonobo_control_get_ui_component (control);
+
+ if (summary->shell_view_interface == NULL) {
+ Bonobo_ControlFrame control_frame;
+ CORBA_Environment ev;
+
+ control_frame = bonobo_control_get_control_frame (control);
+ if (control_frame == NULL) {
+ goto out;
+ }
+
+ CORBA_exception_init (&ev);
+ summary->shell_view_interface = Bonobo_Unknown_queryInterface (control_frame, "IDL:GNOME/Evolution/ShellView:1.0", &ev);
+
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Error getting ShellView. %s", CORBA_exception_id (&ev));
+ summary->shell_view_interface = CORBA_OBJECT_NIL;
+ }
+ CORBA_exception_free (&ev);
+ }
+ out:
+
+ if (activate)
+ control_activate (control, ui_component, summary);
+ else
+ control_deactivate (control, ui_component, summary);
+}
+
+static void
+control_destroy_cb (BonoboControl *control,
+ ESummary *summary)
+{
+ gtk_object_destroy (GTK_OBJECT (summary));
+}
+
+BonoboControl *
+e_summary_factory_new_control (const char *uri,
+ const GNOME_Evolution_Shell shell)
+{
+ BonoboControl *control;
+ GtkWidget *summary;
+
+ summary = e_summary_new (shell);
+ if (summary == NULL) {
+ return NULL;
+ }
+
+ gtk_widget_show (summary);
+
+ control = bonobo_control_new (summary);
+
+ if (control == NULL) {
+ gtk_object_destroy (GTK_OBJECT (summary));
+ return NULL;
+ }
+
+ gtk_signal_connect (GTK_OBJECT (control), "activate",
+ control_activate_cb, summary);
+ gtk_signal_connect (GTK_OBJECT (control), "destroy",
+ control_destroy_cb, summary);
+
+ return control;
+}
diff --git a/my-evolution/e-summary-factory.h b/my-evolution/e-summary-factory.h
new file mode 100644
index 0000000000..970f81d22e
--- /dev/null
+++ b/my-evolution/e-summary-factory.h
@@ -0,0 +1,15 @@
+/*
+ * e-summary-factory.c: Executive Summary Factory.
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifndef __E_SUMMARY_FACTORY_H__
+#define __E_SUMMARY_FACTORY_H__
+
+BonoboControl *e_summary_factory_new_control (const char *uri,
+ const GNOME_Evolution_Shell shell);
+
+#endif
diff --git a/my-evolution/e-summary-mail.c b/my-evolution/e-summary-mail.c
new file mode 100644
index 0000000000..c5a2e54819
--- /dev/null
+++ b/my-evolution/e-summary-mail.c
@@ -0,0 +1,276 @@
+/*
+ * e-summary-mail.c: Mail summary bit.
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#include <liboaf/liboaf.h>
+
+#include "Mail.h"
+#include "e-summary.h"
+#include "e-summary-mail.h"
+
+#include <gtk/gtksignal.h>
+#include <bonobo/bonobo-exception.h>
+#include <bonobo/bonobo-listener.h>
+
+#include <Evolution.h>
+#include <evolution-storage-listener.h>
+
+#define MAIL_IID "OAFIID:GNOME_Evolution_FolderInfo"
+
+struct _ESummaryMail {
+ GNOME_Evolution_FolderInfo folder_info;
+ BonoboListener *listener;
+
+ GHashTable *folders;
+ ESummaryMailMode mode;
+
+ char *html;
+};
+
+typedef struct _ESummaryMailFolder {
+ char *name;
+ char *path;
+
+ int count;
+ int unread;
+} ESummaryMailFolder;
+
+const char *
+e_summary_mail_get_html (ESummary *summary)
+{
+ if (summary->mail == NULL) {
+ return NULL;
+ }
+
+ return summary->mail->html;
+}
+
+/* Work out what to do with folder names */
+static char *
+make_pretty_foldername (const char *foldername)
+{
+ char *pretty;
+
+ if ((pretty = strrchr (foldername, '/'))) {
+ return g_strdup (pretty + 1);
+ } else {
+ return g_strdup (foldername);
+ }
+}
+
+static void
+folder_gen_html (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ GString *string = user_data;
+ ESummaryMailFolder *folder = value;
+ char *str, *pretty_name, *uri;
+
+ pretty_name = make_pretty_foldername (folder->name);
+ uri = g_strconcat ("evolution:", folder->name, NULL);
+ str = g_strdup_printf ("<tr><td><a href=\"%s\"><pre>%s</pre></a></td><td align=\"Left\"><pre>%d/%d</pre></td></tr>",
+ uri, pretty_name, folder->unread, folder->count);
+ g_free (uri);
+ g_string_append (string, str);
+ g_free (pretty_name);
+ g_free (str);
+}
+
+static void
+e_summary_mail_generate_html (ESummary *summary)
+{
+ ESummaryMail *mail;
+ GString *string;
+
+ mail = summary->mail;
+ string = g_string_new ("<dl><dt><img src=\"ico-mail.png\" "
+ "align=\"middle\" alt=\"\" width=\"48\" "
+ "height=\"48\"> <b><a href=\"evolution:/local/Inbox\">Mail summary</a>"
+ "</b></dt><dd><table numcols=\"2\" width=\"100%\">");
+
+ g_hash_table_foreach (mail->folders, folder_gen_html, string);
+
+ g_string_append (string, "</table></dd></dl>");
+ mail->html = string->str;
+ g_string_free (string, FALSE);
+}
+
+static void
+e_summary_mail_get_info (ESummaryMail *mail,
+ const char *uri,
+ BonoboListener *listener)
+{
+ Bonobo_Listener corba_listener;
+ CORBA_Environment ev;
+
+ g_return_if_fail (mail != NULL);
+ g_return_if_fail (mail->folder_info != CORBA_OBJECT_NIL);
+
+ corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener));
+ CORBA_exception_init (&ev);
+ GNOME_Evolution_FolderInfo_getInfo (mail->folder_info, uri ? uri : "",
+ corba_listener, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Error getting info for %s:\n%s", uri,
+ CORBA_exception_id (&ev));
+ CORBA_exception_free (&ev);
+ return;
+ }
+
+ CORBA_exception_free (&ev);
+ return;
+}
+
+static void
+new_folder_cb (EvolutionStorageListener *listener,
+ const char *path,
+ const GNOME_Evolution_Folder *folder,
+ ESummary *summary)
+{
+ ESummaryMail *mail;
+ ESummaryMailFolder *mail_folder;
+
+ /* Don't care about none mail */
+ if (strcmp (folder->type, "mail") != 0 ||
+ strncmp (folder->physical_uri, "file://", 7) != 0) {
+ return;
+ }
+
+ mail = summary->mail;
+
+ mail_folder = g_new (ESummaryMailFolder, 1);
+ mail_folder->path = g_strdup (folder->physical_uri);
+ mail_folder->name = g_strdup (path);
+ mail_folder->count = -1;
+ mail_folder->unread = -1;
+
+ g_hash_table_insert (mail->folders, mail_folder->path, mail_folder);
+ e_summary_mail_get_info (mail, mail_folder->path, mail->listener);
+}
+
+static void
+remove_folder_cb (EvolutionStorageListener *listener,
+ const char *path,
+ ESummary *summary)
+{
+ ESummaryMail *mail;
+ ESummaryMailFolder *mail_folder;
+
+ mail = summary->mail;
+ mail_folder = g_hash_table_lookup (mail->folders, path);
+ if (mail_folder == NULL) {
+ return;
+ }
+
+ g_hash_table_remove (mail->folders, path);
+ g_free (mail_folder->path);
+ g_free (mail_folder);
+}
+
+static void
+mail_change_notify (BonoboListener *listener,
+ const char *name,
+ const BonoboArg *arg,
+ CORBA_Environment *ev,
+ ESummary *summary)
+{
+ GNOME_Evolution_FolderInfo_MessageCount *count;
+ ESummaryMail *mail;
+ ESummaryMailFolder *folder;
+
+ mail = summary->mail;
+
+ count = arg->_value;
+ folder = g_hash_table_lookup (mail->folders, count->path);
+
+ if (folder == NULL) {
+ return;
+ }
+
+ folder->count = count->count;
+ folder->unread = count->unread;
+
+ /* Regen HTML */
+ e_summary_mail_generate_html (summary);
+ e_summary_draw (summary);
+}
+
+static void
+e_summary_mail_protocol (ESummary *summary,
+ const char *uri,
+ void *closure)
+{
+}
+
+void
+e_summary_mail_init (ESummary *summary,
+ GNOME_Evolution_Shell corba_shell)
+{
+ ESummaryMail *mail;
+ CORBA_Environment ev;
+ GNOME_Evolution_LocalStorage local_storage;
+ EvolutionStorageListener *listener;
+ GNOME_Evolution_StorageListener corba_listener;
+
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (summary));
+
+ mail = g_new (ESummaryMail, 1);
+ summary->mail = mail;
+
+ CORBA_exception_init (&ev);
+ mail->folder_info = oaf_activate_from_id (MAIL_IID, 0, NULL, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Exception creating FolderInfo: %s",
+ CORBA_exception_id (&ev));
+ CORBA_exception_free (&ev);
+
+ g_free (mail);
+ return;
+ }
+
+ /* Create a hash table for the folders */
+ mail->folders = g_hash_table_new (g_str_hash, g_str_equal);
+
+ /* Create a BonoboListener for all the notifies. */
+ mail->listener = bonobo_listener_new (NULL, NULL);
+ gtk_signal_connect (GTK_OBJECT (mail->listener), "event-notify",
+ GTK_SIGNAL_FUNC (mail_change_notify), summary);
+
+ local_storage = GNOME_Evolution_Shell_getLocalStorage (corba_shell, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Exception getting local storage: %s",
+ CORBA_exception_id (&ev));
+ CORBA_exception_free (&ev);
+
+ g_free (mail);
+ return;
+ }
+
+ listener = evolution_storage_listener_new ();
+ gtk_signal_connect (GTK_OBJECT (listener), "new-folder",
+ GTK_SIGNAL_FUNC (new_folder_cb), summary);
+ gtk_signal_connect (GTK_OBJECT (listener), "removed-folder",
+ GTK_SIGNAL_FUNC (remove_folder_cb), summary);
+ corba_listener = evolution_storage_listener_corba_objref (listener);
+
+ GNOME_Evolution_Storage_addListener (local_storage, corba_listener, &ev);
+ if (BONOBO_EX (&ev)) {
+ g_warning ("Exception adding listener: %s",
+ CORBA_exception_id (&ev));
+ CORBA_exception_free (&ev);
+
+ g_free (mail);
+ return;
+ }
+
+ CORBA_exception_free (&ev);
+
+ e_summary_add_protocol_listener (summary, "mail", e_summary_mail_protocol, mail);
+ return;
+}
diff --git a/my-evolution/e-summary-mail.h b/my-evolution/e-summary-mail.h
new file mode 100644
index 0000000000..858a3cbbae
--- /dev/null
+++ b/my-evolution/e-summary-mail.h
@@ -0,0 +1,26 @@
+/*
+ * e-summary-mail.h
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifndef __E_SUMMARY_MAIL_H__
+#define __E_SUMMARY_MAIL_H__
+
+#include "e-summary-type.h"
+#include <Evolution.h>
+
+typedef enum _ESummaryMailMode ESummaryMailMode;
+enum _ESummaryMailMode {
+ E_SUMMARY_MAIL_MODE_ONLY,
+ E_SUMMARY_MAIL_MODE_EXCLUDING
+};
+
+typedef struct _ESummaryMail ESummaryMail;
+
+const char *e_summary_mail_get_html (ESummary *summary);
+void e_summary_mail_init (ESummary *summary,
+ GNOME_Evolution_Shell corba_shell);
+#endif
diff --git a/my-evolution/e-summary-rdf.c b/my-evolution/e-summary-rdf.c
new file mode 100644
index 0000000000..96ee50c11d
--- /dev/null
+++ b/my-evolution/e-summary-rdf.c
@@ -0,0 +1,440 @@
+/*
+ * e-summary-rdf.c: RDF summary bit.
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ *
+ * Based on code by Alan Cox
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include <gnome-xml/parser.h>
+#include <gnome-xml/xmlmemory.h>
+
+#include <gal/widgets/e-unicode.h>
+#include <libgnomevfs/gnome-vfs.h>
+#include "e-summary.h"
+
+struct _ESummaryRDF {
+ GList *rdfs;
+
+ char *html;
+};
+
+typedef struct _RDF {
+ char *uri;
+ char *html;
+ GnomeVFSAsyncHandle *handle;
+ GString *string;
+ char *buffer;
+
+ xmlDocPtr cache;
+ ESummary *summary;
+
+ gboolean shown;
+} RDF;
+
+int xmlSubstituteEntitiesDefaultValue = 1;
+static int wipe_trackers = FALSE;
+
+char *
+e_summary_rdf_get_html (ESummary *summary)
+{
+ GList *rdfs;
+ char *html;
+ GString *string;
+
+ if (summary->rdf == NULL) {
+ return NULL;
+ }
+
+ string = g_string_new ("");
+ for (rdfs = summary->rdf->rdfs; rdfs; rdfs = rdfs->next) {
+ if (((RDF *)rdfs->data)->html == NULL) {
+ continue;
+ }
+
+ g_string_append (string, ((RDF *)rdfs->data)->html);
+ }
+
+ html = string->str;
+ g_string_free (string, FALSE);
+ return html;
+}
+
+/************ RDF Parser *******************/
+
+static char *
+layer_find (xmlNodePtr node,
+ char *match,
+ char *fail)
+{
+ while (node!=NULL) {
+#ifdef RDF_DEBUG
+ xmlDebugDumpNode (stdout, node, 32);
+ printf("%s.\n", node->name);
+#endif
+ if (strcasecmp (node->name, match)==0) {
+ if (node->childs != NULL && node->childs->content != NULL) {
+ return node->childs->content;
+ } else {
+ return fail;
+ }
+ }
+ node = node->next;
+ }
+ return fail;
+}
+
+static char *
+layer_find_url (xmlNodePtr node,
+ char *match,
+ char *fail)
+{
+ char *p = layer_find (node, match, fail);
+ char *r = p;
+ static char *wb = NULL;
+ char *w;
+
+ if (wb) {
+ g_free (wb);
+ }
+
+ wb = w = g_malloc (3 * strlen (p));
+
+ if (*r == ' ') r++; /* Fix UF bug */
+
+ while (*r) {
+ if (memcmp (r, "&amp;", 5) == 0) {
+ *w++ = '&';
+ r += 5;
+ continue;
+ }
+ if (memcmp (r, "&lt;", 4) == 0) {
+ *w++ = '<';
+ r += 4;
+ continue;
+ }
+ if (memcmp (r, "&gt;", 4) == 0) {
+ *w++ = '>';
+ r += 4;
+ continue;
+ }
+ if (*r == '"' || *r == ' '){
+ *w++ = '%';
+ *w++ = "0123456789ABCDEF"[*r/16];
+ *w++ = "0123456789ABCDEF"[*r&15];
+ r++;
+ continue;
+ }
+ *w++ = *r++;
+ }
+ *w = 0;
+ return wb;
+}
+
+static void
+tree_walk (xmlNodePtr root,
+ RDF *r,
+ GString *html)
+{
+ xmlNodePtr walk;
+ xmlNodePtr rewalk = root;
+ xmlNodePtr channel = NULL;
+ xmlNodePtr image = NULL;
+ xmlNodePtr item[16];
+ int items = 0;
+ int limit = 10;
+ int i;
+ char *t, *u;
+ char *tmp;
+
+ /* FIXME: Need arrows */
+ if (r->shown == FALSE) {
+ char *p;
+
+ /* FIXME: Hash table & UID */
+ p = g_strdup_printf ("<font size=\"-2\"><a href=\"rdf://%d\">(+)</a></font> ", r);
+ g_string_append (html, p);
+ g_free (p);
+ } else {
+ char *p;
+
+ /* FIXME: Hash table & UID */
+ p = g_strdup_printf ("<font size=\"-2\"><a href=\"rdf://%d\">(-)</a></font>", r);
+ g_string_append (html, p);
+ g_free (p);
+ }
+
+ do {
+ walk = rewalk;
+ rewalk = NULL;
+
+ while (walk!=NULL){
+#ifdef RDF_DEBUG
+ printf ("%p, %s\n", walk, walk->name);
+#endif
+ if (strcasecmp (walk->name, "rdf") == 0) {
+ rewalk = walk->childs;
+ walk = walk->next;
+ continue;
+ }
+ if (strcasecmp (walk->name, "rss") == 0){
+ rewalk = walk->childs;
+ walk = walk->next;
+ continue;
+ }
+ /* This is the channel top level */
+#ifdef RDF_DEBUG
+ printf ("Top level '%s'.\n", walk->name);
+#endif
+ if (strcasecmp (walk->name, "channel") == 0) {
+ channel = walk;
+ rewalk = channel->childs;
+ }
+ if (strcasecmp (walk->name, "image") == 0) {
+ image = walk;
+ g_print ("Image\n");
+ }
+ if (strcasecmp (walk->name, "item") == 0 && items < 16) {
+ item[items++] = walk;
+ }
+ walk = walk->next;
+ }
+ }
+ while (rewalk);
+
+ if (channel == NULL) {
+ fprintf(stderr, "No channel definition.\n");
+ return;
+ }
+
+ t = layer_find(channel->childs, "title", "");
+ u = layer_find(channel->childs, "link", "");
+
+ if (*u != '\0') {
+ char *full;
+
+ full = g_strdup_printf ("<a href=\"%s\">", u);
+ g_string_append (html, full);
+ }
+ g_string_append (html, e_utf8_from_locale_string (t));
+ if (*u != '\0') {
+ g_string_append (html, "</a>");
+ }
+ g_string_append (html, "</b></dt>");
+
+ if (r->shown == FALSE) {
+ return;
+ }
+
+ g_string_append (html, "<ul>");
+
+ items = MIN (limit, items);
+ for (i = 0; i < items; i++) {
+ char *p = layer_find (item[i]->childs, "title", "No information");
+
+ if (wipe_trackers) {
+ char *p = layer_find_url (item[i]->childs, "link", "");
+ char *x = strchr (p, '?');
+ unsigned char *r, *w;
+ int n;
+ if (x == NULL)
+ continue;
+ x++;
+ r = x;
+ w = x;
+ while (*r) {
+ if (*r == '+') {
+ *w++ = ' ';
+ } else if (*r == '%') {
+ sscanf (r+1, "%02x", &n);
+ *w++ = n;
+ r += 2;
+ } else {
+ *w++ = *r;
+ }
+ r++;
+ }
+ *w = 0;
+ tmp = g_strdup_printf ("<LI><font size=\"-1\"><A href=\"%s\">\n", x+4);
+ g_string_append (html, tmp);
+ g_free (tmp);
+ }
+ else {
+ tmp = g_strdup_printf ("<LI><font size=\"-1\"><A href=\"%s\">\n", layer_find_url(item[i]->childs, "link", ""));
+ g_string_append (html, tmp);
+ g_free (tmp);
+ }
+
+ tmp = g_strdup_printf ("%s\n</A></font></li>", e_utf8_from_locale_string (p));
+ g_string_append (html, tmp);
+ g_free (tmp);
+ }
+ g_string_append (html, "</UL></dl>");
+}
+
+static void
+display_doc (RDF *r)
+{
+ GString *html;
+
+ html = g_string_new ("<dl><dt><img src=\"ico-rdf.png\" align=\"middle\" "
+ "width=\"48\" height=\"48\"><b>");
+
+ tree_walk (r->cache->root, r, html);
+
+ if (r->html != NULL) {
+ g_free (r->html);
+ }
+ r->html = html->str;
+ g_string_free (html, FALSE);
+
+ e_summary_draw (r->summary);
+}
+
+static void
+close_callback (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ RDF *r)
+{
+ char *xml;
+ xmlDocPtr doc;
+
+ if (r->handle == NULL) {
+ g_free (r->buffer);
+ g_string_free (r->string, TRUE);
+ return;
+ }
+
+ r->handle = NULL;
+ g_free (r->buffer);
+ xml = r->string->str;
+ g_string_free (r->string, FALSE);
+
+ if (r->cache != NULL) {
+ xmlFreeDoc (r->cache);
+ }
+
+ doc = xmlParseMemory (xml, strlen (xml));
+ if (doc == NULL) {
+ if (r->html != NULL) {
+ g_free (r->html);
+ }
+ r->html = g_strdup ("<b>Error parsing XML</b>");
+
+ e_summary_draw (r->summary);
+ g_free (xml);
+ return;
+ }
+
+ g_free (xml);
+ r->cache = doc;
+
+ /* Draw it */
+ display_doc (r);
+}
+
+static void
+read_callback (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ gpointer buffer,
+ GnomeVFSFileSize bytes_requested,
+ GnomeVFSFileSize bytes_read,
+ RDF *r)
+{
+ if (result != GNOME_VFS_OK && result != GNOME_VFS_ERROR_EOF) {
+ r->html = g_strdup ("<b>Error downloading RDF</b>");
+
+ e_summary_draw (r->summary);
+ r->handle = NULL;
+ gnome_vfs_async_close (handle,
+ (GnomeVFSAsyncCloseCallback) close_callback, r);
+ return;
+ }
+
+ if (bytes_read == 0) {
+ gnome_vfs_async_close (handle,
+ (GnomeVFSAsyncCloseCallback) close_callback, r);
+ } else {
+ *((char *) buffer + bytes_read) = 0;
+ g_string_append (r->string, (const char *) buffer);
+ gnome_vfs_async_read (handle, buffer, 4095,
+ (GnomeVFSAsyncReadCallback) read_callback, r);
+ }
+}
+
+static void
+open_callback (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ RDF *r)
+{
+ if (result != GNOME_VFS_OK) {
+ r->html = g_strdup ("<b>Error downloading RDF</b>");
+
+ e_summary_draw (r->summary);
+ return;
+ }
+
+ r->string = g_string_new ("");
+ r->buffer = g_new (char, 4096);
+
+ gnome_vfs_async_read (handle, r->buffer, 4095,
+ (GnomeVFSAsyncReadCallback) read_callback, r);
+}
+
+static void
+e_summary_rdf_add_uri (ESummary *summary,
+ const char *uri)
+{
+ RDF *r;
+
+ r = g_new0 (RDF, 1);
+ r->summary = summary;
+ r->uri = g_strdup (uri);
+ r->shown = TRUE;
+ summary->rdf->rdfs = g_list_prepend (summary->rdf->rdfs, r);
+
+ gnome_vfs_async_open (&r->handle, r->uri, GNOME_VFS_OPEN_READ,
+ (GnomeVFSAsyncOpenCallback) open_callback, r);
+}
+
+static void
+e_summary_rdf_protocol (ESummary *summary,
+ const char *uri,
+ void *closure)
+{
+ RDF *r;
+ int a;
+
+ a = atoi (uri + 6);
+ if (a == 0) {
+ g_warning ("A == 0");
+ return;
+ }
+
+ r = (RDF *) GINT_TO_POINTER (a);
+ r->shown = !r->shown;
+
+ display_doc (r);
+}
+
+void
+e_summary_rdf_init (ESummary *summary)
+{
+ ESummaryRDF *rdf;
+
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (summary));
+
+ rdf = g_new0 (ESummaryRDF, 1);
+ summary->rdf = rdf;
+
+ e_summary_add_protocol_listener (summary, "rdf", e_summary_rdf_protocol, rdf);
+ e_summary_rdf_add_uri (summary, "http://news.gnome.org/gnome-news/rdf");
+ return;
+}
diff --git a/my-evolution/e-summary-rdf.h b/my-evolution/e-summary-rdf.h
new file mode 100644
index 0000000000..cc0fec9e3d
--- /dev/null
+++ b/my-evolution/e-summary-rdf.h
@@ -0,0 +1,18 @@
+/*
+ * e-summary-rdf.h:
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifndef __E_SUMMARY_RDF_H__
+#define __E_SUMMARY_RDF_H__
+
+#include "e-summary-type.h"
+
+typedef struct _ESummaryRDF ESummaryRDF;
+
+char *e_summary_rdf_get_html (ESummary *summary);
+void e_summary_rdf_init (ESummary *summary);
+#endif
diff --git a/my-evolution/e-summary-type.h b/my-evolution/e-summary-type.h
new file mode 100644
index 0000000000..1ebc8ea63a
--- /dev/null
+++ b/my-evolution/e-summary-type.h
@@ -0,0 +1,14 @@
+/*
+ * e-summary-type.h:
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifndef __E_SUMMARY_TYPE_H__
+#define __E_SUMMARY_TYPE_H__
+
+typedef struct _ESummary ESummary;
+
+#endif
diff --git a/my-evolution/e-summary-weather.c b/my-evolution/e-summary-weather.c
new file mode 100644
index 0000000000..ac424705d6
--- /dev/null
+++ b/my-evolution/e-summary-weather.c
@@ -0,0 +1,419 @@
+/*
+ * e-summary-weather.c
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include <libgnome/gnome-defs.h>
+#include <libgnome/gnome-i18n.h>
+#include <libgnome/gnome-config.h>
+
+#include <gal/widgets/e-unicode.h>
+
+#include <libgnomevfs/gnome-vfs.h>
+#include "e-summary.h"
+#include "e-summary-weather.h"
+#include "weather.h"
+#include "metar.h"
+
+struct _ESummaryWeather {
+ GList *weathers;
+
+ char *html;
+};
+
+static GHashTable *locations_hash = NULL;
+
+char *
+e_summary_weather_get_html (ESummary *summary)
+{
+ GList *weathers;
+ GString *string;
+ char *html;
+
+ if (summary->weather == NULL) {
+ return NULL;
+ }
+
+ string = g_string_new ("<dl><img src=\"ico-weather.png\" align=\"middle\" "
+ "alt=\"\" width=\"48\" height=\"48\"><b>"
+ "<a href=\"http://www.metoffice.gov.uk\">My Weather</a></b>");
+ for (weathers = summary->weather->weathers; weathers; weathers = weathers->next) {
+ if (((Weather *)weathers->data)->html == NULL) {
+ continue;
+ }
+
+ g_string_append (string, ((Weather *)weathers->data)->html);
+ }
+
+ g_string_append (string, "</dl>");
+
+ html = string->str;
+ g_string_free (string, FALSE);
+
+ return html;
+}
+
+static char *
+make_url (const char *name,
+ const char *code)
+{
+ return g_strdup_printf ("<a href=\"http://weather.noaa.gov/cgi-bin/mgetmetar.pl?cccc=%s\">%s</a>", code, name);
+}
+
+static void
+weather_make_html (Weather *w)
+{
+ GString *string;
+ ESummaryWeatherLocation *location;
+ char *sky, *temp, *cond, *uri, *url;
+
+ string = g_string_new ("<dd><img align=\"middle\" "
+ "src=\"es-weather.png\">&#160;<b>");
+ location = g_hash_table_lookup (locations_hash, w->location);
+ if (location == NULL) {
+ url = make_url (w->location, w->location);
+ } else {
+ url = make_url (location->name, w->location);
+ }
+
+ g_string_append (string, url);
+ g_free (url);
+
+ g_string_append (string, "</b>:<blockquote><font size=\"-1\">");
+ sky = (char *) weather_sky_string (w);
+ temp = weather_temp_string (w);
+ cond = (char *) weather_conditions_string (w);
+
+ g_string_append (string, e_utf8_from_locale_string (sky));
+ g_string_append (string, " ");
+ g_string_append (string, e_utf8_from_locale_string (cond));
+ g_string_append (string, " ");
+ g_string_append (string, e_utf8_from_locale_string (temp));
+ g_free (temp);
+
+ g_string_append (string, "<font size=\"-1\">");
+
+ uri = g_strdup_printf ("<a href=\"more://%p\">", w);
+ g_string_append (string, uri);
+ g_free (uri);
+ g_string_append (string, "(More)</a></font></font></blockquote></dd>");
+
+ if (w->html != NULL) {
+ g_free (w->html);
+ }
+ w->html = string->str;
+ g_string_free (string, FALSE);
+
+ e_summary_draw (w->summary);
+}
+
+static ESummaryWeatherLocation *
+weather_location_new (char **locdata)
+{
+ ESummaryWeatherLocation *location;
+
+ location = g_new (ESummaryWeatherLocation, 1);
+ location->name = g_strdup (locdata[0]);
+ location->code = g_strdup (locdata[1]);
+ location->zone = g_strdup (locdata[2]);
+ location->radar = g_strdup (locdata[3]);
+
+ return location;
+}
+
+static void
+parse_metar_token (const char *token,
+ gboolean in_comment,
+ Weather *w)
+{
+ if (in_comment == FALSE) {
+ if (metar_tok_time ((char *) token, w)) {
+ return;
+ } else if (metar_tok_wind ((char *) token, w)) {
+ return;
+ } else if (metar_tok_vis ((char *) token, w)) {
+ return;
+ } else if (metar_tok_cloud ((char *) token, w)) {
+ return;
+ } else if (metar_tok_temp ((char *) token, w)) {
+ return;
+ } else if (metar_tok_pres ((char *) token, w)) {
+ return;
+ } else if (metar_tok_cond ((char *) token, w)) {
+ return;
+ }
+ }
+}
+
+static void
+parse_metar (const char *metar,
+ Weather *w)
+{
+ char *metar_dup;
+ char **toks;
+ gint ntoks;
+ gint i;
+ gboolean in_remark = FALSE;
+
+ metar_dup = g_strdup (metar + 6);
+
+ metar_init_re ();
+
+ toks = g_strsplit (metar, " ", 0);
+
+ for (ntoks = 0; toks[ntoks]; ntoks++) {
+ if (strcmp (toks[ntoks], "RMK") == 0) {
+ in_remark = TRUE;
+ }
+ }
+
+ for (i = ntoks - 1; i >= 0; i--) {
+ if (*toks[i] != '\0') {
+ if (strcmp (toks[i], "RMK") == 0) {
+ in_remark = FALSE;
+ } else {
+ parse_metar_token (toks[i], in_remark, w);
+ }
+ }
+ }
+
+ g_strfreev (toks);
+ g_free (metar_dup);
+ weather_make_html (w);
+}
+
+static void
+close_callback (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ Weather *w)
+{
+ char *html, *metar, *end;
+ char *search_str;
+
+ if (w->handle == NULL) {
+ g_free (w->buffer);
+ g_string_free (w->string, TRUE);
+ return;
+ }
+
+ w->handle = NULL;
+ g_free (w->buffer);
+ html = w->string->str;
+ g_string_free (w->string, FALSE);
+
+ /* Find the metar data */
+ search_str = g_strdup_printf ("\n%s", w->location);
+ metar = strstr (html, search_str);
+ if (metar == NULL) {
+ g_free (search_str);
+ g_free (html);
+ return;
+ }
+
+ metar++;
+ end = strchr (metar, '\n');
+ if (end == NULL) {
+ g_free (search_str);
+ g_free (html);
+ return;
+ }
+ *end = '\0';
+
+ g_warning ("Parsing %s", metar);
+
+ parse_metar (metar, w);
+ g_free (html);
+ g_free (search_str);
+ return;
+}
+
+static void
+read_callback (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ gpointer buffer,
+ GnomeVFSFileSize bytes_requested,
+ GnomeVFSFileSize bytes_read,
+ Weather *w)
+{
+ if (result != GNOME_VFS_OK && result != GNOME_VFS_ERROR_EOF) {
+ w->html = g_strdup ("<b>Error downloading RDF</b>");
+
+ e_summary_draw (w->summary);
+ w->handle = NULL;
+ gnome_vfs_async_close (handle,
+ (GnomeVFSAsyncCloseCallback) close_callback, w);
+ return;
+ }
+
+ if (bytes_read == 0) {
+ gnome_vfs_async_close (handle,
+ (GnomeVFSAsyncCloseCallback) close_callback, w);
+ } else {
+ *((char *) buffer + bytes_read) = 0;
+ g_string_append (w->string, (const char *) buffer);
+ gnome_vfs_async_read (handle, buffer, 4095,
+ (GnomeVFSAsyncReadCallback) read_callback, w);
+ }
+}
+
+static void
+open_callback (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ Weather *w)
+{
+ if (result != GNOME_VFS_OK) {
+ w->html = g_strdup ("<b>Error downloading Metar</b>");
+
+ e_summary_draw (w->summary);
+ return;
+ }
+
+ w->string = g_string_new ("");
+ w->buffer = g_new (char, 4096);
+
+ gnome_vfs_async_read (handle, w->buffer, 4095,
+ (GnomeVFSAsyncReadCallback) read_callback, w);
+}
+
+static void
+e_summary_weather_add_location (ESummary *summary,
+ const char *location)
+{
+ Weather *w;
+ char *uri;
+
+ w = g_new0 (Weather, 1);
+ w->summary = summary;
+ w->location = g_strdup (location);
+ summary->weather->weathers = g_list_prepend (summary->weather->weathers, w);
+
+ uri = g_strdup_printf ("http://weather.noaa.gov/cgi-bin/mgetmetar.pl?cccc=%s", location);
+ gnome_vfs_async_open (&w->handle, uri, GNOME_VFS_OPEN_READ,
+ (GnomeVFSAsyncOpenCallback) open_callback, w);
+ g_free (uri);
+}
+
+static gboolean
+e_summary_weather_init_locations (void)
+{
+ char *key, *path;
+ int nregions, iregions;
+ char **regions;
+
+ if (locations_hash != NULL) {
+ return TRUE;
+ }
+
+ locations_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ path = g_strdup (EVOLUTION_DATADIR "/evolution/Locations");
+
+ key = g_strdup_printf ("=%s=/", path);
+ g_free (path);
+
+ gnome_config_push_prefix (key);
+ g_free (key);
+
+ gnome_config_get_vector ("Main/regions", &nregions, &regions);
+ for (iregions = nregions - 1; iregions >= 0; iregions--) {
+ int nstates, istates;
+ char **states;
+ char *region_name;
+ char *region_name_key;
+ char *states_key;
+
+ region_name_key = g_strconcat (regions[iregions], "/name", NULL);
+ states_key = g_strconcat (regions[iregions], "/states", NULL);
+ region_name = gnome_config_get_string (region_name_key);
+
+ gnome_config_get_vector (states_key, &nstates, &states);
+
+ for (istates = nstates - 1; istates >= 0; istates--) {
+ void *iter;
+ char *iter_key, *iter_val;
+ char *state_path, *state_name_key, *state_name;
+
+ state_path = g_strconcat (regions[iregions], "_", states[istates], "/", NULL);
+ state_name_key = g_strconcat (state_path, "name", NULL);
+ state_name = gnome_config_get_string (state_name_key);
+
+ iter = gnome_config_init_iterator (state_path);
+
+ while ((iter = gnome_config_iterator_next (iter, &iter_key, &iter_val)) != NULL) {
+ if (strstr (iter_key, "loc") != NULL) {
+ char **locdata;
+ int nlocdata;
+ ESummaryWeatherLocation *location;
+
+ gnome_config_make_vector (iter_val,
+ &nlocdata,
+ &locdata);
+ g_return_val_if_fail (nlocdata == 4, FALSE);
+
+ location = weather_location_new (locdata);
+ g_hash_table_insert (locations_hash,
+ g_strdup (locdata[1]),
+ location);
+
+ g_strfreev (locdata);
+ }
+
+ g_free (iter_key);
+ g_free (iter_val);
+ }
+
+ g_free (state_name);
+ g_free (state_path);
+ g_free (state_name_key);
+ }
+
+ g_strfreev (states);
+ g_free (region_name);
+ g_free (region_name_key);
+ g_free (states_key);
+ }
+
+ g_strfreev (regions);
+ gnome_config_pop_prefix ();
+
+ return TRUE;
+}
+
+static void
+e_summary_weather_protocol (ESummary *summary,
+ const char *uri,
+ void *closure)
+{
+
+}
+
+void
+e_summary_weather_init (ESummary *summary)
+{
+ ESummaryWeather *weather;
+
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (summary));
+
+ if (e_summary_weather_init_locations () == FALSE) {
+ return;
+ }
+
+ weather = g_new0 (ESummaryWeather, 1);
+ summary->weather = weather;
+
+ e_summary_add_protocol_listener (summary, "weather", e_summary_weather_protocol, weather);
+ e_summary_add_protocol_listener (summary, "weather-more", e_summary_weather_protocol, weather);
+
+ e_summary_weather_add_location (summary, "ENBR");
+ e_summary_weather_add_location (summary, "EGAC");
+ e_summary_weather_add_location (summary, "EGAA");
+ return;
+}
diff --git a/my-evolution/e-summary-weather.h b/my-evolution/e-summary-weather.h
new file mode 100644
index 0000000000..d771a05aa8
--- /dev/null
+++ b/my-evolution/e-summary-weather.h
@@ -0,0 +1,128 @@
+/*
+ * e-summary-weather.h
+ *
+ */
+
+#ifndef __E_SUMMARY_WEATHER_H__
+#define __E_SUMMARY_WEATHER_H__
+
+#include <time.h>
+#include "e-summary-type.h"
+
+typedef struct _ESummaryWeather ESummaryWeather;
+
+#define WEATHER_LOCATION_NAME_MAX_LEN 100
+#define WEATHER_LOCATION_CODE_LEN 4
+#define WEATHER_LOCATION_ZONE_LEN 7
+#define WEATHER_LOCATION_RADAR_LEN 3
+
+typedef struct _ESummaryWeatherLocation {
+ char *name;
+ char *code;
+ char *zone;
+ char *radar;
+} ESummaryWeatherLocation;
+
+typedef enum _ESummaryWeatherWindDir {
+ WIND_VARIABLE,
+ WIND_N,
+ WIND_NNE,
+ WIND_NE,
+ WIND_ENE,
+ WIND_E,
+ WIND_ESE,
+ WIND_SE,
+ WIND_SSE,
+ WIND_S,
+ WIND_SSW,
+ WIND_SW,
+ WIND_WSW,
+ WIND_W,
+ WIND_WNW,
+ WIND_NW,
+ WIND_NNW
+} ESummaryWeatherWindDir;
+
+typedef enum _ESummaryWeatherSky {
+ SKY_CLEAR,
+ SKY_BROKEN,
+ SKY_SCATTERED,
+ SKY_FEW,
+ SKY_OVERCAST
+} ESummaryWeatherSky;
+
+typedef enum _ESummaryWeatherConditionPhenomenon {
+ PHENOMENON_NONE,
+
+ PHENOMENON_DRIZZLE,
+ PHENOMENON_RAIN,
+ PHENOMENON_SNOW,
+ PHENOMENON_SNOW_GRAINS,
+ PHENOMENON_ICE_CRYSTALS,
+ PHENOMENON_ICE_PELLETS,
+ PHENOMENON_HAIL,
+ PHENOMENON_SMALL_HAIL,
+ PHENOMENON_UNKNOWN_PRECIPITATION,
+
+ PHENOMENON_MIST,
+ PHENOMENON_FOG,
+ PHENOMENON_SMOKE,
+ PHENOMENON_VOLCANIC_ASH,
+ PHENOMENON_SAND,
+ PHENOMENON_HAZE,
+ PHENOMENON_SPRAY,
+ PHENOMENON_DUST,
+
+ PHENOMENON_SQUALL,
+ PHENOMENON_SANDSTORM,
+ PHENOMENON_DUSTSTORM,
+ PHENOMENON_FUNNEL_CLOUD,
+ PHENOMENON_TORNADO,
+ PHENOMENON_DUST_WHIRLS
+} ESummaryWeatherConditionPhenomenon;
+
+typedef enum _ESummaryWeatherConditionQualifier {
+ QUALIFIER_NONE,
+
+ QUALIFIER_VICINITY,
+
+ QUALIFIER_LIGHT,
+ QUALIFIER_MODERATE,
+ QUALIFIER_HEAVY,
+ QUALIFIER_SHALLOW,
+ QUALIFIER_PATCHES,
+ QUALIFIER_PARTIAL,
+ QUALIFIER_THUNDERSTORM,
+ QUALIFIER_BLOWING,
+ QUALIFIER_SHOWERS,
+ QUALIFIER_DRIFTING,
+ QUALIFIER_FREEZING
+} ESummaryWeatherConditionQualifier;
+
+typedef struct _ESummaryWeatherConditions {
+ gboolean significant;
+ ESummaryWeatherConditionPhenomenon phenomenon;
+ ESummaryWeatherConditionQualifier qualifier;
+} ESummaryWeatherConditions;
+
+typedef enum _ESummaryWeatherUnits {
+ UNITS_IMPERIAL,
+ UNITS_METRIC
+} ESummaryWeatherUnits;
+
+typedef enum _ESummaryWeatherForecastType {
+ FORECAST_STATE,
+ FORECAST_ZONE
+} ESummaryWeatherForecastType;
+
+typedef double ESummaryWeatherTemperature;
+typedef int ESummaryWeatherHumidity;
+typedef int ESummaryWeatherWindSpeed;
+typedef double ESummaryWeatherPressure;
+typedef double ESummaryWeatherVisibility;
+
+typedef time_t ESummaryWeatherUpdate;
+
+char *e_summary_weather_get_html (ESummary *summary);
+void e_summary_weather_init (ESummary *summary);
+#endif
diff --git a/my-evolution/e-summary.c b/my-evolution/e-summary.c
new file mode 100644
index 0000000000..775dfaf761
--- /dev/null
+++ b/my-evolution/e-summary.c
@@ -0,0 +1,549 @@
+/*
+ * e-summary.c: ESummary object.
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include <libgnome/gnome-defs.h>
+#include <libgnome/gnome-i18n.h>
+#include <libgnome/gnome-util.h>
+
+#include <gtkhtml/gtkhtml.h>
+#include <gtkhtml/gtkhtml-stream.h>
+#include <gtkhtml/htmlengine.h>
+#include <gtkhtml/htmlselection.h>
+
+#include <libgnomevfs/gnome-vfs.h>
+
+#include <gal/util/e-util.h>
+#include <gal/widgets/e-gui-utils.h>
+
+#include <bonobo/bonobo-listener.h>
+#include <libgnome/gnome-paper.h>
+#include <libgnome/gnome-url.h>
+
+#include <libgnomeprint/gnome-print-master.h>
+#include <libgnomeprint/gnome-print-master-preview.h>
+
+#include "e-summary.h"
+#include "my-evolution-html.h"
+#include "Mail.h"
+
+#include <Evolution.h>
+
+#include <time.h>
+
+#define PARENT_TYPE (gtk_vbox_get_type ())
+
+extern char *evolution_dir;
+
+static GtkObjectClass *e_summary_parent_class;
+
+struct _ESummaryMailFolderInfo {
+ char *name;
+
+ int count;
+ int unread;
+};
+
+typedef struct _DownloadInfo {
+ GtkHTMLStream *stream;
+ char *uri;
+ char *buffer;
+
+ gboolean error;
+} DownloadInfo;
+
+struct _ESummaryPrivate {
+ GNOME_Evolution_Shell shell;
+ GNOME_Evolution_ShellView shell_view_interface;
+
+ GtkWidget *html_scroller;
+ GtkWidget *html;
+
+ GHashTable *protocol_hash;
+};
+
+typedef struct _ProtocolListener {
+ ESummaryProtocolListener listener;
+ void *closure;
+} ProtocolListener;
+
+
+static void
+destroy (GtkObject *object)
+{
+ ESummary *summary;
+ ESummaryPrivate *priv;
+
+ summary = E_SUMMARY (object);
+ priv = summary->priv;
+
+ if (priv == NULL) {
+ return;
+ }
+
+ g_free (priv);
+ summary->priv = NULL;
+
+ e_summary_parent_class->destroy (object);
+}
+
+void
+e_summary_draw (ESummary *summary)
+{
+ GString *string;
+ char *html;
+ char date[256];
+ time_t t;
+
+ if (summary->mail == NULL || summary->calendar == NULL
+ || summary->rdf == NULL || summary->weather == NULL) {
+ return;
+ }
+
+ string = g_string_new (HTML_1);
+ t = time (NULL);
+ strftime (date, 255, "%A, %d %B %Y", localtime (&t));
+
+ html = g_strdup_printf (HTML_2, date);
+ g_string_append (string, html);
+ g_free (html);
+ g_string_append (string, HTML_3);
+
+ /* Weather and RDF stuff here */
+ html = e_summary_weather_get_html (summary);
+ g_string_append (string, html);
+
+ html = e_summary_rdf_get_html (summary);
+ g_string_append (string, html);
+
+ g_string_append (string, HTML_4);
+
+ html = (char *) e_summary_mail_get_html (summary);
+
+ g_string_append (string, html);
+
+ html = (char *) e_summary_calendar_get_html (summary);
+ g_string_append (string, html);
+
+ g_string_append (string, HTML_5);
+ gtk_html_load_from_string (GTK_HTML (summary->priv->html), string->str,
+ strlen (string->str));
+ g_string_free (string, TRUE);
+}
+
+static char *
+e_pixmap_file (const char *filename)
+{
+ char *ret;
+ char *edir;
+
+ if (g_file_exists (filename)) {
+ ret = g_strdup (filename);
+
+ return ret;
+ }
+
+ /* Try the evolution images dir */
+ edir = g_concat_dir_and_file (EVOLUTION_DATADIR "/images/evolution",
+ filename);
+
+ if (g_file_exists (edir)) {
+ ret = g_strdup (edir);
+ g_free (edir);
+
+ return ret;
+ }
+ g_free (edir);
+
+ /* Try the evolution button images dir */
+ edir = g_concat_dir_and_file (EVOLUTION_DATADIR "/images/evolution/buttons",
+ filename);
+
+ if (g_file_exists (edir)) {
+ ret = g_strdup (edir);
+ g_free (edir);
+
+ return ret;
+ }
+ g_free (edir);
+
+ /* Fall back to the gnome_pixmap_file */
+ return gnome_pixmap_file (filename);
+}
+
+static void
+close_callback (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ gpointer data)
+{
+ DownloadInfo *info = data;
+
+ if (info->error) {
+ gtk_html_stream_close (info->stream, GTK_HTML_STREAM_ERROR);
+ } else {
+ gtk_html_stream_close (info->stream, GTK_HTML_STREAM_OK);
+ }
+
+ g_free (info->uri);
+ g_free (info->buffer);
+ g_free (info);
+}
+
+static void
+read_callback (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ gpointer buffer,
+ GnomeVFSFileSize bytes_requested,
+ GnomeVFSFileSize bytes_read,
+ gpointer data)
+{
+ DownloadInfo *info = data;
+
+ if (result != GNOME_VFS_OK && result != GNOME_VFS_ERROR_EOF) {
+ info->error = TRUE;
+ gnome_vfs_async_close (handle, close_callback, info);
+ }
+
+ if (bytes_read == 0) {
+ info->error = FALSE;
+ gnome_vfs_async_close (handle, close_callback, info);
+ } else {
+ gtk_html_stream_write (info->stream, buffer, bytes_read);
+ gnome_vfs_async_read (handle, buffer, 4095, read_callback, info);
+ }
+}
+
+static void
+open_callback (GnomeVFSAsyncHandle *handle,
+ GnomeVFSResult result,
+ DownloadInfo *info)
+{
+ if (result != GNOME_VFS_OK) {
+ gtk_html_stream_close (info->stream, GTK_HTML_STREAM_ERROR);
+ g_free (info->uri);
+ g_free (info);
+ return;
+ }
+
+ info->buffer = g_new (char, 4096);
+ gnome_vfs_async_read (handle, info->buffer, 4095, read_callback, info);
+}
+
+static void
+e_summary_url_clicked (GtkHTML *html,
+ const char *url,
+ ESummary *summary)
+{
+ char *protocol, *protocol_end;
+ ProtocolListener *protocol_listener;
+
+ g_print ("URL: %s\n", url);
+
+ protocol_end = strchr (url, ':');
+ if (protocol_end == NULL) {
+ /* No url, let gnome work it out */
+ gnome_url_show (url);
+ return;
+ }
+
+ protocol = g_strndup (url, protocol_end - url);
+ g_print ("Protocol: %s.\n", protocol);
+
+ protocol_listener = g_hash_table_lookup (summary->priv->protocol_hash,
+ protocol);
+ g_free (protocol);
+
+ if (protocol_listener == NULL) {
+ /* Again, let gnome work it out */
+ gnome_url_show (url);
+ return;
+ }
+
+ protocol_listener->listener (summary, url, protocol_listener->closure);
+}
+
+static void
+e_summary_url_requested (GtkHTML *html,
+ const char *url,
+ GtkHTMLStream *stream,
+ ESummary *summary)
+{
+ char *filename;
+ GnomeVFSAsyncHandle *handle;
+ DownloadInfo *info;
+
+ if (strncasecmp (url, "file:", 5) == 0) {
+ url += 5;
+ filename = e_pixmap_file (url);
+ } else if (strchr (url, ':') >= strchr (url, '/')) {
+ filename = e_pixmap_file (url);
+ } else {
+ filename = g_strdup (url);
+ }
+
+ if (filename == NULL) {
+ gtk_html_stream_close (stream, GTK_HTML_STREAM_ERROR);
+ return;
+ }
+
+ info = g_new (DownloadInfo, 1);
+ info->stream = stream;
+ info->uri = filename;
+ info->error = FALSE;
+
+ gnome_vfs_async_open (&handle, filename, GNOME_VFS_OPEN_READ,
+ (GnomeVFSAsyncOpenCallback) open_callback, info);
+}
+
+static void
+e_summary_evolution_protocol_listener (ESummary *summary,
+ const char *uri,
+ void *closure)
+{
+ e_summary_change_current_view (summary, uri);
+}
+
+static void
+e_summary_class_init (GtkObjectClass *object_class)
+{
+ object_class->destroy = destroy;
+
+ e_summary_parent_class = gtk_type_class (PARENT_TYPE);
+}
+
+#define DEFAULT_HTML "<html><head><title>My Evolution</title></head><body bgcolor=\"#ffffff\">hello</body></html>"
+
+static void
+e_summary_init (ESummary *summary)
+{
+ ESummaryPrivate *priv;
+ GdkColor bgcolor = {0, 0xffff, 0xffff, 0xffff};
+ summary->priv = g_new (ESummaryPrivate, 1);
+
+ priv = summary->priv;
+
+ priv->html_scroller = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->html_scroller),
+ GTK_POLICY_NEVER,
+ GTK_POLICY_AUTOMATIC);
+ priv->html = gtk_html_new ();
+ gtk_html_set_editable (GTK_HTML (priv->html), FALSE);
+ gtk_html_set_default_content_type (GTK_HTML (priv->html),
+ "text/html; charset=utf-8");
+ gtk_html_set_default_background_color (GTK_HTML (priv->html), &bgcolor);
+ gtk_html_load_from_string (GTK_HTML (priv->html), DEFAULT_HTML,
+ strlen (DEFAULT_HTML));
+
+ gtk_signal_connect (GTK_OBJECT (priv->html), "url-requested",
+ GTK_SIGNAL_FUNC (e_summary_url_requested), summary);
+ gtk_signal_connect (GTK_OBJECT (priv->html), "link-clicked",
+ GTK_SIGNAL_FUNC (e_summary_url_clicked), summary);
+#if 0
+ gtk_signal_connect (GTK_OBJECT (priv->html), "on-url",
+ GTK_SIGNAL_FUNC (e_summary_on_url), summary);
+#endif
+
+ gtk_container_add (GTK_CONTAINER (priv->html_scroller), priv->html);
+ gtk_widget_show_all (priv->html_scroller);
+ gtk_box_pack_start (GTK_BOX (summary), priv->html_scroller,
+ TRUE, TRUE, 0);
+
+ priv->protocol_hash = NULL;
+}
+
+E_MAKE_TYPE (e_summary, "ESummary", ESummary, e_summary_class_init,
+ e_summary_init, PARENT_TYPE);
+
+GtkWidget *
+e_summary_new (const GNOME_Evolution_Shell shell)
+{
+ ESummary *summary;
+
+ summary = gtk_type_new (e_summary_get_type ());
+ summary->priv->shell = shell;
+
+ e_summary_add_protocol_listener (summary, "evolution", e_summary_evolution_protocol_listener, summary);
+
+ e_summary_mail_init (summary, shell);
+ e_summary_calendar_init (summary);
+ e_summary_rdf_init (summary);
+ e_summary_weather_init (summary);
+
+ e_summary_draw (summary);
+
+ return GTK_WIDGET (summary);
+}
+
+static void
+do_summary_print (ESummary *summary,
+ gboolean preview)
+{
+ GnomePrintContext *print_context;
+ GnomePrintMaster *print_master;
+ GnomePrintDialog *gpd;
+ GnomePrinter *printer = NULL;
+ int copies = 1;
+ int collate = FALSE;
+
+ if (!preview) {
+ gpd = GNOME_PRINT_DIALOG (gnome_print_dialog_new (_("Print My Evolution"), GNOME_PRINT_DIALOG_COPIES));
+ gnome_dialog_set_default (GNOME_DIALOG (gpd), GNOME_PRINT_PRINT);
+
+ switch (gnome_dialog_run (GNOME_DIALOG (gpd))) {
+ case GNOME_PRINT_PRINT:
+ break;
+
+ case GNOME_PRINT_PREVIEW:
+ preview = TRUE;
+ break;
+
+ case -1:
+ return;
+
+ default:
+ gnome_dialog_close (GNOME_DIALOG (gpd));
+ return;
+ }
+
+ gnome_print_dialog_get_copies (gpd, &copies, &collate);
+ printer = gnome_print_dialog_get_printer (gpd);
+ gnome_dialog_close (GNOME_DIALOG (gpd));
+ }
+
+ print_master = gnome_print_master_new ();
+
+ if (printer) {
+ gnome_print_master_set_printer (print_master, printer);
+ }
+ gnome_print_master_set_copies (print_master, copies, collate);
+ print_context = gnome_print_master_get_context (print_master);
+ gtk_html_print (GTK_HTML (summary->priv->html), print_context);
+ gnome_print_master_close (print_master);
+
+ if (preview) {
+ gboolean landscape = FALSE;
+ GnomePrintMasterPreview *preview;
+
+ preview = gnome_print_master_preview_new_with_orientation (
+ print_master, _("Print Preview"), landscape);
+ gtk_widget_show (GTK_WIDGET (preview));
+ } else {
+ int result = gnome_print_master_print (print_master);
+
+ if (result == -1) {
+ e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
+ _("Printing of My Evolution failed"));
+ }
+ }
+
+ gtk_object_unref (GTK_OBJECT (print_master));
+}
+
+void
+e_summary_print (GtkWidget *widget,
+ ESummary *summary)
+{
+ do_summary_print (summary, FALSE);
+}
+
+void
+e_summary_add_protocol_listener (ESummary *summary,
+ const char *protocol,
+ ESummaryProtocolListener listener,
+ void *closure)
+{
+ ProtocolListener *old;
+
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (summary));
+ g_return_if_fail (protocol != NULL);
+ g_return_if_fail (listener != NULL);
+
+ if (summary->priv->protocol_hash == NULL) {
+ g_print ("Creating\n");
+ summary->priv->protocol_hash = g_hash_table_new (g_str_hash,
+ g_str_equal);
+ old = NULL;
+ } else {
+ old = g_hash_table_lookup (summary->priv->protocol_hash, protocol);
+ }
+
+ if (old != NULL) {
+ return;
+ }
+
+ old = g_new (ProtocolListener, 1);
+ old->listener = listener;
+ old->closure = closure;
+
+ g_hash_table_insert (summary->priv->protocol_hash, g_strdup (protocol), old);
+}
+
+void
+e_summary_change_current_view (ESummary *summary,
+ const char *uri)
+{
+ GNOME_Evolution_ShellView svi;
+ CORBA_Environment ev;
+
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (summary));
+
+ svi = summary->shell_view_interface;
+ if (svi == NULL) {
+ return;
+ }
+
+ CORBA_exception_init (&ev);
+ GNOME_Evolution_ShellView_changeCurrentView (svi, uri, &ev);
+ CORBA_exception_free (&ev);
+}
+
+void
+e_summary_set_message (ESummary *summary,
+ const char *message,
+ gboolean busy)
+{
+ GNOME_Evolution_ShellView svi;
+ CORBA_Environment ev;
+
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (summary));
+
+ svi = summary->shell_view_interface;
+ if (svi == NULL) {
+ return;
+ }
+
+ CORBA_exception_init (&ev);
+ GNOME_Evolution_ShellView_setMessage (svi, message ? message : "", busy, &ev);
+ CORBA_exception_free (&ev);
+}
+
+void
+e_summary_unset_message (ESummary *summary)
+{
+ GNOME_Evolution_ShellView svi;
+ CORBA_Environment ev;
+
+ g_return_if_fail (summary != NULL);
+ g_return_if_fail (IS_E_SUMMARY (summary));
+
+ svi = summary->shell_view_interface;
+ if (svi == NULL) {
+ return;
+ }
+
+ CORBA_exception_init (&ev);
+ GNOME_Evolution_ShellView_unsetMessage (svi, &ev);
+ CORBA_exception_free (&ev);
+}
diff --git a/my-evolution/e-summary.h b/my-evolution/e-summary.h
new file mode 100644
index 0000000000..43c1440c0f
--- /dev/null
+++ b/my-evolution/e-summary.h
@@ -0,0 +1,67 @@
+/*
+ * e-summary.h: Header file for the ESummary object.
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifndef _E_SUMMARY_H__
+#define _E_SUMMARY_H__
+
+#include <gtk/gtkvbox.h>
+#include "e-summary-type.h"
+#include "e-summary-mail.h"
+#include "e-summary-calendar.h"
+#include "e-summary-rdf.h"
+#include "e-summary-weather.h"
+
+#include <Evolution.h>
+
+#define E_SUMMARY_TYPE (e_summary_get_type ())
+#define E_SUMMARY(obj) (GTK_CHECK_CAST ((obj), E_SUMMARY_TYPE, ESummary))
+#define E_SUMMARY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_SUMMARY_TYPE, ESummaryClass))
+#define IS_E_SUMMARY(obj) (GTK_CHECK_TYPE ((obj), E_SUMMARY_TYPE))
+#define IS_E_SUMMARY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_SUMMARY_TYPE))
+
+typedef struct _ESummaryPrivate ESummaryPrivate;
+typedef struct _ESummaryClass ESummaryClass;
+
+typedef void (* ESummaryProtocolListener) (ESummary *summary,
+ const char *uri,
+ void *closure);
+
+struct _ESummary {
+ GtkVBox parent;
+
+ ESummaryMail *mail;
+ ESummaryCalendar *calendar;
+ ESummaryRDF *rdf;
+ ESummaryWeather *weather;
+
+ ESummaryPrivate *priv;
+
+ GNOME_Evolution_ShellView shell_view_interface;
+};
+
+struct _ESummaryClass {
+ GtkVBoxClass parent_class;
+};
+
+GtkType e_summary_get_type (void);
+GtkWidget *e_summary_new (const GNOME_Evolution_Shell shell);
+void e_summary_print (GtkWidget *widget,
+ ESummary *summary);
+void e_summary_draw (ESummary *summary);
+void e_summary_change_current_view (ESummary *summary,
+ const char *uri);
+void e_summary_set_message (ESummary *summary,
+ const char *message,
+ gboolean busy);
+void e_summary_unset_message (ESummary *summary);
+void e_summary_add_protocol_listener (ESummary *summary,
+ const char *protocol,
+ ESummaryProtocolListener listener,
+ void *closure);
+
+#endif
diff --git a/my-evolution/main.c b/my-evolution/main.c
new file mode 100644
index 0000000000..d8c6160486
--- /dev/null
+++ b/my-evolution/main.c
@@ -0,0 +1,67 @@
+/*
+ * main.c: Main file for the Executive Summary
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <glib.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkrgb.h>
+
+#include <libgnome/gnome-defs.h>
+#include <libgnome/gnome-i18n.h>
+#include <libgnomeui/gnome-init.h>
+
+#include <bonobo/bonobo-main.h>
+#include <liboaf/liboaf.h>
+
+#ifdef GTKHTML_HAVE_GCONF
+#include <gconf/gconf.h>
+#endif
+
+#include <libgnomevfs/gnome-vfs.h>
+
+#include "component-factory.h"
+
+int
+main (int argc,
+ char **argv)
+{
+ CORBA_ORB orb;
+
+ bindtextdomain (PACKAGE, EVOLUTION_LOCALEDIR);
+ textdomain (PACKAGE);
+
+ gnome_init_with_popt_table ("Evolution Executive Summary", VERSION,
+ argc, argv, oaf_popt_options, 0, NULL);
+ orb = oaf_init (argc, argv);
+
+ gdk_rgb_init ();
+ if (bonobo_init (orb, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) {
+ g_error (_("Executive summary component could not initialize Bonobo.\n"));
+ exit (1);
+ }
+
+#ifdef GTKHTML_HAVE_GCONF
+ gconf_init (argc, argv, NULL);
+#endif
+
+ gnome_vfs_init ();
+
+ /* Start our component */
+ component_factory_init ();
+
+ bonobo_main ();
+
+ return 0;
+}
diff --git a/my-evolution/metar.c b/my-evolution/metar.c
new file mode 100644
index 0000000000..353593da79
--- /dev/null
+++ b/my-evolution/metar.c
@@ -0,0 +1,590 @@
+/*
+ * metar.c: Metar decoding routines.
+ *
+ * Originally written by Papadimitriou Spiros <spapadim+@cs.cmu.ed>
+ */
+
+#include <glib.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <regex.h>
+#include <math.h>
+
+#include <libgnome/gnome-defs.h>
+#include <libgnome/gnome-i18n.h>
+
+#include "e-summary.h"
+#include "weather.h"
+
+#include "metar.h"
+
+static regex_t metar_re[RE_NUM];
+
+/* Unit conversions and names */
+
+#define TEMP_F_TO_C(f) (((f) - 32.0) * 0.555556)
+#define TEMP_C_TO_F(c) (((c) * 1.8) + 32.0)
+#define TEMP_UNIT_STR(units) (((units) == UNITS_IMPERIAL) ? "\260F" : "\260C")
+
+#define WINDSPEED_KNOTS_TO_KPH(knots) ((knots) * 1.851965)
+#define WINDSPEED_KPH_TO_KNOTS(kph) ((kph) * 0.539967)
+#define WINDSPEED_UNIT_STR(units) (((units) == UNITS_IMPERIAL) ? "knots" : "kph")
+
+#define PRESSURE_INCH_TO_MM(inch) ((inch) * 25.4)
+#define PRESSURE_MM_TO_INCH(mm) ((mm) * 0.03937)
+#define PRESSURE_MBAR_TO_INCH(mbar) ((mbar) * 0.02963742)
+#define PRESSURE_UNIT_STR(units) (((units) == UNITS_IMPERIAL) ? "inHg" : "mmHg")
+#define VISIBILITY_SM_TO_KM(sm) ((sm) * 1.609344)
+#define VISIBILITY_KM_TO_SM(km) ((km) * 0.621371)
+#define VISIBILITY_UNIT_STR(units) (((units) == UNITS_IMPERIAL) ? "miles" : "kilometers")
+
+static const char *sky_str[] = {
+ N_("Clear sky"),
+ N_("Broken clouds"),
+ N_("Scattered clouds"),
+ N_("Few clouds"),
+ N_("Overcast")
+};
+
+const char *
+weather_sky_string (Weather *w)
+{
+ if (w->sky < 0 ||
+ w->sky >= (sizeof (sky_str) / sizeof (char *))) {
+ return _("Invalid");
+ }
+
+ return _(sky_str[(int)w->sky]);
+}
+
+static const char *wind_direction_str[] = {
+ N_("Variable"),
+ N_("North"), N_("North - NorthEast"), N_("Northeast"), N_("East - NorthEast"),
+ N_("East"), N_("East - Southeast"), N_("Southeast"), N_("South - Southeast"),
+ N_("South"), N_("South - Southwest"), N_("Southwest"), N_("West - Southwest"),
+ N_("West"), N_("West - Northwest"), N_("Northwest"), N_("North - Northwest")};
+
+const char *
+weather_wind_direction_string (Weather *w)
+{
+ if (w->wind < 0 ||
+ w->wind >= (sizeof (wind_direction_str) / sizeof (char *))) {
+ return _("Invalid");
+ }
+
+ return _(wind_direction_str[(int)w->wind]);
+}
+
+/*
+ * Even though tedious, I switched to a 2D array for weather condition
+ * strings, in order to facilitate internationalization, esp. for languages
+ * with genders.
+ *
+ * I tried to come up with logical names for most phenomena, but I'm no
+ * meteorologist, so there will undoubtedly be some stupid mistakes.
+ * However, combinations that did not seem plausible (eg. I cannot imagine
+ * what a "light tornado" may be like ;-) were filled in with "??". If this
+ * ever comes up in the weather conditions field, let me know...
+ */
+
+/*
+ * Note, magic numbers, when you change the size here, make sure to change
+ * the below function so that new values are recognized
+ */
+static const gchar *conditions_str[24][13] = {
+/* NONE VICINITY LIGHT MODERATE HEAVY SHALLOW PATCHES PARTIAL THUNDERSTORM BLOWING SHOWERS DRIFTING FREEZING */
+/* *******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
+/* NONE */ {"", "", "", "", "", "", "", "", "", "", "", "", "", },
+/* DRIZZLE */ {N_("Drizzle"), N_("Drizzle in the vicinity"), N_("Light drizzle"), N_("Moderate drizzle"), N_("Heavy drizzle"), N_("Shallow drizzle"), N_("Patches of drizzle"), N_("Partial drizzle"), N_("Thunderstorm"), N_("Windy drizzle"), N_("Showers"), N_("Drifting drizzle"), N_("Freezing drizzle") },
+/* RAIN */ {N_("Rain"), N_("Rain in the vicinity") , N_("Light rain"), N_("Moderate rain"), N_("Heavy rain"), N_("Shallow rain"), N_("Patches of rain"), N_("Partial rainfall"), N_("Thunderstorm"), N_("Blowing rainfall"), N_("Rain showers"), N_("Drifting rain"), N_("Freezing rain") },
+/* SNOW */ {N_("Snow"), N_("Snow in the vicinity") , N_("Light snow"), N_("Moderate snow"), N_("Heavy snow"), N_("Shallow snow"), N_("Patches of snow"), N_("Partial snowfall"), N_("Snowstorm"), N_("Blowing snowfall"), N_("Snow showers"), N_("Drifting snow"), N_("Freezing snow") },
+/* SNOW_GRAINS */ {N_("Snow grains"), N_("Snow grains in the vicinity") , N_("Light snow grains"), N_("Moderate snow grains"), N_("Heavy snow grains"), N_("Shallow snow grains"), N_("Patches of snow grains"), N_("Partial snow grains"), N_("Snowstorm"), N_("Blowing snow grains"), N_("Snow grain showers"), N_("Drifting snow grains"), N_("Freezing snow grains") },
+/* ICE_CRYSTALS */ {N_("Ice crystals"), N_("Ice crystals in the vicinity") , N_("Few ice crystals"), N_("Moderate ice crystals"), N_("Heavy ice crystals"), "??", N_("Patches of ice crystals"), N_("Partial ice crystals"), N_("Ice crystal storm"), N_("Blowing ice crystals"), N_("Showers of ice crystals"), N_("Drifting ice crystals"), N_("Freezing ice crystals") },
+/* ICE_PELLETS */ {N_("Ice pellets"), N_("Ice pellets in the vicinity") , N_("Few ice pellets"), N_("Moderate ice pellets"), N_("Heavy ice pellets"), N_("Shallow ice pellets"), N_("Patches of ice pellets"), N_("Partial ice pellets"), N_("Ice pellet storm"), N_("Blowing ice pellets"), N_("Showers of ice pellets"), N_("Drifting ice pellets"), N_("Freezing ice pellets") },
+/* HAIL */ {N_("Hail"), N_("Hail in the vicinity") , N_("Light hail"), N_("Moderate hail"), N_("Heavy hail"), N_("Shallow hail"), N_("Patches of hail"), N_("Partial hail"), N_("Hailstorm"), N_("Blowing hail"), N_("Hail showers"), N_("Drifting hail"), N_("Freezing hail") },
+/* SMALL_HAIL */ {N_("Small hail"), N_("Small hail in the vicinity") , N_("Light hail"), N_("Moderate small hail"), N_("Heavy small hail"), N_("Shallow small hail"), N_("Patches of small hail"), N_("Partial small hail"), N_("Small hailstorm"), N_("Blowing small hail"), N_("Showers of small hail"), N_("Drifting small hail"), N_("Freezing small hail") },
+/* PRECIPITATION */ {N_("Unknown precipitation"), N_("Precipitation in the vicinity"), N_("Light precipitation"), N_("Moderate precipitation"), N_("Heavy precipitation"), N_("Shallow precipitation"), N_("Patches of precipitation"), N_("Partial precipitation"), N_("Unknown thunderstorm"), N_("Blowing precipitation"), N_("Showers, type unknown"), N_("Drifting precipitation"), N_("Freezing precipitation") },
+/* MIST */ {N_("Mist"), N_("Mist in the vicinity") , N_("Light mist"), N_("Moderate mist"), N_("Thick mist"), N_("Shallow mist"), N_("Patches of mist"), N_("Partial mist"), "??", N_("Mist with wind"), "??", N_("Drifting mist"), N_("Freezing mist") },
+/* FOG */ {N_("Fog"), N_("Fog in the vicinity") , N_("Light fog"), N_("Moderate fog"), N_("Thick fog"), N_("Shallow fog"), N_("Patches of fog"), N_("Partial fog"), "??", N_("Fog with wind"), "??", N_("Drifting fog"), N_("Freezing fog") },
+/* SMOKE */ {N_("Smoke"), N_("Smoke in the vicinity") , N_("Thin smoke"), N_("Moderate smoke"), N_("Thick smoke"), N_("Shallow smoke"), N_("Patches of smoke"), N_("Partial smoke"), N_("Smoke w/ thunders"), N_("Smoke with wind"), "??", N_("Drifting smoke"), "??" },
+/* VOLCANIC_ASH */ {N_("Volcanic ash"), N_("Volcanic ash in the vicinity") , "??", N_("Moderate volcanic ash"), N_("Thick volcanic ash"), N_("Shallow volcanic ash"), N_("Patches of volcanic ash"), N_("Partial volcanic ash"), N_("Volcanic ash w/ thunders"), N_("Blowing volcanic ash"), N_("Showers of volcanic ash "), N_("Drifting volcanic ash"), N_("Freezing volcanic ash") },
+/* SAND */ {N_("Sand"), N_("Sand in the vicinity") , N_("Light sand"), N_("Moderate sand"), N_("Heavy sand"), "??", N_("Patches of sand"), N_("Partial sand"), "??", N_("Blowing sand"), "", N_("Drifting sand"), "??" },
+/* HAZE */ {N_("Haze"), N_("Haze in the vicinity") , N_("Light haze"), N_("Moderate haze"), N_("Thick haze"), N_("Shallow haze"), N_("Patches of haze"), N_("Partial haze"), "??", N_("Haze with wind"), "??", N_("Drifting haze"), N_("Freezing haze") },
+/* SPRAY */ {N_("Sprays"), N_("Sprays in the vicinity") , N_("Light sprays"), N_("Moderate sprays"), N_("Heavy sprays"), N_("Shallow sprays"), N_("Patches of sprays"), N_("Partial sprays"), "??", N_("Blowing sprays"), "??", N_("Drifting sprays"), N_("Freezing sprays") },
+/* DUST */ {N_("Dust"), N_("Dust in the vicinity") , N_("Light dust"), N_("Moderate dust"), N_("Heavy dust"), "??", N_("Patches of dust"), N_("Partial dust"), "??", N_("Blowing dust"), "??", N_("Drifting dust"), "??" },
+/* SQUALL */ {N_("Squall"), N_("Squall in the vicinity") , N_("Light squall"), N_("Moderate squall"), N_("Heavy squall"), "??", "??", N_("Partial squall"), N_("Thunderous squall"), N_("Blowing squall"), "??", N_("Drifting squall"), N_("Freezing squall") },
+/* SANDSTORM */ {N_("Sandstorm"), N_("Sandstorm in the vicinity") , N_("Light standstorm"), N_("Moderate sandstorm"), N_("Heavy sandstorm"), N_("Shallow sandstorm"), "??", N_("Partial sandstorm"), N_("Thunderous sandstorm"), N_("Blowing sandstorm"), "??", N_("Drifting sandstorm"), N_("Freezing sandstorm") },
+/* DUSTSTORM */ {N_("Duststorm"), N_("Duststorm in the vicinity") , N_("Light duststorm"), N_("Moderate duststorm"), N_("Heavy duststorm"), N_("Shallow duststorm"), "??", N_("Partial duststorm"), N_("Thunderous duststorm"), N_("Blowing duststorm"), "??", N_("Drifting duststorm"), N_("Freezing duststorm") },
+/* FUNNEL_CLOUD */ {N_("Funnel cloud"), N_("Funnel cloud in the vicinity") , N_("Light funnel cloud"), N_("Moderate funnel cloud"), N_("Thick funnel cloud"), N_("Shallow funnel cloud"), N_("Patches of funnel clouds"), N_("Partial funnel clouds"), "??", N_("Funnel cloud w/ wind"), "??", N_("Drifting funnel cloud"), "??" },
+/* TORNADO */ {N_("Tornado"), N_("Tornado in the vicinity") , "??", N_("Moderate tornado"), N_("Raging tornado"), "??", "??", N_("Partial tornado"), N_("Thunderous tornado"), N_("Tornado"), "??", N_("Drifting tornado"), N_("Freezing tornado") },
+/* DUST_WHIRLS */ {N_("Dust whirls"), N_("Dust whirls in the vicinity") , N_("Light dust whirls"), N_("Moderate dust whirls"), N_("Heavy dust whirls"), N_("Shallow dust whirls"), N_("Patches of dust whirls"), N_("Partial dust whirls"), "??", N_("Blowing dust whirls"), "??", N_("Drifting dust whirls"), "??" }
+};
+
+const char *
+weather_conditions_string (Weather *w)
+{
+ if (!w->cond.significant) {
+ return "-";
+ } else {
+ if (w->cond.phenomenon >= 0 &&
+ w->cond.phenomenon < 24 &&
+ w->cond.qualifier >= 0 &&
+ w->cond.qualifier < 13) {
+ return _(conditions_str[(int)w->cond.phenomenon][(int)w->cond.qualifier]);
+ } else {
+ return _("Invalid");
+ }
+ }
+}
+
+char *
+weather_temp_string (Weather *w)
+{
+ char *temp;
+
+ temp = g_strdup_printf ("%.1f%s", w->temp, TEMP_UNIT_STR (w->units));
+ return temp;
+}
+
+void
+metar_init_re (void)
+{
+ static gboolean initialized = FALSE;
+ if (initialized)
+ return;
+ initialized = TRUE;
+
+ regcomp(&metar_re[TIME_RE], TIME_RE_STR, REG_EXTENDED);
+ regcomp(&metar_re[WIND_RE], WIND_RE_STR, REG_EXTENDED);
+ regcomp(&metar_re[VIS_RE], VIS_RE_STR, REG_EXTENDED);
+ regcomp(&metar_re[CLOUD_RE], CLOUD_RE_STR, REG_EXTENDED);
+ regcomp(&metar_re[TEMP_RE], TEMP_RE_STR, REG_EXTENDED);
+ regcomp(&metar_re[PRES_RE], PRES_RE_STR, REG_EXTENDED);
+ regcomp(&metar_re[COND_RE], COND_RE_STR, REG_EXTENDED);
+}
+
+static inline gint
+days_in_month (gint month,
+ gint year)
+{
+ if (month == 1)
+ return ((year % 4) == 0) ? 29 : 28;
+ else if (((month <= 6) && (month % 2 == 0)) || ((month >=7) && (month % 2 != 0)))
+ return 31;
+ else
+ return 30;
+}
+
+/* FIX - there *must* be a simpler, less stupid way to do this!... */
+static time_t
+make_time (gint date,
+ gint hour,
+ gint min)
+{
+ struct tm *tm;
+ struct tm tms;
+ time_t now;
+ gint loc_mday, loc_hour, gm_mday, gm_hour;
+ gint hour_diff; /* local time = UTC - hour_diff */
+ gint is_dst;
+
+ now = time(NULL);
+
+ tm = gmtime(&now);
+ gm_mday = tm->tm_mday;
+ gm_hour = tm->tm_hour;
+ memcpy(&tms, tm, sizeof(struct tm));
+
+ tm = localtime(&now);
+ loc_mday = tm->tm_mday;
+ loc_hour = tm->tm_hour;
+ is_dst = tm->tm_isdst;
+
+ /* Estimate timezone */
+ if (gm_mday == loc_mday)
+ hour_diff = gm_hour - loc_hour;
+ else
+ if ((gm_mday == loc_mday + 1) || ((gm_mday == 1) && (loc_mday >= 27)))
+ hour_diff = gm_hour + (24 - loc_hour);
+ else
+ hour_diff = -((24 - gm_hour) + loc_hour);
+
+ /* Make time */
+ tms.tm_min = min;
+ tms.tm_sec = 0;
+ tms.tm_hour = hour - hour_diff;
+ tms.tm_mday = date;
+ tms.tm_isdst = is_dst;
+ if (tms.tm_hour < 0) {
+ tms.tm_hour += 24;
+ --tms.tm_mday;
+ if (tms.tm_mday < 1) {
+ --tms.tm_mon;
+ if (tms.tm_mon < 0) {
+ tms.tm_mon = 11;
+ --tms.tm_year;
+ }
+ tms.tm_mday = days_in_month(tms.tm_mon, tms.tm_year + 1900);
+ }
+ } else if (tms.tm_hour > 23) {
+ tms.tm_hour -= 24;
+ ++tms.tm_mday;
+ if (tms.tm_mday > days_in_month(tms.tm_mon, tms.tm_year + 1900)) {
+ ++tms.tm_mon;
+ if (tms.tm_mon > 11) {
+ tms.tm_mon = 0;
+ ++tms.tm_year;
+ }
+ tms.tm_mday = 1;
+ }
+ }
+
+ return mktime(&tms);
+}
+
+gboolean
+metar_tok_time (char *token,
+ Weather *w)
+{
+ char sday[3], shr[3], smin[3];
+ int day, hour, min;
+
+ if (regexec (&metar_re[TIME_RE], token, 0, NULL, 0) == REG_NOMATCH) {
+ return FALSE;
+ }
+
+ strncpy(sday, token, 2);
+ sday[2] = 0;
+ day = atoi (sday);
+
+ strncpy (shr, token + 2, 2);
+ shr[2] = 0;
+ hour = atoi (shr);
+
+ strncpy (smin, token + 4, 2);
+ smin[2] = 0;
+ min = atoi (smin);
+
+ w->update = make_time (day, hour, min);
+
+ return TRUE;
+}
+
+#define CONST_DIGITS "0123456789"
+
+gboolean
+metar_tok_wind (gchar *tokp,
+ Weather *w)
+{
+ char sdir[4], sspd[4], sgust[4];
+ int dir, spd, gust = -1;
+ char *gustp;
+
+ if (regexec(&metar_re[WIND_RE], tokp, 0, NULL, 0) == REG_NOMATCH)
+ return FALSE;
+
+ strncpy(sdir, tokp, 3);
+ sdir[3] = 0;
+ dir = (!strcmp(sdir, "VRB")) ? -1 : atoi(sdir);
+
+ memset(sspd, 0, sizeof(sspd));
+ strncpy(sspd, tokp+3, strspn(tokp+3, CONST_DIGITS));
+ spd = atoi(sspd);
+
+ gustp = strchr(tokp, 'G');
+ if (gustp) {
+ memset(sgust, 0, sizeof(sgust));
+ strncpy(sgust, gustp+1, strspn(gustp+1, CONST_DIGITS));
+ gust = atoi(sgust);
+ }
+
+ if ((349 <= dir) && (dir <= 11))
+ w->wind = WIND_N;
+ else if ((12 <= dir) && (dir <= 33))
+ w->wind = WIND_NNE;
+ else if ((34 <= dir) && (dir <= 56))
+ w->wind = WIND_NE;
+ else if ((57 <= dir) && (dir <= 78))
+ w->wind = WIND_ENE;
+ else if ((79 <= dir) && (dir <= 101))
+ w->wind = WIND_E;
+ else if ((102 <= dir) && (dir <= 123))
+ w->wind = WIND_ESE;
+ else if ((124 <= dir) && (dir <= 146))
+ w->wind = WIND_SE;
+ else if ((147 <= dir) && (dir <= 168))
+ w->wind = WIND_SSE;
+ else if ((169 <= dir) && (dir <= 191))
+ w->wind = WIND_S;
+ else if ((192 <= dir) && (dir <= 213))
+ w->wind = WIND_SSW;
+ else if ((214 <= dir) && (dir <= 236))
+ w->wind = WIND_SW;
+ else if ((247 <= dir) && (dir <= 258))
+ w->wind = WIND_WSW;
+ else if ((259 <= dir) && (dir <= 281))
+ w->wind = WIND_W;
+ else if ((282 <= dir) && (dir <= 303))
+ w->wind = WIND_WNW;
+ else if ((304 <= dir) && (dir <= 326))
+ w->wind = WIND_NW;
+ else if ((327 <= dir) && (dir <= 348))
+ w->wind = WIND_NNW;
+
+ w->windspeed = (ESummaryWeatherWindSpeed)spd;
+
+ return TRUE;
+}
+
+gboolean
+metar_tok_vis (gchar *tokp,
+ Weather *w)
+{
+ char *pfrac, *pend;
+ char sval[4];
+ int val;
+
+ if (regexec(&metar_re[VIS_RE], tokp, 0, NULL, 0) == REG_NOMATCH)
+ return FALSE;
+
+ pfrac = strchr(tokp, '/');
+ pend = strstr(tokp, "SM");
+ memset(sval, 0, sizeof(sval));
+
+ if (pfrac) {
+ strncpy(sval, pfrac + 1, pend - pfrac - 1);
+ val = atoi(sval);
+ w->visibility = (*tokp == 'M') ? 0.001 : (1.0 / ((ESummaryWeatherVisibility)val));
+ } else {
+ strncpy(sval, tokp, pend - tokp);
+ val = atoi(sval);
+ w->visibility = (ESummaryWeatherVisibility)val;
+ }
+
+ return TRUE;
+}
+
+gboolean
+metar_tok_cloud (gchar *tokp,
+ Weather *w)
+{
+ char stype[4], salt[4];
+ int alt = -1;
+
+ if (regexec(&metar_re[CLOUD_RE], tokp, 0, NULL, 0) == REG_NOMATCH)
+ return FALSE;
+
+ strncpy(stype, tokp, 3);
+ stype[3] = 0;
+ if (strlen(tokp) == 6) {
+ strncpy(salt, tokp+3, 3);
+ salt[3] = 0;
+ alt = atoi(salt); /* Altitude - currently unused */
+ }
+
+ if (!strcmp(stype, "CLR")) {
+ w->sky = SKY_CLEAR;
+ } else if (!strcmp(stype, "BKN")) {
+ w->sky = SKY_BROKEN;
+ } else if (!strcmp(stype, "SCT")) {
+ w->sky = SKY_SCATTERED;
+ } else if (!strcmp(stype, "FEW")) {
+ w->sky = SKY_FEW;
+ } else if (!strcmp(stype, "OVC")) {
+ w->sky = SKY_OVERCAST;
+ }
+
+ return TRUE;
+}
+
+gboolean
+metar_tok_pres (gchar *tokp,
+ Weather *w)
+{
+ if (regexec(&metar_re[PRES_RE], tokp, 0, NULL, 0) == REG_NOMATCH)
+ return FALSE;
+
+ if (*tokp == 'A') {
+ char sintg[3], sfract[3];
+ int intg, fract;
+
+ strncpy(sintg, tokp+1, 2);
+ sintg[2] = 0;
+ intg = atoi(sintg);
+
+ strncpy(sfract, tokp+3, 2);
+ sfract[2] = 0;
+ fract = atoi(sfract);
+
+ w->pressure = (ESummaryWeatherPressure)intg + (((ESummaryWeatherPressure)fract)/100.0);
+ } else { /* *tokp == 'Q' */
+ gchar spres[5];
+ gint pres;
+
+ strncpy(spres, tokp+1, 4);
+ spres[4] = 0;
+ pres = atoi(spres);
+
+ w->pressure = PRESSURE_MBAR_TO_INCH((ESummaryWeatherPressure)pres);
+ }
+
+ return TRUE;
+}
+
+/* Relative humidity computation - thanks to <Olof.Oberg@modopaper.modogroup.com> */
+
+
+static inline gint
+calc_humidity(gdouble temp,
+ gdouble dewp)
+{
+ gdouble esat, esurf;
+
+ temp = TEMP_F_TO_C(temp);
+ dewp = TEMP_F_TO_C(dewp);
+
+ esat = 6.11 * pow(10.0, (7.5 * temp) / (237.7 + temp));
+ esurf = 6.11 * pow(10.0, (7.5 * dewp) / (237.7 + dewp));
+
+ return (gint)((esurf/esat) * 100.0);
+}
+
+gboolean
+metar_tok_temp (gchar *tokp,
+ Weather *w)
+{
+ gchar *ptemp, *pdew, *psep;
+
+ if (regexec(&metar_re[TEMP_RE], tokp, 0, NULL, 0) == REG_NOMATCH)
+ return FALSE;
+
+ psep = strchr(tokp, '/');
+ *psep = 0;
+ ptemp = tokp;
+ pdew = psep + 1;
+
+ w->temp = (*ptemp == 'M') ? TEMP_C_TO_F(-atoi(ptemp+1)) :
+ TEMP_C_TO_F(atoi(ptemp));
+ w->dew = (*pdew == 'M') ? TEMP_C_TO_F(-atoi(pdew+1)) :
+ TEMP_C_TO_F(atoi(pdew));
+ w->humidity = calc_humidity(w->temp, w->dew);
+ return TRUE;
+}
+
+gboolean
+metar_tok_cond (gchar *tokp,
+ Weather *w)
+{
+ char squal[3], sphen[4];
+ char *pphen;
+
+ if (regexec(&metar_re[COND_RE], tokp, 0, NULL, 0) == REG_NOMATCH)
+ return FALSE;
+
+ if ((strlen(tokp) > 3) && ((*tokp == '+') || (*tokp == '-')))
+ ++tokp; /* FIX */
+
+ if ((*tokp == '+') || (*tokp == '-'))
+ pphen = tokp + 1;
+ else if (strlen(tokp) < 4)
+ pphen = tokp;
+ else
+ pphen = tokp + 2;
+
+ memset(squal, 0, sizeof(squal));
+ strncpy(squal, tokp, pphen - tokp);
+ squal[pphen - tokp] = 0;
+
+ memset(sphen, 0, sizeof(sphen));
+ strncpy(sphen, pphen, sizeof(sphen));
+ sphen[sizeof(sphen)-1] = '\0';
+
+ /* Defaults */
+ w->cond.qualifier = QUALIFIER_NONE;
+ w->cond.phenomenon = PHENOMENON_NONE;
+ w->cond.significant = FALSE;
+
+ if (!strcmp(squal, "")) {
+ w->cond.qualifier = QUALIFIER_MODERATE;
+ } else if (!strcmp(squal, "-")) {
+ w->cond.qualifier = QUALIFIER_LIGHT;
+ } else if (!strcmp(squal, "+")) {
+ w->cond.qualifier = QUALIFIER_HEAVY;
+ } else if (!strcmp(squal, "VC")) {
+ w->cond.qualifier = QUALIFIER_VICINITY;
+ } else if (!strcmp(squal, "MI")) {
+ w->cond.qualifier = QUALIFIER_SHALLOW;
+ } else if (!strcmp(squal, "BC")) {
+ w->cond.qualifier = QUALIFIER_PATCHES;
+ } else if (!strcmp(squal, "PR")) {
+ w->cond.qualifier = QUALIFIER_PARTIAL;
+ } else if (!strcmp(squal, "TS")) {
+ w->cond.qualifier = QUALIFIER_THUNDERSTORM;
+ } else if (!strcmp(squal, "BL")) {
+ w->cond.qualifier = QUALIFIER_BLOWING;
+ } else if (!strcmp(squal, "SH")) {
+ w->cond.qualifier = QUALIFIER_SHOWERS;
+ } else if (!strcmp(squal, "DR")) {
+ w->cond.qualifier = QUALIFIER_DRIFTING;
+ } else if (!strcmp(squal, "FZ")) {
+ w->cond.qualifier = QUALIFIER_FREEZING;
+ } else {
+ g_return_val_if_fail(FALSE, FALSE);
+ }
+
+ if (!strcmp(sphen, "DZ")) {
+ w->cond.phenomenon = PHENOMENON_DRIZZLE;
+ } else if (!strcmp(sphen, "RA")) {
+ w->cond.phenomenon = PHENOMENON_RAIN;
+ } else if (!strcmp(sphen, "SN")) {
+ w->cond.phenomenon = PHENOMENON_SNOW;
+ } else if (!strcmp(sphen, "SG")) {
+ w->cond.phenomenon = PHENOMENON_SNOW_GRAINS;
+ } else if (!strcmp(sphen, "IC")) {
+ w->cond.phenomenon = PHENOMENON_ICE_CRYSTALS;
+ } else if (!strcmp(sphen, "PE")) {
+ w->cond.phenomenon = PHENOMENON_ICE_PELLETS;
+ } else if (!strcmp(sphen, "GR")) {
+ w->cond.phenomenon = PHENOMENON_HAIL;
+ } else if (!strcmp(sphen, "GS")) {
+ w->cond.phenomenon = PHENOMENON_SMALL_HAIL;
+ } else if (!strcmp(sphen, "UP")) {
+ w->cond.phenomenon = PHENOMENON_UNKNOWN_PRECIPITATION;
+ } else if (!strcmp(sphen, "BR")) {
+ w->cond.phenomenon = PHENOMENON_MIST;
+ } else if (!strcmp(sphen, "FG")) {
+ w->cond.phenomenon = PHENOMENON_FOG;
+ } else if (!strcmp(sphen, "FU")) {
+ w->cond.phenomenon = PHENOMENON_SMOKE;
+ } else if (!strcmp(sphen, "VA")) {
+ w->cond.phenomenon = PHENOMENON_VOLCANIC_ASH;
+ } else if (!strcmp(sphen, "SA")) {
+ w->cond.phenomenon = PHENOMENON_SAND;
+ } else if (!strcmp(sphen, "HZ")) {
+ w->cond.phenomenon = PHENOMENON_HAZE;
+ } else if (!strcmp(sphen, "PY")) {
+ w->cond.phenomenon = PHENOMENON_SPRAY;
+ } else if (!strcmp(sphen, "DU")) {
+ w->cond.phenomenon = PHENOMENON_DUST;
+ } else if (!strcmp(sphen, "SQ")) {
+ w->cond.phenomenon = PHENOMENON_SQUALL;
+ } else if (!strcmp(sphen, "SS")) {
+ w->cond.phenomenon = PHENOMENON_SANDSTORM;
+ } else if (!strcmp(sphen, "DS")) {
+ w->cond.phenomenon = PHENOMENON_DUSTSTORM;
+ } else if (!strcmp(sphen, "PO")) {
+ w->cond.phenomenon = PHENOMENON_DUST_WHIRLS;
+ } else if (!strcmp(sphen, "+FC")) {
+ w->cond.phenomenon = PHENOMENON_TORNADO;
+ } else if (!strcmp(sphen, "FC")) {
+ w->cond.phenomenon = PHENOMENON_FUNNEL_CLOUD;
+ } else {
+ g_return_val_if_fail(FALSE, FALSE);
+ }
+
+ if ((w->cond.qualifier != QUALIFIER_NONE) || (w->cond.phenomenon != PHENOMENON_NONE))
+ w->cond.significant = TRUE;
+
+ return TRUE;
+}
diff --git a/my-evolution/metar.h b/my-evolution/metar.h
new file mode 100644
index 0000000000..ae9b1644d6
--- /dev/null
+++ b/my-evolution/metar.h
@@ -0,0 +1,46 @@
+/*
+ * metar.h
+ */
+
+#ifndef __METAR_H__
+#define __METAR_H__
+
+#define TIME_RE_STR "^([0-9]{6})Z$"
+#define WIND_RE_STR "^(([0-9]{3})|VRB)([0-9]?[0-9]{2})(G[0-9]?[0-9]{2})?KT$"
+#define VIS_RE_STR "^(([0-9]?[0-9])|(M?1/[0-9]?[0-9]))SM$"
+#define CLOUD_RE_STR "^(CLR|BKN|SCT|FEW|OVC)([0-9]{3})?$"
+#define TEMP_RE_STR "^(M?[0-9][0-9])/(M?[0-9][0-9])$"
+#define PRES_RE_STR "^(A|Q)([0-9]{4})$"
+#define COND_RE_STR "^(-|\\+)?(VC|MI|BC|PR|TS|BL|SH|DR|FZ)?(DZ|RA|SN|SG|IC|PE|GR|GS|UP|BR|FG|FU|VA|SA|HZ|PY|DU|SQ|SS|DS|PO|\\+?FC)$"
+
+enum {
+ TIME_RE,
+ WIND_RE,
+ VIS_RE,
+ CLOUD_RE,
+ TEMP_RE,
+ PRES_RE,
+ COND_RE,
+ RE_NUM
+};
+
+const char *weather_sky_string (Weather *w);
+char *weather_temp_string (Weather *w);
+const char *weather_conditions_string (Weather *w);
+
+void metar_init_re (void);
+gboolean metar_tok_time (char *token,
+ Weather *w);
+gboolean metar_tok_wind (char *tokp,
+ Weather *w);
+gboolean metar_tok_vis (char *tokp,
+ Weather *w);
+gboolean metar_tok_cloud (char *tokp,
+ Weather *w);
+gboolean metar_tok_pres (char *tokp,
+ Weather *w);
+gboolean metar_tok_temp (char *tokp,
+ Weather *w);
+gboolean metar_tok_cond (char *tokp,
+ Weather *w);
+#endif
diff --git a/my-evolution/my-evolution-html.h b/my-evolution/my-evolution-html.h
new file mode 100644
index 0000000000..9be8ec0c1b
--- /dev/null
+++ b/my-evolution/my-evolution-html.h
@@ -0,0 +1,52 @@
+/*
+ * my-evolution-html.h: HTML as a #define
+ *
+ * Copyright (C) 2001 Ximian, Inc.
+ *
+ * Authors: Jakub Steiner <jimmac@ximian.com>
+ * Iain Holmes <iain@ximian.com>
+ */
+
+#ifdef NOT_ETTORE
+#define HTML_1 "<html><head></head><body background=\"bcg.png\" "\
+"bgcolor=\"white\" link=\"#314e6c\" alink=\"black\" vlink=\"#314e6c\">"\
+"<img src=\"myevo.png\" alt=\"My Evolution\" width=\"200\" height=\"31\" border=\"0\"><br>"\
+"<img src=\"empty.gif\" alt=\"\" width=\"10\" height=\"20\">"\
+"<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">"\
+"<tbody><tr>"
+#else
+#define HTML_1 "<html><head></head><body background=\"bcg.png\" "\
+"bgcolor=\"white\" link=\"#314e6c\" alink=\"black\" vlink=\"#314e6c\">"\
+"<img src=\"empty.gif\" alt=\"\" width=\"10\" height=\"20\">"\
+"<table border=\"0\" numcols=\"4\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">"\
+"<tbody><tr>"
+#endif
+
+/* Needs a stringified date */
+#define HTML_2 "<td align=\"Right\" colspan=\"4\"><b>%s</b><br> <img src=\"empty.gif\" width=\"1\" height=\"3\"></td>"
+
+#define HTML_3 "</tr><tr><td colspan=\"4\" bgcolor=\"#000000\"><img src=\"empty.gif\" width=\"1\" height=\"1\"></td></tr>"\
+"<tr valign=\"Top\">" \
+"<td width=\"100%\">"\
+
+/* Weather stuff goes here */
+
+/* RDF Stuff goes here */
+
+#define HTML_4 "</td><td>&#160;</td><td width=\"1\" bgcolor=\"#000000\"><img src=\"empty.gif\" width=\"1\" height=\"1\"></td>"\
+"<td width=\"0\" background=\"pattern.png\">"
+
+/* Mail stuff ici s'il vous plait */
+
+/* And then the calendar stuff */
+
+#ifdef NOT_ETTORE
+#define HTML_5 "<p align=\"Center\"><img src=\"evologo-big.png\" width=\"200\" height=\"216\" alt=\"\"></p><p>"\
+"<img src=\"empty.gif\" alt=\"\" width=\"290\" height=\"1\"></p></td>"\
+"<tr bgcolor=\"#000000\"><td colspan=\"\"><img src=\"empty.gif\" alt=\"\" width=\"10\" height=\"20\"></td></tr>"\
+"</tbody></table></body></html>"
+#else
+#define HTML_5 "<img src=\"empty.gif\" alt=\"\" width=\"290\" height=\"1\"></p></td>"\
+"<tr bgcolor=\"#000000\"><td colspan=\"5\"><img src=\"empty.gif\" alt=\"\" width=\"10\" height=\"1\"></td></tr>"\
+"</tbody></table></body></html>"
+#endif
diff --git a/my-evolution/weather.h b/my-evolution/weather.h
new file mode 100644
index 0000000000..bbb7b5e863
--- /dev/null
+++ b/my-evolution/weather.h
@@ -0,0 +1,42 @@
+/*
+ * weather.h
+ *
+ * Copyright (C) 2001, Ximian, Inc
+ *
+ * Authors: Iain Holmes <iain@ximian.com>
+ */
+
+#ifndef __WEATHER_H__
+#define __WEATHER_H__
+
+#include "e-summary-weather.h"
+
+#include <libgnomevfs/gnome-vfs.h>
+
+typedef struct _Weather {
+ char *location;
+ char *html;
+ char *metar;
+ GnomeVFSAsyncHandle *handle;
+ GString *string;
+ char *buffer;
+
+ ESummary *summary;
+
+ gboolean valid;
+ ESummaryWeatherLocation *loc;
+ ESummaryWeatherUnits units;
+ ESummaryWeatherUpdate update;
+ ESummaryWeatherSky sky;
+ ESummaryWeatherConditions cond;
+ ESummaryWeatherTemperature temp;
+ ESummaryWeatherTemperature dew;
+ ESummaryWeatherHumidity humidity;
+ ESummaryWeatherWindDir wind;
+ ESummaryWeatherWindSpeed windspeed;
+ ESummaryWeatherPressure pressure;
+ ESummaryWeatherVisibility visibility;
+ char *forecast;
+} Weather;
+
+#endif
diff --git a/shell/ChangeLog b/shell/ChangeLog
index 327d172ee6..eea4620c6e 100644
--- a/shell/ChangeLog
+++ b/shell/ChangeLog
@@ -1,3 +1,31 @@
+2001-06-08 Iain Holmes <iain@ximian.com>
+
+ * e-setup.c (check_dir_recur): Don't copy the old Executive-Summary dir.
+ (e_setup): If there is an Executive-Summary dir in ~/evolution/local
+ ask it the user wants to remove it.
+ (e_shell_rm_dir): Function to completely delete a directory.
+
+2001-06-07 Iain Holmes <iain@ximian.com>
+
+ * evolution-storage.c (impl_Storage_async_create_folder): Removed
+ debug spew.
+
+ * e-shell-importer.c (start_import): Removed spew.
+
+ * e-shell-view.c (update_window_icon): Take a gboolean to say if
+ the folder is my evolution. Do special cased things for My Evolution.
+ (update_folder_title_bar): Same.
+ (update_for_current_uri): Find out if the uri is the my evolution one
+ and act accordingly.
+ (get_control_for_uri): Handle the toplevel My Evolution.
+
+ * e-storage-set-view.c (etree_icon_at): Get an icon for the toplevel
+ My Evolution.
+ (etree_value_at): Default is to return "My Evolution"
+ (e_storage_set_view_construct): Set the toplevel to be called "My
+ Evolution" and show it.
+ (e_storage_set_view_set_show_folders): Same.
+
2001-06-08 Ettore Perazzoli <ettore@ximian.com>
* e-shell-folder-commands.c (e_shell_command_add_to_shortcut_bar):
diff --git a/shell/e-setup.c b/shell/e-setup.c
index 1d6e75b71e..a1698be510 100644
--- a/shell/e-setup.c
+++ b/shell/e-setup.c
@@ -69,6 +69,12 @@ check_dir_recur (const char *evolution_directory,
continue;
}
+ /* Hack to not copy the old Executive-Summary dir */
+ if (strcmp (current->d_name, "Executive-Summary") == 0) {
+ current = readdir (def);
+ continue;
+ }
+
fullname = g_concat_dir_and_file (evolution_directory,
current->d_name);
fulldefaultname = g_concat_dir_and_file (current_directory,
@@ -240,6 +246,48 @@ copy_default_stuff (const char *evolution_directory)
return retval;
}
+static void
+e_shell_rm_dir (const char *path)
+{
+ DIR *base;
+ struct stat statbuf;
+ struct dirent *contents;
+
+ stat (path, &statbuf);
+ if (!S_ISDIR (statbuf.st_mode)) {
+ /* Not a directory */
+ g_message ("Removing: %s", path);
+ unlink (path);
+ return;
+ } else {
+ g_message ("Opening: %s", path);
+ base = opendir (path);
+
+ if (base == NULL)
+ return;
+
+ contents = readdir (base);
+ while (contents != NULL) {
+ char *fullpath;
+
+ if (strcmp (contents->d_name, ".") == 0||
+ strcmp (contents->d_name, "..") ==0) {
+ contents = readdir (base);
+ continue;
+ }
+
+ fullpath = g_concat_dir_and_file (path, contents->d_name);
+ e_shell_rm_dir (fullpath);
+ g_free (fullpath);
+
+ contents = readdir (base);
+ }
+
+ closedir (base);
+ rmdir (path);
+ }
+}
+
gboolean
e_setup (const char *evolution_directory)
@@ -261,6 +309,33 @@ e_setup (const char *evolution_directory)
/* Make sure this is really our directory, not an Evolution
* build tree or something like that.
*/
+ file = g_strdup_printf ("%s/local/Executive-Summary", evolution_directory);
+ if (stat (file, &statinfo) == 0) {
+ if (S_ISDIR (statinfo.st_mode)) {
+ GtkWidget *dialog;
+
+ dialog = gnome_message_box_new (_("Evolution has detected an old\n"
+ "Executive-Summary directory.\n"
+ "This needs to be removed before\n"
+ "Evolution will run.\n"
+ "Do you want me to remove this directory?"),
+ GNOME_MESSAGE_BOX_INFO,
+ GNOME_STOCK_BUTTON_YES,
+ GNOME_STOCK_BUTTON_NO,
+ NULL);
+ switch (gnome_dialog_run_and_close (GNOME_DIALOG (dialog))) {
+ case 0:
+ e_shell_rm_dir (file);
+ break;
+
+ default:
+ return FALSE;
+ }
+ }
+ }
+
+ g_free (file);
+
file = g_strdup_printf ("%s/shortcuts.xml", evolution_directory);
if (stat (file, &statinfo) != 0) {
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
diff --git a/shell/e-shell-importer.c b/shell/e-shell-importer.c
index b1cea8a153..2a16fc522c 100644
--- a/shell/e-shell-importer.c
+++ b/shell/e-shell-importer.c
@@ -394,7 +394,6 @@ start_import (const char *folderpath,
g_free (real_iid);
/* NULL for folderpath means use Inbox */
- g_message ("Folderpath: %s", folderpath);
if (*folderpath == '/') {
folderpath = strchr (folderpath + 1, '/');
}
diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c
index 2a146009bc..71584f6f3a 100644
--- a/shell/e-shell-view.c
+++ b/shell/e-shell-view.c
@@ -1276,7 +1276,8 @@ get_storage_set_path_from_uri (const char *uri)
static void
update_window_icon (EShellView *shell_view,
- EFolder *folder)
+ EFolder *folder,
+ gboolean is_my_evolution)
{
EShellViewPrivate *priv;
const char *type;
@@ -1285,10 +1286,15 @@ update_window_icon (EShellView *shell_view,
priv = shell_view->priv;
- if (folder == NULL)
- type = NULL;
- else
+ if (folder == NULL) {
+ if (is_my_evolution) {
+ type = "My Evolution";
+ } else {
+ type = NULL;
+ }
+ } else {
type = e_folder_get_type_string (folder);
+ }
if (type == NULL) {
icon_path = NULL;
@@ -1313,7 +1319,8 @@ update_window_icon (EShellView *shell_view,
static void
update_folder_title_bar (EShellView *shell_view,
- EFolder *folder)
+ EFolder *folder,
+ gboolean is_my_evolution)
{
EShellViewPrivate *priv;
EFolderTypeRegistry *folder_type_registry;
@@ -1323,10 +1330,15 @@ update_folder_title_bar (EShellView *shell_view,
priv = shell_view->priv;
- if (folder == NULL)
- folder_type_name = NULL;
- else
+ if (folder == NULL) {
+ if (is_my_evolution) {
+ folder_type_name = "My Evolution";
+ } else {
+ folder_type_name = NULL;
+ }
+ } else {
folder_type_name = e_folder_get_type_string (folder);
+ }
if (folder_type_name == NULL) {
folder_name = NULL;
@@ -1336,7 +1348,11 @@ update_folder_title_bar (EShellView *shell_view,
folder_icon = e_folder_type_registry_get_icon_for_type (folder_type_registry,
folder_type_name,
TRUE);
- folder_name = e_folder_get_name (folder);
+ if (is_my_evolution) {
+ folder_name = "My Evolution";
+ } else {
+ folder_name = e_folder_get_name (folder);
+ }
}
if (folder_icon)
@@ -1357,21 +1373,29 @@ update_for_current_uri (EShellView *shell_view)
char *folder_name;
const char *path;
char *window_title;
+ gboolean is_my_evolution = FALSE;
priv = shell_view->priv;
path = get_storage_set_path_from_uri (priv->uri);
- if (path == NULL)
+ if (strcmp (priv->uri, "evolution:/My Evolution") == 0) {
+ /* Special case for My Evolution */
+ folder_name = g_strdup (_("My Evolution"));
+ is_my_evolution = TRUE;
folder = NULL;
- else
- folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell),
- path);
-
- if (folder == NULL)
- folder_name = g_strdup (_("None"));
- else
- folder_name = e_utf8_to_gtk_string ((GtkWidget *) shell_view, e_folder_get_name (folder));
+ } else {
+ if (path == NULL)
+ folder = NULL;
+ else
+ folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell),
+ path);
+
+ if (folder == NULL)
+ folder_name = g_strdup (_("None"));
+ else
+ folder_name = e_utf8_to_gtk_string ((GtkWidget *) shell_view, e_folder_get_name (folder));
+ }
if (SUB_VERSION[0] == '\0')
window_title = g_strdup_printf (_("%s - Evolution %s"), folder_name, VERSION);
@@ -1381,10 +1405,10 @@ update_for_current_uri (EShellView *shell_view)
gtk_window_set_title (GTK_WINDOW (shell_view), window_title);
g_free (window_title);
g_free (folder_name);
-
- update_folder_title_bar (shell_view, folder);
-
- update_window_icon (shell_view, folder);
+
+ update_folder_title_bar (shell_view, folder, is_my_evolution);
+
+ update_window_icon (shell_view, folder, is_my_evolution);
gtk_signal_handler_block_by_func (GTK_OBJECT (priv->storage_set_view),
GTK_SIGNAL_FUNC (folder_selected_cb),
@@ -1668,15 +1692,21 @@ get_control_for_uri (EShellView *shell_view,
if (*path == '\0')
return NULL;
- /* FIXME: This code needs to be made more robust. */
-
- slash = strchr (path + 1, G_DIR_SEPARATOR);
- if (slash == NULL || slash[1] == '\0')
- folder_type = get_type_for_storage (shell_view, path + 1, &physical_uri);
- else
- folder_type = get_type_for_folder (shell_view, path, &physical_uri);
- if (folder_type == NULL)
- return NULL;
+ /* Hack for My Evolution */
+ if (strcmp (path, "/My Evolution") == 0) {
+ folder_type = "My Evolution";
+ physical_uri = "";
+ } else {
+ /* FIXME: This code needs to be made more robust. */
+
+ slash = strchr (path + 1, G_DIR_SEPARATOR);
+ if (slash == NULL || slash[1] == '\0')
+ folder_type = get_type_for_storage (shell_view, path + 1, &physical_uri);
+ else
+ folder_type = get_type_for_folder (shell_view, path, &physical_uri);
+ if (folder_type == NULL)
+ return NULL;
+ }
folder_type_registry = e_shell_get_folder_type_registry (e_shell_view_get_shell (shell_view));
diff --git a/shell/e-storage-set-view.c b/shell/e-storage-set-view.c
index 3129cdd976..63aa9cfbf1 100644
--- a/shell/e-storage-set-view.c
+++ b/shell/e-storage-set-view.c
@@ -1332,26 +1332,48 @@ etree_icon_at (ETreeModel *etree,
ETreePath tree_path,
void *model_data)
{
+ EFolderTypeRegistry *folder_type_registry;
EStorageSetView *storage_set_view;
EStorageSet *storage_set;
+ GdkPixbuf *icon_pixbuf;
EFolder *folder;
char *path;
+ int depth;
/* folders are from depth 2 on. depth 1 are storages and 0 is
- our (invisible) root node. */
- if (e_tree_model_node_depth (etree, tree_path) < 2)
- return NULL;
-
- storage_set_view = E_STORAGE_SET_VIEW (model_data);
- storage_set = storage_set_view->priv->storage_set;
+ our My Evolution root node. */
+ depth = e_tree_model_node_depth (etree, tree_path);
+
+ switch (depth) {
+ case 0: /* My Evolution */
+ storage_set_view = E_STORAGE_SET_VIEW (model_data);
+ storage_set = storage_set_view->priv->storage_set;
+
+ folder_type_registry = e_storage_set_get_folder_type_registry (storage_set);
+
+ icon_pixbuf = e_folder_type_registry_get_icon_for_type (folder_type_registry,
+ "My Evolution", TRUE);
- path = (char*)e_tree_memory_node_get_data (E_TREE_MEMORY(etree), tree_path);
+ return icon_pixbuf;
- folder = e_storage_set_get_folder (storage_set, path);
- if (folder == NULL)
+ case 1:
return NULL;
-
- return get_pixbuf_for_folder (storage_set_view, folder);
+
+ case 2:
+ storage_set_view = E_STORAGE_SET_VIEW (model_data);
+ storage_set = storage_set_view->priv->storage_set;
+
+ path = (char*)e_tree_memory_node_get_data (E_TREE_MEMORY(etree), tree_path);
+
+ folder = e_storage_set_get_folder (storage_set, path);
+ if (folder == NULL)
+ return NULL;
+
+ return get_pixbuf_for_folder (storage_set_view, folder);
+
+ default:
+ return NULL;
+ }
}
/* This function returns the number of columns in our ETreeModel. */
@@ -1414,7 +1436,7 @@ etree_value_at (ETreeModel *etree, ETreePath tree_path, int col, void *model_dat
if (storage != NULL && col == 0)
return (void *) e_storage_get_name (storage);
- return NULL;
+ return g_strdup ("My Evolution");
}
static void
@@ -1873,7 +1895,7 @@ e_storage_set_view_construct (EStorageSetView *storage_set_view,
e_tree_memory_set_node_destroy_func (E_TREE_MEMORY (priv->etree_model), (GFunc) g_free, NULL);
e_tree_memory_set_expanded_default (E_TREE_MEMORY (priv->etree_model), TRUE);
- priv->root_node = e_tree_memory_node_insert (E_TREE_MEMORY(priv->etree_model), NULL, -1, g_strdup ("/Root Node"));
+ priv->root_node = e_tree_memory_node_insert (E_TREE_MEMORY(priv->etree_model), NULL, -1, g_strdup ("/My Evolution"));
extras = e_table_extras_new ();
cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
@@ -1884,7 +1906,7 @@ e_storage_set_view_construct (EStorageSetView *storage_set_view,
e_tree_construct_from_spec_file (E_TREE (storage_set_view), priv->etree_model, extras,
EVOLUTION_ETSPECDIR "/e-storage-set-view.etspec", NULL);
- e_tree_root_node_set_visible (E_TREE(storage_set_view), FALSE);
+ e_tree_root_node_set_visible (E_TREE(storage_set_view), TRUE);
gtk_object_unref (GTK_OBJECT (extras));
@@ -1995,7 +2017,7 @@ e_storage_set_view_set_show_folders (EStorageSetView *storage_set_view,
e_tree_memory_node_remove (E_TREE_MEMORY(priv->etree_model), priv->root_node);
/* now re-add the root node */
- priv->root_node = e_tree_memory_node_insert (E_TREE_MEMORY(priv->etree_model), NULL, -1, g_strdup ("/Root Node"));
+ priv->root_node = e_tree_memory_node_insert (E_TREE_MEMORY(priv->etree_model), NULL, -1, g_strdup ("/My Evolution"));
/* then reinsert the storages after setting the "show_folders"
flag. insert_storages will call insert_folders if
diff --git a/shell/evolution-storage.c b/shell/evolution-storage.c
index bbe1a3be51..0686d7c0bf 100644
--- a/shell/evolution-storage.c
+++ b/shell/evolution-storage.c
@@ -300,7 +300,6 @@ impl_Storage_async_create_folder (PortableServer_Servant servant,
bonobo_object = bonobo_object_from_servant (servant);
storage = EVOLUTION_STORAGE (bonobo_object);
- g_message ("Path: %s", path);
gtk_signal_emit (GTK_OBJECT (storage), signals[CREATE_FOLDER],
listener, path, type, description, parent_physical_uri);
}
diff --git a/ui/ChangeLog b/ui/ChangeLog
index daf066bbf0..3377f385a9 100644
--- a/ui/ChangeLog
+++ b/ui/ChangeLog
@@ -1,3 +1,7 @@
+2001-06-08 Iain Holmes <iain@ximian.com>
+
+ * evolution-executive-summary.xml: Change for the new stuff.
+
2001-06-05 Jason Leach <jleach@ximian.com>
* evolution.xml: Fix a little thing where it was actually saying
diff --git a/ui/Makefile.am b/ui/Makefile.am
index a6b55836c6..b6ea2dc932 100644
--- a/ui/Makefile.am
+++ b/ui/Makefile.am
@@ -9,7 +9,8 @@ XML_FILES = \
evolution-message-composer.xml \
evolution-subscribe.xml \
evolution-task-editor-dialog.xml\
- evolution-tasks.xml
+ evolution-tasks.xml \
+ my-evolution.xml
uidir = $(datadir)/gnome/ui
ui_DATA = $(XML_FILES)
diff --git a/ui/evolution-executive-summary.xml b/ui/evolution-executive-summary.xml
index 3b5a4dfeba..d6f53e236e 100644
--- a/ui/evolution-executive-summary.xml
+++ b/ui/evolution-executive-summary.xml
@@ -3,25 +3,10 @@
<submenu name="Settings">
- <menuitem name="ESummarySettings" verb="ESummarySettings"
- _label="Executive Summary Settings..."/>
+ <menuitem name="CustomiseMyEvolution" verb="CustomiseMyEvolution"
+ _label="Customise My Evolution"/>
</submenu>
</menu>
-
- <dockitem name="Toolbar">
-
- <toolitem name="AddService" verb="AddService"
- _label="Add Service" priority="1" _tip="Add a new service to the Executive Summary"
- pixtype="pixbuf"/>
-
- <separator/>
-
- <toolitem name="NewMail" verb="NewMail"
- _label="New Mail" _tip="Create a new email"
- pixtype="pixbuf"/>
-
- </dockitem>
</Root>
-
diff --git a/ui/my-evolution.xml b/ui/my-evolution.xml
new file mode 100644
index 0000000000..bdc59ed966
--- /dev/null
+++ b/ui/my-evolution.xml
@@ -0,0 +1,23 @@
+<Root>
+
+ <commands>
+ <cmd name="PrintMyEvolution" _label="Print" _tip="Print My Evolution"
+ pixtype="stock" pixname="Print"/>
+ </commands>
+
+ <menu>
+ <submenu name="File">
+ <placeholder name="Print">
+ <menuitem name="Print" verb="PrintMyEvolution"
+ _label="_Print..." _tip="Print My Evolution"
+ accel="*Control*p" pixtype="pixbuf"/>
+ </placeholder>
+ </submenu>
+ </menu>
+
+ <dockitem name="Toolbar">
+
+ <toolitem name="PrintMyEvolution" verb="PrintMyEvolution"/>
+
+ </dockitem>
+</Root>