VXIprompt.cpp
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:9k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. /****************License************************************************
  2.  * Vocalocity OpenVXI
  3.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *  
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  18.  * registered trademarks of Vocalocity, Inc. 
  19.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  20.  * by Vocalocity.
  21.  ***********************************************************************/
  22. #include <cstdio>
  23. #include <string>
  24. #include <cstring>
  25. #define VXIstrcmp wcscmp
  26. #include <VXIvalue.h>
  27. #define VXIPROMPT_EXPORTS
  28. #include "VXIpromptAPI.h"
  29. // Global for the base diagnostic tag ID
  30. //
  31. static VXIunsigned gblDiagLogBase = 0;
  32. // Constants for diagnostic logging tags
  33. //
  34. static const VXIunsigned DIAG_TAG_PROMPTING = 1;
  35. static const VXIunsigned DIAG_TAG_PREFETCHING = 2;
  36. // VXIprompt implementation of the VXIprompt interface
  37. //
  38. extern "C" {
  39. struct VXIpromptImpl {
  40.   // Base interface, must be first
  41.   VXIpromptInterfaceEx intf;
  42.   // Log interface for this resource
  43.   VXIlogInterface *log;
  44.   // Internet fetch interface for this resource
  45.   VXIinetInterface *inet;
  46. };
  47. }
  48. // A few conversion functions...
  49. static inline VXIpromptImpl * ToVXIpromptImpl(VXIpromptInterface * i)
  50. { return reinterpret_cast<VXIpromptImpl *>(i); }
  51. static inline VXIpromptImpl * ToVXIpromptImpl(VXIpromptInterfaceEx * i)
  52. { return reinterpret_cast<VXIpromptImpl *>(i); }
  53. /*******************************************************
  54.  *
  55.  * Utility functions
  56.  *
  57.  *******************************************************/ 
  58. /**
  59.  * Log an error
  60.  */
  61. static VXIlogResult Error(VXIpromptImpl *impl, VXIunsigned errorID,
  62.   const VXIchar *format, ...)
  63. {
  64.   VXIlogResult rc;
  65.   va_list arguments;
  66.   if ((! impl) || (! impl->log))
  67.     return VXIlog_RESULT_NON_FATAL_ERROR;
  68.   
  69.   if (format) {
  70.     va_start(arguments, format);
  71.     rc = (*impl->log->VError)(impl->log, COMPANY_DOMAIN L".VXIprompt", 
  72.       errorID, format, arguments);
  73.     va_end(arguments);
  74.   } else {
  75.     rc = (*impl->log->Error)(impl->log, COMPANY_DOMAIN L".VXIprompt",
  76.      errorID, NULL);
  77.   }
  78.   return rc;
  79. }
  80. /**
  81.  * Log a diagnostic message
  82.  */
  83. static VXIlogResult Diag(VXIpromptImpl *impl, VXIunsigned tag, 
  84.  const VXIchar *subtag, const VXIchar *format, ...)
  85. {
  86.   VXIlogResult rc;
  87.   va_list arguments;
  88.   if ((! impl) || (! impl->log))
  89.     return VXIlog_RESULT_NON_FATAL_ERROR;
  90.   if (format) {
  91.     va_start(arguments, format);
  92.     rc = (*impl->log->VDiagnostic)(impl->log, tag + gblDiagLogBase, subtag,
  93.    format, arguments);
  94.     va_end(arguments);
  95.   } else {
  96.     rc = (*impl->log->Diagnostic)(impl->log, tag + gblDiagLogBase, subtag,
  97.   NULL);
  98.   }
  99.   return rc;
  100. }
  101. /*******************************************************
  102.  *
  103.  * Method routines for VXIpromptInterface structure
  104.  *
  105.  *******************************************************/ 
  106. // Get the VXIprompt interface version supported
  107. //
  108. static VXIint32 VXIpromptGetVersion(void)
  109. {
  110.   return VXI_CURRENT_VERSION;
  111. }
  112. // Get the implementation name
  113. //
  114. static const VXIchar* VXIpromptGetImplementationName(void)
  115. {
  116.   static const VXIchar IMPLEMENTATION_NAME[] = COMPANY_DOMAIN L".VXIprompt";
  117.   return IMPLEMENTATION_NAME;
  118. }
  119. // Begin a session
  120. //
  121. static 
  122. VXIpromptResult VXIpromptBeginSession(VXIpromptInterface * pThis, VXIMap *)
  123. {
  124.   return VXIprompt_RESULT_SUCCESS;
  125. }
  126. // End a session
  127. //
  128. static
  129. VXIpromptResult VXIpromptEndSession(VXIpromptInterface *pThis, VXIMap *)
  130. {
  131.   return VXIprompt_RESULT_SUCCESS;
  132. }
  133. // Start playing queued prompts. This call is non-blocking.
  134. //
  135. static VXIpromptResult VXIpromptPlay(VXIpromptInterface * vxip)
  136. {
  137.   VXIpromptImpl *impl = ToVXIpromptImpl(vxip);
  138.   Diag(impl, DIAG_TAG_PROMPTING, NULL, L"Playing queued prompts");
  139.   return VXIprompt_RESULT_SUCCESS;
  140. }
  141. // Start the special play of a filler prompt. This call is non-blocking.
  142. //
  143. static
  144. VXIpromptResult VXIpromptPlayFiller(VXIpromptInterface * vxip,
  145.     const VXIchar *type,
  146.     const VXIchar *src,
  147.     const VXIchar *text,
  148.     const VXIMap* properties,
  149.     VXIlong minPlayMsec)
  150. {
  151.   return VXIprompt_RESULT_SUCCESS;
  152. }
  153. static
  154. VXIpromptResult VXIpromptPrefetch(VXIpromptInterface * vxip,
  155.   const VXIchar *type,
  156.   const VXIchar *src,
  157.   const VXIchar *text,
  158.   const VXIMap* properties)
  159. {
  160.   VXIpromptImpl *impl = ToVXIpromptImpl(vxip);
  161.   Diag(impl, DIAG_TAG_PREFETCHING, L"VXIpromptPrefetch", L"%s",
  162.       (text ? text : L"NULL")); 
  163.   return VXIprompt_RESULT_SUCCESS;
  164. }
  165. // Queue prompt for playing. This call is non-blocking. The prompt
  166. //  is not played until VXIpromptPlay( ) is called.
  167. // 
  168. static
  169. VXIpromptResult VXIpromptQueue(VXIpromptInterface* vxip,
  170.        const VXIchar *raw_type,
  171.        const VXIchar *raw_src,  /* no longer used */
  172.        const VXIchar *raw_text,
  173.        const VXIMap  *properties)
  174. {
  175.   VXIpromptImpl *impl = ToVXIpromptImpl(vxip);
  176.   
  177.   vxistring type(L""), text(L"");
  178.   if (raw_type)
  179.     type = raw_type;
  180.   if (raw_text)
  181.     text = raw_text;
  182.   // Handle the resolved information to queue.
  183.   if (text.empty())
  184.     return VXIprompt_RESULT_INVALID_ARGUMENT;
  185.   // currently, vxi only queues SSML
  186.   if (type == VXI_MIME_SSML) {
  187.     vxistring bargein;
  188.     const VXIValue *val = VXIMapGetProperty(properties, L"bargein");
  189. if (val != NULL)
  190.       bargein = VXIStringCStr(reinterpret_cast<const VXIString*>(val));
  191.     vxistring bargeintype;
  192.     val = VXIMapGetProperty(properties, L"bargeintype");
  193. if (val != NULL)
  194.       bargeintype = VXIStringCStr(reinterpret_cast<const VXIString*>(val));
  195. Diag(impl, DIAG_TAG_PROMPTING, NULL, L"Queuing TTS: bargein=%s, bargeintype=%s, ssml=%s",
  196.          bargein.c_str(), bargeintype.c_str(), text.c_str());
  197.   } 
  198.   else {
  199.     Diag(impl, DIAG_TAG_PROMPTING, NULL, 
  200.          L"Queuing Unknown type text (%s): %s" , type.c_str(), text.c_str());
  201.     return VXIprompt_RESULT_UNSUPPORTED;
  202.   }
  203.   return VXIprompt_RESULT_SUCCESS;
  204. }
  205.              
  206. // Wait until all queued prompts finish playing.
  207. //
  208. static VXIpromptResult VXIpromptWait(VXIpromptInterface* vxip,
  209.                                      VXIpromptResult* playResult)
  210. {
  211.   VXIpromptImpl *impl = ToVXIpromptImpl(vxip);
  212.   Diag(impl, DIAG_TAG_PROMPTING, NULL, 
  213.        L"%s" , L"VXIpromptWait");
  214.   *playResult = VXIprompt_RESULT_SUCCESS;
  215.   return VXIprompt_RESULT_SUCCESS;
  216. }
  217. // Stop the current playing prompt.
  218. //
  219. static VXIpromptResult VXIpromptStop (VXIpromptInterfaceEx *prompt)
  220. {
  221.   if (prompt == NULL)
  222.     return VXIprompt_RESULT_INVALID_ARGUMENT;
  223.   VXIpromptImpl* promptImpl = reinterpret_cast<VXIpromptImpl*>(prompt);
  224.   return VXIprompt_RESULT_SUCCESS;  
  225. }
  226. /*******************************************************
  227.  * Global init and factory methods
  228.  *******************************************************/ 
  229. VXIPROMPT_API VXIpromptResult VXIpromptInit (VXIlogInterface  *log,
  230.      VXIunsigned       diagLogBase,
  231.      const VXIVector   *resources,
  232.      VXIMap            *args)
  233.   if (! log) return VXIprompt_RESULT_INVALID_ARGUMENT;
  234.   gblDiagLogBase = diagLogBase;
  235.   return VXIprompt_RESULT_SUCCESS; 
  236. }
  237. VXIPROMPT_API VXIpromptResult VXIpromptShutDown (VXIlogInterface  *log)
  238.   if (! log) return VXIprompt_RESULT_INVALID_ARGUMENT;
  239.   return VXIprompt_RESULT_SUCCESS; 
  240. }
  241. VXIPROMPT_API
  242. VXIpromptResult VXIpromptCreateResource (
  243.   VXIlogInterface     *log,
  244.   VXIinetInterface    *inet,
  245.   VXIcacheInterface   *cache,
  246.   VXIpromptInterface **prompt)
  247. {  
  248.   if ((! log) || (! inet)) return VXIprompt_RESULT_INVALID_ARGUMENT;
  249.   VXIpromptImpl* pp = new VXIpromptImpl();
  250.   if (pp == NULL) return VXIprompt_RESULT_OUT_OF_MEMORY;
  251.   pp->log = log;
  252.   pp->inet = inet;
  253.   pp->intf.vxiprompt.GetVersion            = VXIpromptGetVersion;
  254.   pp->intf.vxiprompt.GetImplementationName = VXIpromptGetImplementationName;
  255.   pp->intf.vxiprompt.BeginSession          = VXIpromptBeginSession;
  256.   pp->intf.vxiprompt.EndSession            = VXIpromptEndSession;
  257.   pp->intf.vxiprompt.Play                  = VXIpromptPlay;
  258.   pp->intf.vxiprompt.PlayFiller            = VXIpromptPlayFiller;
  259.   pp->intf.vxiprompt.Prefetch              = VXIpromptPrefetch;
  260.   pp->intf.vxiprompt.Queue                 = VXIpromptQueue;
  261.   pp->intf.vxiprompt.Wait                  = VXIpromptWait;
  262.   pp->intf.Stop                            = VXIpromptStop;
  263.   
  264.   *prompt = &pp->intf.vxiprompt;
  265.   return VXIprompt_RESULT_SUCCESS;
  266. }
  267. VXIPROMPT_API 
  268. VXIpromptResult VXIpromptDestroyResource (VXIpromptInterface **prompt)
  269. {
  270.   if (prompt == NULL || *prompt == NULL)
  271.     return VXIprompt_RESULT_INVALID_ARGUMENT;
  272.   VXIpromptImpl* promptImpl = reinterpret_cast<VXIpromptImpl*>(*prompt);
  273.   delete promptImpl;
  274.   *prompt = NULL;
  275.   return VXIprompt_RESULT_SUCCESS;
  276. }