<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[Freeswitch-trunk][16933] </title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<div id="header">FreeSWITCH Subversion</div>
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://fisheye.freeswitch.org/changelog/FreeSWITCH?cs=16933">16933</a></dd>
<dt>Author</dt> <dd>mochouinard</dd>
<dt>Date</dt> <dd>2010-03-08 00:50:27 -0600 (Mon, 08 Mar 2010)</dd>
</dl>
<h3>Log Message</h3>
<pre>mod_say_fr: Update for better french support. Will probably have more stuff from <a href="http://jira.freeswitch.org/browse/FSCORE-528">FSCORE-528</a> to complement this patch</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#freeswitchtrunksrcincludeswitch_typesh">freeswitch/trunk/src/include/switch_types.h</a></li>
<li><a href="#freeswitchtrunksrcmodsaymod_say_frmod_say_frc">freeswitch/trunk/src/mod/say/mod_say_fr/mod_say_fr.c</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="freeswitchtrunksrcincludeswitch_typesh"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/include/switch_types.h (16932 => 16933)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/include/switch_types.h        2010-03-08 03:53:09 UTC (rev 16932)
+++ freeswitch/trunk/src/include/switch_types.h        2010-03-08 06:50:27 UTC (rev 16933)
</span><span class="lines">@@ -280,6 +280,7 @@
</span><span class="cx">         SWITCH_TRUE = 1
</span><span class="cx"> } switch_bool_t;
</span><span class="cx">
</span><ins>+/* WARNING, Do not forget to update *SAY_METHOD_NAMES[] in src/switch_ivr_play_say.c */
</ins><span class="cx"> typedef enum {
</span><span class="cx">         SSM_NA,
</span><span class="cx">         SSM_PRONOUNCED,
</span><span class="lines">@@ -287,6 +288,7 @@
</span><span class="cx">         SSM_COUNTED
</span><span class="cx"> } switch_say_method_t;
</span><span class="cx">
</span><ins>+/* WARNING, Do not forget to update *SAY_TYPE_NAMES[] in src/switch_ivr_play_say.c */
</ins><span class="cx"> typedef enum {
</span><span class="cx">         SST_NUMBER,
</span><span class="cx">         SST_ITEMS,
</span></span></pre></div>
<a id="freeswitchtrunksrcmodsaymod_say_frmod_say_frc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/mod/say/mod_say_fr/mod_say_fr.c (16932 => 16933)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/mod/say/mod_say_fr/mod_say_fr.c        2010-03-08 03:53:09 UTC (rev 16932)
+++ freeswitch/trunk/src/mod/say/mod_say_fr/mod_say_fr.c        2010-03-08 06:50:27 UTC (rev 16933)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> *
</span><span class="cx"> * Anthony Minessale II <anthm@freeswitch.org>
</span><span class="cx"> * Michael B. Murdock <mike@mmurdock.org>
</span><ins>+ * Marc O. Chouinard <mochouinard@moctel.com>
</ins><span class="cx"> *
</span><span class="cx"> * mod_say_fr.c -- Say for french
</span><span class="cx"> *
</span><span class="lines">@@ -66,7 +67,6 @@
</span><span class="cx">                 say_args->method = smeth; say_args->type = stype;                                \
</span><span class="cx">         }                                                                                                                                        \
</span><span class="cx">
</span><del>-
</del><span class="cx"> #define say_file(...) {                                                                                                        \
</span><span class="cx">                 char tmp[80];                                                                                                        \
</span><span class="cx">                 switch_status_t tstatus;                                                                                \
</span><span class="lines">@@ -101,28 +101,55 @@
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static switch_status_t play_group(switch_say_method_t method, int a, int b, int c, char *what, switch_core_session_t *session, switch_input_args_t *args)
</del><ins>+static switch_status_t play_group(switch_say_args_t *say_args, int a, int b, int c, char *what, switch_core_session_t *session, switch_input_args_t *args)
</ins><span class="cx"> {
</span><ins>+        int ftdNumber = 0;
+        int itd = (b * 10) + c;
</ins><span class="cx">
</span><del>-        if (a) {
-                say_file("digits/%d.wav", a);
</del><ins>+        /* Force full 2 digit playback */
+        if (itd <= 19)
+                ftdNumber = 1;
+        switch (itd) {
+                case 21:
+                case 31:
+                        ftdNumber = 1;
+        }
+        /*switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "a=%d b=[%d] c=%d\n",a, b,c); */
+
+        if (a && a !=0) {
+                /*switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "a=%d b=[%d] c=%d\n",a, b,c);*/
+                if (a != 1)
+                        say_file("digits/%d.wav", a);
</ins><span class="cx">                 say_file("digits/hundred.wav");
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        if (b) {
-                if (b > 1) {
</del><ins>+        if (b && ftdNumber == 0) {
+                /*switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "a=%d b=[%d] c=%d\n",a, b,c);*/
+                if (c == 0) {
+                        if (say_args->method == SSM_COUNTED) {
+                                say_file("digits/h-%d%d.wav", b, c);
+                        } else {
+                                say_file("digits/%d%d.wav", b, c);
+                        }
+                } else {
</ins><span class="cx">                         say_file("digits/%d0.wav", b);
</span><del>-                } else {
-                        say_file("digits/%d%d.wav", b, c);
-                        c = 0;
</del><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        if (c) {
-                if (method == SSM_COUNTED) {
-                        say_file("digits/h-%d.wav", c);
</del><ins>+        if (c || (ftdNumber == 1 && (a || b || c))) {
+                /*switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "a=%d b=[%d] c=%d\n",a, b,c);*/
+                int fVal = c;
+                if (ftdNumber == 1)
+                        fVal = itd;
+                        
+                if (say_args->method == SSM_COUNTED) {
+                        say_file("digits/h-%d.wav", fVal);
</ins><span class="cx">                 } else {
</span><del>-                        say_file("digits/%d.wav", c);
</del><ins>+                        if (b != 1 && c == 1 && say_args->gender == SSG_FEMININE) {
+                                say_file("digits/%d_f.wav", fVal);
+                        } else {
+                                say_file("digits/%d.wav", fVal);
+                        }
</ins><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx">
</span><span class="lines">@@ -161,7 +188,7 @@
</span><span class="cx">         char *p = in, *q = out;
</span><span class="cx">         char *ret = out;
</span><span class="cx">         switch_size_t x = 0;
</span><del>-        // valid are 0 - 9, period (.), minus (-), and plus (+) - remove all others
</del><ins>+        /* valid are 0 - 9, period (.), minus (-), and plus (+) - remove all others */
</ins><span class="cx">         for (; p && *p; p++) {
</span><span class="cx">                 if ((*p > 47 && *p < 58) || *p == '.' || *p == '-' || *p == '+') {
</span><span class="cx">                         *q++ = *p;
</span><span class="lines">@@ -202,13 +229,13 @@
</span><span class="cx">                 switch (say_args->method) {
</span><span class="cx">                 case SSM_COUNTED:
</span><span class="cx">                 case SSM_PRONOUNCED:
</span><del>-                        if ((status = play_group(SSM_PRONOUNCED, places[8], places[7], places[6], "digits/million.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
</del><ins>+                        if ((status = play_group(say_args, places[8], places[7], places[6], "digits/million.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
</ins><span class="cx">                                 return status;
</span><span class="cx">                         }
</span><del>-                        if ((status = play_group(SSM_PRONOUNCED, places[5], places[4], places[3], "digits/thousand.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
</del><ins>+                        if ((status = play_group(say_args, places[5], places[4], places[3], "digits/thousand.wav", session, args)) != SWITCH_STATUS_SUCCESS) {
</ins><span class="cx">                                 return status;
</span><span class="cx">                         }
</span><del>-                        if ((status = play_group(say_args->method, places[2], places[1], places[0], NULL, session, args)) != SWITCH_STATUS_SUCCESS) {
</del><ins>+                        if ((status = play_group(say_args, places[2], places[1], places[0], NULL, session, args)) != SWITCH_STATUS_SUCCESS) {
</ins><span class="cx">                                 return status;
</span><span class="cx">                         }
</span><span class="cx">                         break;
</span><span class="lines">@@ -216,7 +243,11 @@
</span><span class="cx">                         {
</span><span class="cx">                                 char *p;
</span><span class="cx">                                 for (p = tosay; p && *p; p++) {
</span><del>-                                        say_file("digits/%c.wav", *p);
</del><ins>+                                        if (*p == '1' && say_args->gender == SSG_FEMININE) {
+                                                say_file("digits/%c_f.wav", *p);
+                                        } else {
+                                                say_file("digits/%c.wav", *p);
+                                        }
</ins><span class="cx">                                 }
</span><span class="cx">                         }
</span><span class="cx">                         break;
</span><span class="lines">@@ -271,9 +302,11 @@
</span><span class="cx"> static switch_status_t fr_say_time(switch_core_session_t *session, char *tosay, switch_say_args_t *say_args, switch_input_args_t *args)
</span><span class="cx"> {
</span><span class="cx">         int32_t t;
</span><del>-        switch_time_t target = 0;
-        switch_time_exp_t tm;
-        uint8_t say_date = 0, say_time = 0;
</del><ins>+        switch_time_t target = 0, target_now = 0;
+        switch_time_exp_t tm, tm_now;
+        uint8_t say_date = 0, say_time = 0, say_year = 0, say_month = 0, say_dow = 0, say_day = 0, say_yesterday = 0, say_today = 0;
+        switch_channel_t *channel = switch_core_session_get_channel(session);
+        const char *tz = switch_channel_get_variable(channel, "timezone");
</ins><span class="cx">
</span><span class="cx">         if (say_args->type == SST_TIME_MEASUREMENT) {
</span><span class="cx">                 int64_t hours = 0;
</span><span class="lines">@@ -299,7 +332,7 @@
</span><span class="cx">                                 }
</span><span class="cx">                         }
</span><span class="cx">                 } else {
</span><del>-                        if ((seconds = atoi(tosay)) <= 0) {
</del><ins>+                        if ((seconds = atol(tosay)) <= 0) {
</ins><span class="cx">                                 seconds = (int64_t) switch_epoch_time_now(NULL);
</span><span class="cx">                         }
</span><span class="cx">
</span><span class="lines">@@ -316,52 +349,60 @@
</span><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="cx">
</span><ins>+                say_args->gender = SSG_FEMININE;
+
</ins><span class="cx">                 if (hours) {
</span><span class="cx">                         say_num(hours, SSM_PRONOUNCED);
</span><del>-                        if (hours == 1) {
-                                say_file("time/hour.wav");
-                        } else {
-                                say_file("time/hours.wav");
-                        }
</del><ins>+                        say_file("time/hour.wav");
</ins><span class="cx">                 } else {
</span><ins>+                        /* TODO MINUIT */
</ins><span class="cx">                         say_file("digits/0.wav");
</span><del>-                        say_file("time/hours.wav");
</del><ins>+                        say_file("time/hour.wav");
</ins><span class="cx">                 }
</span><span class="cx">
</span><span class="cx">                 if (minutes) {
</span><span class="cx">                         say_num(minutes, SSM_PRONOUNCED);
</span><del>-                        if (minutes == 1) {
-                                say_file("time/minute.wav");
-                        } else {
-                                say_file("time/minutes.wav");
-                        }
</del><ins>+                        say_file("time/minute.wav");
</ins><span class="cx">                 } else {
</span><ins>+                        /* TODO Aucune idee quoi faire jouer icit */
</ins><span class="cx">                         say_file("digits/0.wav");
</span><del>-                        say_file("time/minutes.wav");
</del><ins>+                        say_file("time/minute.wav");
</ins><span class="cx">                 }
</span><span class="cx">
</span><span class="cx">                 if (seconds) {
</span><span class="cx">                         say_num(seconds, SSM_PRONOUNCED);
</span><del>-                        if (seconds == 1) {
-                                say_file("time/second.wav");
-                        } else {
-                                say_file("time/seconds.wav");
-                        }
</del><ins>+                        say_file("time/second.wav");
</ins><span class="cx">                 } else {
</span><ins>+                        /* TODO Aucune idee quoi faire jouer icit */
</ins><span class="cx">                         say_file("digits/0.wav");
</span><del>-                        say_file("time/seconds.wav");
</del><ins>+                        say_file("time/second.wav");
</ins><span class="cx">                 }
</span><span class="cx">
</span><span class="cx">                 return SWITCH_STATUS_SUCCESS;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        if ((t = atoi(tosay)) > 0) {
</del><ins>+        if ((t = atol(tosay)) > 0) {
</ins><span class="cx">                 target = switch_time_make(t, 0);
</span><ins>+                target_now = switch_micro_time_now();
</ins><span class="cx">         } else {
</span><span class="cx">                 target = switch_micro_time_now();
</span><ins>+                target_now = switch_micro_time_now();
</ins><span class="cx">         }
</span><del>-        switch_time_exp_lt(&tm, target);
</del><span class="cx">
</span><ins>+        if (tz) {
+                int check = atoi(tz);
+                if (check) {
+                        switch_time_exp_tz(&tm, target, check);
+                        switch_time_exp_tz(&tm_now, target_now, check);
+                } else {
+                        switch_time_exp_tz_name(tz, &tm, target);
+                        switch_time_exp_tz_name(tz, &tm_now, target_now);
+                }
+        } else {
+                switch_time_exp_lt(&tm, target);
+                switch_time_exp_lt(&tm_now, target_now);
+        }
+
</ins><span class="cx">         switch (say_args->type) {
</span><span class="cx">         case SST_CURRENT_DATE_TIME:
</span><span class="cx">                 say_date = say_time = 1;
</span><span class="lines">@@ -372,42 +413,82 @@
</span><span class="cx">         case SST_CURRENT_TIME:
</span><span class="cx">                 say_time = 1;
</span><span class="cx">                 break;
</span><ins>+        case SST_SHORT_DATE_TIME:
+                say_time = 1;
+                if (tm.tm_year != tm_now.tm_year) {
+                        say_date = 1;
+                        break;
+                }
+                if (tm.tm_yday == tm_now.tm_yday) {
+                        say_today = 1;
+                        break;
+                }
+                if (tm.tm_yday == tm_now.tm_yday - 1) {
+                        say_yesterday = 1;
+                        break;
+                }
+                if (tm.tm_yday >= tm_now.tm_yday - 5) {
+                        say_dow = 1;
+                        break;
+                }
+                if (tm.tm_mon != tm_now.tm_mon) {
+                        say_month = say_day = say_dow = 1;
+                        break;
+                }
+
+                say_month = say_day = say_dow = 1;
+
+                break;
+
</ins><span class="cx">         default:
</span><span class="cx">                 break;
</span><span class="cx">         }
</span><span class="cx">
</span><ins>+        if (say_today) {
+                say_file("time/today.wav");
+        }
+        if (say_yesterday) {
+                say_file("time/yesterday.wav");
+        }
+        if (say_dow) {
+                say_file("time/day-%d.wav", tm.tm_wday);
+        }
+
</ins><span class="cx">         if (say_date) {
</span><del>-                say_file("time/day-%d.wav", tm.tm_wday);
</del><ins>+                say_year = say_month = say_day = say_dow = 1;
+                say_today = say_yesterday = 0;
+        }
+
+ if (say_day) {
+                if (tm.tm_mday == 1) { /* 1 er Janvier,... 2 feb, 23 dec... */
+                        say_args->gender = SSG_MASCULINE;
+         say_num(tm.tm_mday, SSM_COUNTED);
+                } else {
+                        say_args->gender = SSG_FEMININE;
+                        say_num(tm.tm_mday, SSM_PRONOUNCED);
+                }
+ }
+        if (say_month) {
</ins><span class="cx">                 say_file("time/mon-%d.wav", tm.tm_mon);
</span><del>-                say_num(tm.tm_mday, SSM_COUNTED);
</del><ins>+        }
+        if (say_year) {
+                say_args->gender = SSG_MASCULINE;
</ins><span class="cx">                 say_num(tm.tm_year + 1900, SSM_PRONOUNCED);
</span><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         if (say_time) {
</span><del>-                int32_t hour = tm.tm_hour, pm = 0;
-
-                if (hour > 12) {
-                        hour -= 12;
-                        pm = 1;
-                } else if (hour == 12) {
-                        pm = 1;
-                } else if (hour == 0) {
-                        hour = 12;
-                        pm = 0;
</del><ins>+                if (say_date || say_today || say_yesterday || say_dow) {
+                        say_file("time/at.wav");
</ins><span class="cx">                 }
</span><ins>+                say_args->gender = SSG_FEMININE;
+                say_num(tm.tm_hour, SSM_PRONOUNCED);
</ins><span class="cx">
</span><del>-                say_num(hour, SSM_PRONOUNCED);
</del><ins>+                say_file("time/hour.wav");
</ins><span class="cx">
</span><del>-                if (tm.tm_min > 9) {
</del><ins>+                if (tm.tm_min) {
</ins><span class="cx">                         say_num(tm.tm_min, SSM_PRONOUNCED);
</span><del>-                } else if (tm.tm_min) {
-                        say_file("time/oh.wav");
-                        say_num(tm.tm_min, SSM_PRONOUNCED);
-                } else {
-                        say_file("time/oclock.wav");
</del><span class="cx">                 }
</span><span class="cx">
</span><del>-                say_file("time/%s.wav", pm ? "p-m" : "a-m");
</del><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="lines">@@ -490,6 +571,7 @@
</span><span class="cx">         case SST_CURRENT_DATE:
</span><span class="cx">         case SST_CURRENT_TIME:
</span><span class="cx">         case SST_CURRENT_DATE_TIME:
</span><ins>+        case SST_SHORT_DATE_TIME:
</ins><span class="cx">                 say_cb = fr_say_time;
</span><span class="cx">                 break;
</span><span class="cx">         case SST_IP_ADDRESS:
</span></span></pre>
</div>
</div>
<div id="footer">See you at ClueCon</div>
</body>
</html>