Unicode support for notification_email library

This commit is contained in:
2013-06-13 09:45:40 +02:00
parent 2252971c3e
commit 47dbe7fdbb
6 changed files with 113 additions and 55 deletions

View File

@@ -0,0 +1,10 @@
${NOTE_KEYWORD}
copyright: "2011-${YEAR}, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
5949 Hollister Ave., Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"

View File

@@ -55,4 +55,14 @@ feature -- Basic operation
end end
end end
note
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
5949 Hollister Ave., Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"
end end

View File

@@ -55,17 +55,24 @@ feature -- Conversion
message: STRING_8 message: STRING_8
do do
Result := header Result := header
Result.append ("%N") Result.append_character ('%N')
Result.append (body) Result.append (body)
Result.append ("%N") Result.append_character ('%N')
Result.append ("%N") Result.append_character ('%N')
end end
header: STRING_8 header: STRING_8
local
hdate: HTTP_DATE
do do
create Result.make (20) create Result.make (20)
Result.append ("From: " + from_address + "%N") Result.append ("From: ")
Result.append ("Date: " + date_to_rfc1123_http_date_format (date) + " GMT%N") Result.append (from_address)
Result.append_character ('%N')
Result.append ("Date: ")
create hdate.make_from_date_time (date)
hdate.append_to_rfc1123_string (Result)
Result.append (" GMT%N")
Result.append ("To: ") Result.append ("To: ")
across across
to_addresses as c to_addresses as c
@@ -74,24 +81,24 @@ feature -- Conversion
Result.append_character (';') Result.append_character (';')
end end
Result.append_character ('%N') Result.append_character ('%N')
Result.append ("Subject: " + subject + "%N") Result.append ("Subject: ")
Result.append (subject)
Result.append_character ('%N')
ensure ensure
Result.ends_with ("%N") Result.ends_with ("%N")
end end
feature {NONE} -- Implementation
date_to_rfc1123_http_date_format (dt: DATE_TIME): STRING_8
-- String representation of `dt' using the RFC 1123
local
d: HTTP_DATE
do
create d.make_from_date_time (dt)
Result := d.rfc1123_string
end
invariant invariant
-- invariant_clause: True -- invariant_clause: True
note
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
5949 Hollister Ave., Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"
end end

View File

@@ -1,8 +1,11 @@
note note
description : "Objects that ..." description: "[
author : "$Author$" Component responsible to send email using an external mailer
date : "$Date$" i.e: an external tool such as sendmail or a script, ...
revision : "$Revision$" ]"
author: "$Author$"
date: "$Date$"
revision: "$Revision$"
class class
NOTIFICATION_EXTERNAL_MAILER NOTIFICATION_EXTERNAL_MAILER
@@ -10,27 +13,30 @@ class
inherit inherit
NOTIFICATION_MAILER NOTIFICATION_MAILER
-- SHARED_EXECUTION_ENVIRONMENT SHARED_EXECUTION_ENVIRONMENT
export
{NONE} all
end
create create
make make
feature {NONE} -- Initialization feature {NONE} -- Initialization
make (a_exe: like executable_path; args: detachable ITERABLE [READABLE_STRING_8]) make (a_exe: READABLE_STRING_GENERAL; args: detachable ITERABLE [READABLE_STRING_GENERAL])
-- Initialize `Current'. -- Initialize `Current'.
do do
set_parameters (a_exe, args) set_parameters (a_exe, args)
end end
executable_path: READABLE_STRING_8 executable_path: PATH
arguments: detachable ARRAYED_LIST [STRING_8] arguments: detachable ARRAYED_LIST [READABLE_STRING_GENERAL]
stdin_mode_set: BOOLEAN stdin_mode_set: BOOLEAN
-- Use `stdin' to pass email message, rather than using local file? -- Use `stdin' to pass email message, rather than using local file?
stdin_termination_sequence: detachable STRING stdin_termination_sequence: detachable READABLE_STRING_8
-- Termination sequence for the stdin mode -- Termination sequence for the stdin mode
--| If any, this tells the executable all the data has been provided --| If any, this tells the executable all the data has been provided
--| For instance, using sendmail, you should have "%N.%N%N" --| For instance, using sendmail, you should have "%N.%N%N"
@@ -41,18 +47,18 @@ feature -- Status
local local
f: RAW_FILE f: RAW_FILE
do do
create f.make (executable_path) create f.make_with_path (executable_path)
Result := f.exists Result := f.exists
end end
feature -- Change feature -- Change
set_parameters (cmd: like executable_path; args: detachable ITERABLE [READABLE_STRING_8]) set_parameters (cmd: READABLE_STRING_GENERAL; args: detachable ITERABLE [READABLE_STRING_GENERAL])
-- Set parameters `executable_path' and associated `arguments' -- Set parameters `executable_path' and associated `arguments'
local local
l_args: like arguments l_args: like arguments
do do
executable_path := cmd create executable_path.make_from_string (cmd)
if args = Void then if args = Void then
arguments := Void arguments := Void
else else
@@ -86,7 +92,7 @@ feature -- Basic operation
if retried = 0 then if retried = 0 then
create l_factory create l_factory
if stdin_mode_set then if stdin_mode_set then
p := l_factory.process_launcher (executable_path, arguments, Void) p := l_factory.process_launcher (executable_path.name, arguments, Void)
p.set_hidden (True) p.set_hidden (True)
p.set_separate_console (False) p.set_separate_console (False)
@@ -110,7 +116,7 @@ feature -- Basic operation
args.force (f.name) args.force (f.name)
end end
end end
p := l_factory.process_launcher (executable_path, args, Void) p := l_factory.process_launcher (executable_path.name, args, Void)
p.set_hidden (True) p.set_hidden (True)
p.set_separate_console (False) p.set_separate_console (False)
@@ -140,34 +146,36 @@ feature -- Basic operation
feature {NONE} -- Implementation feature {NONE} -- Implementation
new_temporary_file (a_extension: detachable STRING_8): RAW_FILE new_temporary_file (a_extension: detachable READABLE_STRING_8): RAW_FILE
-- Create file with temporary name. -- Create file with temporary name.
-- With concurrent execution, noting ensures that {FILE_NAME}.make_temporary_name is unique -- With concurrent execution, noting ensures that {FILE_NAME}.make_temporary_name is unique
-- So using `a_extension' may help -- So using `a_extension' may help
local local
fn: FILE_NAME bn: STRING_32
s: like {FILE_NAME}.string fn: PATH
s: STRING_32
f: detachable like new_temporary_file f: detachable like new_temporary_file
i: INTEGER i: INTEGER
do do
-- With concurrent execution, nothing ensures that {FILE_NAME}.make_temporary_name is unique -- With concurrent execution, nothing ensures that {FILE_NAME}.make_temporary_name is unique
-- So let's try to find -- So let's try to find
from from
create bn.make_from_string_general ((create {FILE_NAME}.make_temporary_name).string)
create s.make_empty
until until
f /= Void or i > 1000 f /= Void or i > 1000
loop loop
create fn.make_temporary_name create fn.make_from_string (bn)
s := fn.string s.make_empty
if i > 0 then if i > 0 then
s.append_character ('-') s.append_character ('-')
s.append_integer (i) s.append_integer (i)
create fn.make_from_string (s) fn := fn.appended (s)
end end
if a_extension /= Void then if a_extension /= Void then
fn.add_extension (a_extension) fn := fn.appended_with_extension (a_extension)
end end
s := fn.string create f.make_with_path (fn)
create f.make (fn.string)
if f.exists then if f.exists then
i := i + 1 i := i + 1
f := Void f := Void
@@ -185,13 +193,16 @@ feature {NONE} -- Implementation
result_creatable: Result.is_creatable result_creatable: Result.is_creatable
end end
feature {NONE} -- Environment
Execution_environment: EXECUTION_ENVIRONMENT
once
create Result
end
invariant invariant
note
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
5949 Hollister Ave., Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"
end end

View File

@@ -1,10 +1,10 @@
note note
description : "[ description: "[
Component responsible to send email Component responsible to send email
]" ]"
author : "$Author$" author: "$Author$"
date : "$Date$" date: "$Date$"
revision : "$Revision$" revision: "$Revision$"
deferred class deferred class
NOTIFICATION_MAILER NOTIFICATION_MAILER
@@ -45,4 +45,14 @@ feature -- Basic operation
deferred deferred
end end
note
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
5949 Hollister Ave., Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"
end end

View File

@@ -2,9 +2,9 @@ note
description : "[ description : "[
NOTIFICATION_MAILER using sendmail as mailtool NOTIFICATION_MAILER using sendmail as mailtool
]" ]"
author : "$Author$" author: "$Author$"
date : "$Date$" date: "$Date$"
revision : "$Revision$" revision: "$Revision$"
class class
NOTIFICATION_SENDMAIL_MAILER NOTIFICATION_SENDMAIL_MAILER
@@ -31,4 +31,14 @@ feature {NONE} -- Initialization
end end
note
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
5949 Hollister Ave., Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"
end end