256 lines
11 KiB
C++
256 lines
11 KiB
C++
/*
|
|
*
|
|
* @APPLE_LICENSE_HEADER_START@
|
|
*
|
|
* Copyright (c) 1999-2008 Apple Inc. All Rights Reserved.
|
|
*
|
|
* This file contains Original Code and/or Modifications of Original Code
|
|
* as defined in and that are subject to the Apple Public Source License
|
|
* Version 2.0 (the 'License'). You may not use this file except in
|
|
* compliance with the License. Please obtain a copy of the License at
|
|
* http://www.opensource.apple.com/apsl/ and read it before using this
|
|
* file.
|
|
*
|
|
* The Original Code and all software distributed under the License are
|
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
|
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
|
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
|
* Please see the License for the specific language governing rights and
|
|
* limitations under the License.
|
|
*
|
|
* @APPLE_LICENSE_HEADER_END@
|
|
*
|
|
*/
|
|
/*
|
|
File: QTSSMessages.cpp
|
|
|
|
Contains: Implementation of object defined in .h
|
|
|
|
|
|
|
|
*/
|
|
|
|
#include "QTSSMessages.h"
|
|
#include "OSMemory.h"
|
|
|
|
// see QTSS.h (QTSS_TextMessagesObject) for list of enums to map these strings
|
|
|
|
char* QTSSMessages::sMessagesKeyStrings[] =
|
|
{ /* index */
|
|
/* 0 */ "qtssMsgNoMessage",
|
|
/* 1 */ "qtssMsgNoURLInRequest",
|
|
/* 2 */ "qtssMsgBadRTSPMethod",
|
|
/* 3 */ "qtssMsgNoRTSPVersion",
|
|
/* 4 */ "qtssMsgNoRTSPInURL",
|
|
/* 5 */ "qtssMsgURLTooLong",
|
|
/* 6 */ "qtssMsgURLInBadFormat",
|
|
/* 7 */ "qtssMsgNoColonAfterHeader",
|
|
/* 8 */ "qtssMsgNoEOLAfterHeader",
|
|
/* 9 */ "qtssMsgRequestTooLong",
|
|
/* 10*/ "qtssMsgNoModuleFolder",
|
|
/* 11*/ "qtssMsgCouldntListen",
|
|
/* 12*/ "qtssMsgInitFailed",
|
|
/* 13*/ "qtssMsgNotConfiguredForIP",
|
|
/* 14*/ "qtssMsgDefaultRTSPAddrUnavail",
|
|
/* 15*/ "qtssMsgBadModule",
|
|
/* 16*/ "qtssMsgRegFailed",
|
|
/* 17*/ "qtssMsgRefusingConnections",
|
|
/* 18*/ "qtssMsgTooManyClients",
|
|
/* 19*/ "qtssMsgTooMuchThruput",
|
|
/* 20*/ "qtssMsgNoSessionID",
|
|
/* 21*/ "qtssMsgFileNameTooLong",
|
|
/* 22*/ "qtssMsgNoClientPortInTransport",
|
|
/* 23*/ "qtssMsgRTPPortMustBeEven",
|
|
/* 24*/ "qtssMsgRTCPPortMustBeOneBigger",
|
|
/* 25*/ "qtssMsgOutOfPorts",
|
|
/* 26*/ "qtssMsgNoModuleForRequest",
|
|
/* 27*/ "qtssMsgAltDestNotAllowed",
|
|
/* 28*/ "qtssMsgCantSetupMulticast",
|
|
/* 29*/ "qtssListenPortInUse",
|
|
/* 30*/ "qtssListenPortAccessDenied",
|
|
/* 31*/ "qtssListenPortError",
|
|
/* 32*/ "qtssMsgBadBase64",
|
|
/* 33*/ "qtssMsgSomePortsFailed",
|
|
/* 34*/ "qtssMsgNoPortsSucceeded",
|
|
/* 35*/ "qtssMsgCannotCreatePidFile",
|
|
/* 36*/ "qtssMsgCannotSetRunUser",
|
|
/* 37*/ "qtssMsgCannotSetRunGroup",
|
|
/* 38*/ "qtssMsgNoSesIDOnDescribe",
|
|
/* 39*/ "qtssServerPrefMissing",
|
|
/* 40*/ "qtssServerPrefWrongType",
|
|
/* 41*/ "qtssMsgCantWriteFile",
|
|
/* 42*/ "qtssMsgSockBufSizesTooLarge",
|
|
/* 43*/ "qtssMsgBadFormat",
|
|
|
|
// module specific messages follow (these are dynamically numbered)
|
|
|
|
/* 44*/ "QTSSvrControlModuleCantRegisterMachPort",
|
|
/* 45*/ "QTSSvrControlModuleServerControlFatalErr",
|
|
/* 46*/ "QTSSReflectorModuleCantBindReflectorSocket",
|
|
/* 47*/ "QTSSReflectorModuleCantJoinMulticastGroup",
|
|
/* 48*/ "QTSSFileModuleSeekToNonExistentTime",
|
|
/* 49*/ "QTSSFileModuleNoSDPFileFound",
|
|
/* 50*/ "QTSSFileModuleBadQTFile",
|
|
/* 51*/ "QTSSFileModuleFileIsNotHinted",
|
|
/* 52*/ "QTSSFileModuleExpectedDigitFilename",
|
|
/* 53*/ "QTSSFileModuleTrackDoesntExist",
|
|
/* 54*/ "QTSSReflectorModuleExpectedDigitFilename",
|
|
/* 55*/ "QTSSSpamDefenseModuleTooManyConnections",
|
|
/* 56*/ "QTSSReflectorModuleBadTrackID",
|
|
/* 57*/ "QTSSAccessModuleBadAccessFileName",
|
|
/* 58*/ "QTSSReflectorModuleNoRelaySources",
|
|
/* 59*/ "QTSSReflectorModuleNoRelayDests",
|
|
/* 60*/ "QTSSReflectorModuleNoRelayStreams",
|
|
/* 61*/ "QTSSReflectorModuleNoRelayConfig",
|
|
/* 62*/ "QTSSReflectorModuleDuplicateBroadcastStream",
|
|
/* 63*/ "QTSSAccessModuleUsersFileNotFound",
|
|
/* 64*/ "QTSSAccessModuleGroupsFileNotFound",
|
|
/* 65*/ "QTSSAccessModuleBadUsersFile",
|
|
/* 66*/ "QTSSAccessModuleBadGroupsFile",
|
|
/* 67*/ "QTSSReflectorModuleAnnounceRequiresSDPSuffix",
|
|
/* 68*/ "QTSSReflectorModuleAnnounceDisabled",
|
|
/* 69*/ "QTSSReflectorModuleSDPPortMinimumPort",
|
|
/* 70*/ "QTSSReflectorModuleSDPPortMaximumPort",
|
|
/* 71*/ "QTSSReflectorModuleStaticPortsConflict",
|
|
/* 72*/ "QTSSReflectorModuleStaticPortPrefsBadRange",
|
|
/* 73*/ "QTSSRelayModulePrefParseError"
|
|
};
|
|
|
|
// see QTSS.h (QTSS_TextMessagesObject) for list of enums to map these strings
|
|
|
|
char* QTSSMessages::sMessages[] =
|
|
{
|
|
/* 0 */ "%s%s",
|
|
/* 1 */ "There was no URL contained in the following request: %s",
|
|
/* 2 */ "The following RTSP method: %s, was not understood by the server",
|
|
/* 3 */ "There is no RTSP version in the following request: %s",
|
|
/* 4 */ "Server expected 'rtsp://' and instead received: %s",
|
|
/* 5 */ "The following URL is too long to be processed by the server: %s",
|
|
/* 6 */ "The following URL is not in proper URL format: %s",
|
|
/* 7 */ "There was no colon after a header in the following request: %s",
|
|
/* 8 */ "There was no EOL after a header in the following request: %s",
|
|
/* 9 */ "That request is too long to be processed by the server.",
|
|
/* 10*/ "No module folder exists.",
|
|
/* 11*/ "Streaming Server couldn't listen on a specified RTSP port. Quitting.",
|
|
/* 12*/ "The module %s failed to Initialize.",
|
|
/* 13*/ "This machine is currently not configured for IP.",
|
|
/* 14*/ "The specified RTSP listening IP address doesn't exist.",
|
|
/* 15*/ "The module %s is not a compatible QTSS API module.",
|
|
/* 16*/ "The module %s failed to Register.",
|
|
/* 17*/ "Streaming Server is currently refusing new connections",
|
|
/* 18*/ "Too many clients connected",
|
|
/* 19*/ "Too much bandwidth being served",
|
|
/* 20*/ "No active RTP session for that RTSP session ID",
|
|
/* 21*/ "Specified file name is too long to be handled by the server.",
|
|
/* 22*/ "No client port pair found in transport header",
|
|
/* 23*/ "Reported client RTP port is not an even number",
|
|
/* 24*/ "Reported client RTCP port is not one greater than RTP port",
|
|
/* 25*/ "Streaming Server couldn't find any available UDP ports",
|
|
/* 26*/ "There is no QTSS API module installed to process this request.",
|
|
/* 27*/ "Not allowed to specify an alternate destination address",
|
|
/* 28*/ "Can't setup multicast.",
|
|
/* 29*/ "Another process is already using the following RTSP port: %s",
|
|
/* 30*/ "You must be root to use the following RTSP port: %s",
|
|
/* 31*/ "An error occurred when attempting to listen on the following RTSP port: %s",
|
|
/* 32*/ "The base64 you just sent to the server is corrupt!",
|
|
/* 33*/ "Streaming Server failed to listen on all requested RTSP port(s).",
|
|
/* 34*/ "Streaming Server is not listening for RTSP on any ports.",
|
|
/* 35*/ "Error creating pid file %s: %s",
|
|
/* 36*/ "Error switching to user %s: %s",
|
|
/* 37*/ "Error switching to group %s: %s",
|
|
/* 38*/ "A DESCRIBE request cannot contain the Session header",
|
|
/* 39*/ "The following pref, %s, wasn't found. Using a default value of: %s",
|
|
/* 40*/ "The following pref, %s, has the wrong type. Using a default value of: %s",
|
|
/* 41*/ "Couldn't re-write server prefs file",
|
|
/* 42*/ "Couldn't set desired UDP receive socket buffer size. Using size of %s K",
|
|
/* 43*/ "The request is incorrectly formatted.",
|
|
|
|
// module specific messages follow (these are dynamically numbered)
|
|
|
|
/* 44*/ "Fatal error: Can't register Mach Ports.",
|
|
/* 45*/ "A fatal error occcured while starting up server control module",
|
|
/* 46*/ "Can't bind reflector sockets",
|
|
/* 47*/ "Reflector sockets couldn't join multicast",
|
|
/* 48*/ "Couldn't seek to specified time.",
|
|
/* 49*/ "No SDP file found for the following URL: %s",
|
|
/* 50*/ "The requested file is not a movie file.",
|
|
/* 51*/ "Requested movie hasn't been hinted.",
|
|
/* 52*/ "Expected a digit at the end of the following URL: %s",
|
|
/* 53*/ "Specified trackID doesn't exist in the movie",
|
|
/* 54*/ "Expected a digit at the end of the following URL: %s",
|
|
/* 55*/ "Too many connections from your IP address!",
|
|
/* 56*/ "TrackID doesn't match any trackID for this ReflectorSession",
|
|
/* 57*/ "Invalid config value for qtaccessfilename: name contains %s. Now using default name:%s",
|
|
/* 58*/ "The relay configuration file at: %s has no relay_source lines",
|
|
/* 59*/ "Could not find any relay_destination lines for one of the relay_source lines of the relay configuration file",
|
|
/* 60*/ "Could not find any input stream information for one of the relay_source lines of the relay configuration file",
|
|
/* 61*/ "Found an empty relay configuration file at %s",
|
|
/* 62*/ "A broadcast stream is already setup for this URL",
|
|
/* 63*/ "No users file found at %s.",
|
|
/* 64*/ "No groups file found at %s.",
|
|
/* 65*/ "Unable to read the users file at %s. It may be corrupted.",
|
|
/* 66*/ "Unable to read the groups file at %s. It may be corrupted.",
|
|
/* 67*/ "The Announced file does not end with .sdp",
|
|
/* 68*/ "The Announce feature is disabled. Your request is denied.",
|
|
/* 69*/ "The SDP file's static port %s is less than the QTSSReflectorModule's minimum_static_sdp_port preference.",
|
|
/* 70*/ "The SDP file's static port %s is greater than the QTSSReflectorModule's maximum_static_sdp_port preference.",
|
|
/* 71*/ "The QTSSReflectorModule's minimum_static_sdp_port and maximum_static_sdp_port preferences conflict with the client and dynamic broadcast port range= %s to %s.",
|
|
/* 72*/ "The QTSSReflectorModule's minimum_static_sdp_port and maximum_static_sdp_port preferences define an invalid range (min=%s > max=%s).",
|
|
/* 73*/ "The QTSSRelayModule encountered an error while parsing the relay config file. No relays setup in relayconfig.xml."
|
|
};
|
|
|
|
// need to maintain numbers to update kNumMessages in QTSSMessages.h.
|
|
|
|
void QTSSMessages::Initialize()
|
|
{
|
|
QTSSDictionaryMap* theMap = QTSSDictionaryMap::GetMap(QTSSDictionaryMap::kTextMessagesDictIndex);
|
|
Assert(theMap != NULL);
|
|
|
|
for (UInt32 x = 0; x < qtssMsgNumParams; x++)
|
|
theMap->SetAttribute(x, sMessagesKeyStrings[x], NULL, qtssAttrDataTypeCharArray, qtssAttrModeRead | qtssAttrModePreempSafe);
|
|
}
|
|
|
|
QTSSMessages::QTSSMessages(PrefsSource* inMessages)
|
|
: QTSSDictionary(QTSSDictionaryMap::GetMap(QTSSDictionaryMap::kTextMessagesDictIndex))
|
|
{
|
|
static const UInt32 kMaxMessageSize = 2048;
|
|
char theMessage[kMaxMessageSize];
|
|
|
|
// Use the names of the attributes in the attribute map as the key values for
|
|
// finding preferences in the config file.
|
|
|
|
for (UInt32 x = 0; x < this->GetDictionaryMap()->GetNumAttrs(); x++)
|
|
{
|
|
theMessage[0] = '\0';
|
|
(void)inMessages->GetValue(this->GetDictionaryMap()->GetAttrName(x), &theMessage[0]);
|
|
|
|
if (theMessage[0] == '\0')
|
|
{
|
|
// If a message doesn't exist in the file, check to see if this attribute
|
|
// name matches one of the compiled-in strings. If so, use that instead
|
|
for (UInt32 y = 0; y < kNumMessages; y++)
|
|
{
|
|
if (::strcmp(this->GetDictionaryMap()->GetAttrName(x), sMessagesKeyStrings[y]) == 0)
|
|
{
|
|
::strcpy(theMessage, sMessages[y]);
|
|
break;
|
|
}
|
|
}
|
|
// If we didn't find a match, just copy in this last-resort message
|
|
if (theMessage[0] == '\0')
|
|
::strcpy(theMessage, "No Message");
|
|
}
|
|
|
|
// Add this preference into the dictionary.
|
|
|
|
// If there is a message, allocate some new memory for
|
|
// the new attribute, and copy the data into the newly allocated buffer
|
|
if (theMessage[0] != '\0')
|
|
{
|
|
char* attrBuffer = NEW char[::strlen(theMessage) + 2];
|
|
::strcpy(attrBuffer, theMessage);
|
|
this->SetVal(this->GetDictionaryMap()->GetAttrID(x), attrBuffer, ::strlen(attrBuffer));
|
|
}
|
|
}
|
|
}
|