panda3d/panda/src/express/config_express.cxx
2006-08-04 14:43:31 +00:00

242 lines
8.7 KiB
C++

// Filename: config_express.cxx
// Created by: drose (28Mar06)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
//
// All use of this software is subject to the terms of the Panda 3d
// Software license. You should have received a copy of this license
// along with this source code; you will also find a current copy of
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
//
// To contact the maintainers of this program write to
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////
#include "config_express.h"
#include "datagram.h"
#include "nodeReferenceCount.h"
#include "referenceCount.h"
#include "textEncoder.h"
#include "typedObject.h"
#include "typedReferenceCount.h"
#include "virtualFile.h"
#include "virtualFileComposite.h"
#include "virtualFileMount.h"
#include "virtualFileMountMultifile.h"
#include "virtualFileMountSystem.h"
#include "virtualFileSimple.h"
#include "pandaSystem.h"
#include "numeric_types.h"
#include "dconfig.h"
ConfigureDef(config_express);
NotifyCategoryDef(express, "");
ConfigureFn(config_express) {
init_libexpress();
}
ConfigVariableInt patchfile_window_size
("patchfile-window-size", 16);
ConfigVariableInt patchfile_increment_size
("patchfile-increment-size", 8);
ConfigVariableInt patchfile_buffer_size
("patchfile-buffer-size", 4096);
ConfigVariableInt patchfile_zone_size
("patchfile-zone-size", 10000);
ConfigVariableBool keep_temporary_files
("keep-temporary-files", false,
PRC_DESC("Set this true to keep around the temporary files from "
"downloading, decompressing, and patching, or false (the "
"default) to delete these. Mainly useful for debugging "
"when the process goes wrong."));
ConfigVariableString encryption_algorithm
("encryption-algorithm", "bf-cbc",
PRC_DESC("This defines the OpenSSL encryption algorithm which is used to "
"encrypt any streams created by the current runtime. The default is "
"Blowfish; the complete set of available algorithms is defined by "
"the current version of OpenSSL. This value is used only to control "
"encryption; the correct algorithm will automatically be selected on "
"decryption."));
ConfigVariableInt encryption_key_length
("encryption-key-length", 0,
PRC_DESC("This defines the key length, in bits, for the selected encryption "
"algorithm. Some algorithms have a variable key length. Specifying "
"a value of 0 here means to use the default key length for the "
"algorithm as defined by OpenSSL. This value is used only to "
"control encryption; the correct key length will automatically be "
"selected on decryption."));
ConfigVariableInt encryption_iteration_count
("encryption-iteration-count", 100000,
PRC_DESC("This defines the number of times a password is hashed to generate a "
"key when encrypting. Its purpose is to make it computationally "
"more expensive for an attacker to search the key space "
"exhaustively. This should be a multiple of 1,000 and should not "
"exceed about 65 million; the value 0 indicates just one application "
"of the hashing algorithm. This value is used only to control "
"encryption; the correct count will automatically be selected on "
"decryption."));
ConfigVariableInt multifile_encryption_iteration_count
("multifile-encryption-iteration-count", 0,
PRC_DESC("This is a special value of encryption-iteration-count used to encrypt "
"subfiles within a multifile. It has a default value of 0 (just one "
"application), on the assumption that the files from a multifile must "
"be loaded quickly, without paying the cost of an expensive hash on "
"each subfile in order to decrypt it."));
ConfigVariableBool vfs_case_sensitive
("vfs-case-sensitive", true,
PRC_DESC("Set this true to make the VirtualFileSystem present the native "
"OS-provided filesystem as if it were a case-sensitive file "
"system, even if it is not (e.g. on Windows). This variable "
"has no effect if the native filesystem is already case-sensitive, "
"and it has no effect on mounted multifile systems, which are "
"always case-sensitive."));
ConfigVariableBool vfs_implicit_pz
("vfs-implicit-pz", true,
PRC_DESC("When this is true, the VirtualFileSystem will pretend a named "
"file exists even if it doesn't, as long as a filename with the "
"same name and the additional extension .pz does exist. In this "
"case, the VirtualFileSystem will implicitly open the .pz file "
"and decompress it on-the-fly."));
ConfigVariableBool use_vfs
("use-vfs", true,
PRC_DESC("Set this true to use the VirtualFileSystem mechanism for loading "
"models, etc. Since the VirtualFileSystem is now the de facto "
"filesystem for Panda, you should always keep this true, since "
"there is now code that assumes it to be true. This variable "
"is now deprecated."));
ConfigVariableBool collect_tcp
("collect-tcp", false,
PRC_DESC("Set this true to enable accumulation of several small consecutive "
"TCP datagrams into one large datagram before sending it, to reduce "
"overhead from the TCP/IP protocol. See "
"Connection::set_collect_tcp() or SocketStream::set_collect_tcp()."));
ConfigVariableDouble collect_tcp_interval
("collect-tcp-interval", 0.2);
////////////////////////////////////////////////////////////////////
// Function: init_libexpress
// Description: Initializes the library. This must be called at
// least once before any of the functions or classes in
// this library can be used. Normally it will be
// called by the static initializers and need not be
// called explicitly, but special cases exist.
////////////////////////////////////////////////////////////////////
void
init_libexpress() {
static bool initialized = false;
if (initialized) {
return;
}
initialized = true;
Datagram::init_type();
NodeReferenceCount::init_type();
ReferenceCount::init_type();
TextEncoder::init_type();
TypedObject::init_type();
TypedReferenceCount::init_type();
VirtualFile::init_type();
VirtualFileComposite::init_type();
VirtualFileMount::init_type();
VirtualFileMountMultifile::init_type();
VirtualFileMountSystem::init_type();
VirtualFileSimple::init_type();
init_system_type_handles();
#ifdef HAVE_ZLIB
{
PandaSystem *ps = PandaSystem::get_global_ptr();
ps->add_system("zlib");
}
#endif
// This is a fine place to ensure that the numeric types have been
// chosen correctly.
nassertv(sizeof(PN_int8) == 1 && sizeof(PN_uint8) == 1);
nassertv(sizeof(PN_int16) == 2 && sizeof(PN_uint16) == 2);
nassertv(sizeof(PN_int32) == 4 && sizeof(PN_uint32) == 4);
nassertv(sizeof(PN_int64) == 8 && sizeof(PN_uint64) == 8);
nassertv(sizeof(PN_float32) == 4);
nassertv(sizeof(PN_float64) == 8);
// Also, ensure that we have the right endianness.
PN_uint32 word;
memcpy(&word, "\1\2\3\4", 4);
#ifdef WORDS_BIGENDIAN
nassertv(word == 0x01020304);
#else
nassertv(word == 0x04030201);
#endif
}
bool
get_use_high_res_clock() {
static ConfigVariableBool *use_high_res_clock = NULL;
if (use_high_res_clock == (ConfigVariableBool *)NULL) {
use_high_res_clock = new ConfigVariableBool
("use-high-res-clock", true,
PRC_DESC("Set this to false to avoid using the high-precision clock, even if "
"it is available."));
}
return *use_high_res_clock;
}
bool
get_paranoid_clock() {
static ConfigVariableBool *paranoid_clock = NULL;
if (paranoid_clock == (ConfigVariableBool *)NULL) {
paranoid_clock = new ConfigVariableBool
("paranoid-clock", false,
PRC_DESC("Set this to true to double-check the results of the high-resolution "
"clock against the system clock. This has no effect if NDEBUG is "
"defined."));
}
return *paranoid_clock;
}
bool
get_verify_dcast() {
static ConfigVariableBool *verify_dcast = NULL;
if (verify_dcast == (ConfigVariableBool *)NULL) {
verify_dcast = new ConfigVariableBool
("verify-dcast", true,
PRC_DESC("Set this to true to verify that every attempted DCAST operation in "
"fact references the correct type, or false otherwise. This has no "
"effect if NDEBUG is defined, in which case it is never tested."));
}
return *verify_dcast;
}
// Returns the configure object for accessing config variables from a
// scripting language.
ConfigExpress &
get_config_express() {
return config_express;
}