1 /**********
2 This library is free software; you can redistribute it and/or modify it under
3 the terms of the GNU Lesser General Public License as published by the
4 Free Software Foundation; either version 3 of the License, or (at your
5 option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
6 
7 This library is distributed in the hope that it will be useful, but WITHOUT
8 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
9 FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
10 more details.
11 
12 You should have received a copy of the GNU Lesser General Public License
13 along with this library; if not, write to the Free Software Foundation, Inc.,
14 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
15 **********/
16 // Copyright (c) 1996-2020 Live Networks, Inc.  All rights reserved.
17 // Basic Usage Environment: for a simple, non-scripted, console application
18 // Implementation
19 
20 #include "BasicUsageEnvironment0.hh"
21 #include <stdio.h>
22 #if defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_WCE)
23 #define snprintf _snprintf
24 #endif
25 
26 
27 ////////// BasicUsageEnvironment //////////
28 
BasicUsageEnvironment0(TaskScheduler & taskScheduler)29 BasicUsageEnvironment0::BasicUsageEnvironment0(TaskScheduler& taskScheduler)
30   : UsageEnvironment(taskScheduler),
31     fBufferMaxSize(RESULT_MSG_BUFFER_MAX) {
32   reset();
33 }
34 
~BasicUsageEnvironment0()35 BasicUsageEnvironment0::~BasicUsageEnvironment0() {
36 }
37 
reset()38 void BasicUsageEnvironment0::reset() {
39   fCurBufferSize = 0;
40   fResultMsgBuffer[fCurBufferSize] = '\0';
41 }
42 
43 
44 // Implementation of virtual functions:
45 
getResultMsg() const46 char const* BasicUsageEnvironment0::getResultMsg() const {
47   return fResultMsgBuffer;
48 }
49 
setResultMsg(MsgString msg)50 void BasicUsageEnvironment0::setResultMsg(MsgString msg) {
51   reset();
52   appendToResultMsg(msg);
53 }
54 
setResultMsg(MsgString msg1,MsgString msg2)55 void BasicUsageEnvironment0::setResultMsg(MsgString msg1, MsgString msg2) {
56   setResultMsg(msg1);
57   appendToResultMsg(msg2);
58 }
59 
setResultMsg(MsgString msg1,MsgString msg2,MsgString msg3)60 void BasicUsageEnvironment0::setResultMsg(MsgString msg1, MsgString msg2,
61 				       MsgString msg3) {
62   setResultMsg(msg1, msg2);
63   appendToResultMsg(msg3);
64 }
65 
setResultErrMsg(MsgString msg,int err)66 void BasicUsageEnvironment0::setResultErrMsg(MsgString msg, int err) {
67   setResultMsg(msg);
68 
69   if (err == 0) err = getErrno();
70 #if defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_WCE)
71 #ifndef _UNICODE
72   char errMsg[RESULT_MSG_BUFFER_MAX] = "\0";
73   if (0 != FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, errMsg, sizeof(errMsg)/sizeof(errMsg[0]), NULL)) {
74     // Remove all trailing '\r', '\n' and '.'
75     for (char* p = errMsg + strlen(errMsg); p != errMsg && (*p == '\r' || *p == '\n' || *p == '.' || *p == '\0'); --p) {
76       *p = '\0';
77     }
78   } else
79     snprintf(errMsg, sizeof(errMsg)/sizeof(errMsg[0]), "error %d", err);
80   appendToResultMsg(errMsg);
81 #endif
82 #else
83   appendToResultMsg(strerror(err));
84 #endif
85 }
86 
87 
88 
89 
appendToResultMsg(MsgString msg)90 void BasicUsageEnvironment0::appendToResultMsg(MsgString msg) {
91   char* curPtr = &fResultMsgBuffer[fCurBufferSize];
92   unsigned spaceAvailable = fBufferMaxSize - fCurBufferSize;
93   unsigned msgLength = strlen(msg);
94 
95   // Copy only enough of "msg" as will fit:
96   if (msgLength > spaceAvailable-1) {
97     msgLength = spaceAvailable-1;
98   }
99 
100   memmove(curPtr, (char*)msg, msgLength);
101   fCurBufferSize += msgLength;
102   fResultMsgBuffer[fCurBufferSize] = '\0';
103 }
104 
reportBackgroundError()105 void BasicUsageEnvironment0::reportBackgroundError() {
106   fputs(getResultMsg(), stderr);
107 }
108 
109