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

xml/soap/webservice

开发平台:

Visual C++

  1. /* SBtrdEvent, utility class for managing events */
  2. /****************License************************************************
  3.  * Vocalocity OpenVXI
  4.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version 2
  8.  * of the License, or (at your option) any later version.
  9.  *  
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  19.  * registered trademarks of Vocalocity, Inc. 
  20.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  21.  * by Vocalocity.
  22.  ***********************************************************************/
  23. // -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8
  24. #define SBTRDUTIL_EXPORTS
  25. #include "SBtrdEvent.hpp"             // Header for this class
  26. #include <stdio.h>
  27. #include <limits.h>                   // For INT_MAX
  28. #include "VXIlog.h"                   // For logging
  29. // -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8
  30. // Destructor
  31. SBtrdEvent::~SBtrdEvent( ) 
  32.   Diag (0, L"SBtrdEvent::~SBtrdEvent", L"enter: this 0x%p", this);
  33.   
  34.   if ( _timer ) 
  35.     VXItrdTimerDestroy (&_timer); 
  36.   if ( _sleepMutex ) 
  37.     VXItrdMutexDestroy (&_sleepMutex); 
  38. }
  39. // Creation method
  40. VXItrdResult SBtrdEvent::Create( )
  41.   VXItrdResult rc;
  42.   Diag (0, L"SBtrdEvent::Create", L"enter: this 0x%p", this);
  43.   if ( _timer != NULL ) {
  44.     rc = VXItrd_RESULT_FATAL_ERROR;
  45.   } else {
  46.     rc = VXItrdTimerCreate (&_timer);
  47.     if ( rc == VXItrd_RESULT_SUCCESS )
  48.       rc = VXItrdMutexCreate (&_sleepMutex);
  49.   }
  50.   return rc;
  51. }
  52. // Reset the event
  53. VXItrdResult SBtrdEvent::Reset( ) 
  54.   Diag (0, L"SBtrdEvent::Reset", L"enter: this 0x%p", this);
  55.   _alerted = FALSE; 
  56.   return VXItrd_RESULT_SUCCESS; 
  57. }
  58. // Set the event
  59. VXItrdResult SBtrdEvent::Set( ) 
  60.   Diag (0, L"SBtrdEvent::Set", L"enter: this 0x%p", this);
  61.   _alerted = TRUE; 
  62.   return VXItrdTimerWake (_timer); 
  63. }
  64. // Wait on the event
  65. VXItrdResult SBtrdEvent::Wait( ) 
  66. {
  67.   VXItrdResult rc = VXItrd_RESULT_SUCCESS;
  68.   Diag (0, L"SBtrdEvent::Wait", L"enter: this 0x%p", this);
  69.   if (( ! _alerted ) &&
  70.       ( (rc = VXItrdMutexLock (_sleepMutex)) == VXItrd_RESULT_SUCCESS )) {
  71.     while (( ! _alerted ) && 
  72.    ( (rc = VXItrdTimerSleep (_timer, INT_MAX, NULL)) ==
  73.      VXItrd_RESULT_SUCCESS )) {
  74.       // keep waiting
  75.       Diag (0, L"SBtrdEvent::Wait", L"woke up: %d", _alerted);
  76.     }
  77.     
  78.     if ( VXItrdMutexUnlock (_sleepMutex) != VXItrd_RESULT_SUCCESS )
  79.       rc = VXItrd_RESULT_SYSTEM_ERROR;
  80.   }
  81.   Diag (0, L"SBtrdEvent::Wait", L"exit: %d", rc);
  82.   return rc;
  83. }
  84. // Error logging
  85. SBTRDUTIL_API_CLASS void
  86. SBtrdEvent::Error (VXIunsigned errorID, const VXIchar *format, ...) const
  87. {
  88.   if ( _log ) {
  89.     if ( format ) {
  90.       va_list arguments;
  91.       va_start(arguments, format);
  92.       (*_log->VError)(_log, COMPANY_DOMAIN L".SBtrdUtil", errorID, format,
  93.       arguments);
  94.       va_end(arguments);
  95.     } else {
  96.       (*_log->Error)(_log, COMPANY_DOMAIN L".SBtrdUtil", errorID, NULL);
  97.     }
  98.   }  
  99. }
  100. // Diagnostic logging
  101. SBTRDUTIL_API_CLASS void
  102. SBtrdEvent::Diag (VXIunsigned tag, const VXIchar *subtag, 
  103.   const VXIchar *format, ...) const
  104. {
  105.   if ( _log ) {
  106.     if ( format ) {
  107.       va_list arguments;
  108.       va_start(arguments, format);
  109.       (*_log->VDiagnostic)(_log, tag + _diagTagBase, subtag, format, 
  110.    arguments);
  111.       va_end(arguments);
  112.     } else {
  113.       (*_log->Diagnostic)(_log, tag + _diagTagBase, subtag, NULL);
  114.     }
  115. #if 0
  116.   } else {
  117.     VXIchar temp[1024];
  118.     va_list arguments;
  119.     va_start(arguments, format);
  120.     wcscpy (temp, subtag);
  121.     wcscat (temp, L"|");
  122.     wcscat (temp, format);
  123.     wcscat (temp, L"n");
  124.     vfwprintf(stderr, temp, arguments);
  125.     va_end(arguments);
  126. #endif
  127.   }
  128. }