diff options
65 files changed, 7022 insertions, 137 deletions
@@ -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 Binary files differnew file mode 100644 index 0000000000..ec03f8ab6e --- /dev/null +++ b/art/bcg.png diff --git a/art/empty.gif b/art/empty.gif Binary files differnew file mode 100644 index 0000000000..0be4006193 --- /dev/null +++ b/art/empty.gif diff --git a/art/es-appointments.png b/art/es-appointments.png Binary files differnew file mode 100644 index 0000000000..e194232051 --- /dev/null +++ b/art/es-appointments.png diff --git a/art/es-weather.png b/art/es-weather.png Binary files differnew file mode 100644 index 0000000000..3d31469e78 --- /dev/null +++ b/art/es-weather.png diff --git a/art/ico-calendar.png b/art/ico-calendar.png Binary files differnew file mode 100644 index 0000000000..3010528d7f --- /dev/null +++ b/art/ico-calendar.png diff --git a/art/ico-mail.png b/art/ico-mail.png Binary files differnew file mode 100644 index 0000000000..66a4ba89cd --- /dev/null +++ b/art/ico-mail.png diff --git a/art/ico-rdf.png b/art/ico-rdf.png Binary files differnew file mode 100644 index 0000000000..ad1a8a42f5 --- /dev/null +++ b/art/ico-rdf.png diff --git a/art/ico-weather.png b/art/ico-weather.png Binary files differnew file mode 100644 index 0000000000..25eb161f8c --- /dev/null +++ b/art/ico-weather.png diff --git a/art/pattern.png b/art/pattern.png Binary files differnew file mode 100644 index 0000000000..33abc187ef --- /dev/null +++ b/art/pattern.png diff --git a/art/rdf.png b/art/rdf.png Binary files differnew file mode 100644 index 0000000000..7d84d64583 --- /dev/null +++ b/art/rdf.png 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\">   " + "<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, "&", 5) == 0) { + *w++ = '&'; + r += 5; + continue; + } + if (memcmp (r, "<", 4) == 0) { + *w++ = '<'; + r += 4; + continue; + } + if (memcmp (r, ">", 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\"> <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, ®ions); + 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> </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> |