mirror of
https://bitbucket.org/theswgsource/src-1.2.git
synced 2026-07-15 00:08:07 -04:00
302 lines
11 KiB
C++
Executable File
302 lines
11 KiB
C++
Executable File
//========================================================================
|
|
//
|
|
// ScriptMethodsClusterWideData.cpp - implements script methods dealing
|
|
// with cluster wide data management
|
|
//
|
|
// copyright 2001 Sony Online Entertainment
|
|
//
|
|
//========================================================================
|
|
|
|
#include "serverScript/FirstServerScript.h"
|
|
#include "serverScript/JavaLibrary.h"
|
|
|
|
#include "serverGame/ClusterWideDataClient.h"
|
|
#include "sharedUtility/ValueDictionary.h"
|
|
#include "sharedUtility/ValueTypeBool.h"
|
|
#include "sharedUtility/ValueTypeFloat.h"
|
|
#include "sharedUtility/ValueTypeObjId.h"
|
|
#include "sharedUtility/ValueTypeSignedInt.h"
|
|
#include "sharedUtility/ValueTypeString.h"
|
|
|
|
using namespace JNIWrappersNamespace;
|
|
|
|
|
|
// ======================================================================
|
|
// ScriptMethodsClusterWideDataNamespace
|
|
// ======================================================================
|
|
|
|
namespace ScriptMethodsClusterWideDataNamespace
|
|
{
|
|
bool install();
|
|
|
|
jint JNICALL getClusterWideData(JNIEnv *env, jobject self, jstring managerName, jstring elementNameRegex, jboolean lockElements, jlong callbackObject);
|
|
void JNICALL releaseClusterWideDataLock(JNIEnv *env, jobject self, jstring managerName, jint lockKey);
|
|
void JNICALL removeClusterWideData(JNIEnv *env, jobject self, jstring managerName, jstring elementNameRegex, jint lockKey);
|
|
void JNICALL updateClusterWideData(JNIEnv *env, jobject self, jstring managerName, jstring elementNameRegex, jobject data, jint lockKey);
|
|
void JNICALL replaceClusterWideData(JNIEnv *env, jobject self, jstring managerName, jstring elementNameRegex, jobject data, jboolean autoRemove, jint lockKey);
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
// install
|
|
//========================================================================
|
|
|
|
bool ScriptMethodsClusterWideDataNamespace::install()
|
|
{
|
|
const JNINativeMethod NATIVES[] = {
|
|
#define JF(a,b,c) {a,b,(void*)(ScriptMethodsClusterWideDataNamespace::c)}
|
|
JF("_getClusterWideData", "(Ljava/lang/String;Ljava/lang/String;ZJ)I", getClusterWideData),
|
|
JF("releaseClusterWideDataLock", "(Ljava/lang/String;I)V", releaseClusterWideDataLock),
|
|
JF("removeClusterWideData", "(Ljava/lang/String;Ljava/lang/String;I)V", removeClusterWideData),
|
|
JF("updateClusterWideData", "(Ljava/lang/String;Ljava/lang/String;Lscript/dictionary;I)V", updateClusterWideData),
|
|
JF("replaceClusterWideData", "(Ljava/lang/String;Ljava/lang/String;Lscript/dictionary;ZI)V", replaceClusterWideData),
|
|
};
|
|
|
|
return JavaLibrary::registerNatives(NATIVES, sizeof(NATIVES)/sizeof(NATIVES[0]));
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
// class JavaLibrary JNI conversion methods
|
|
//========================================================================
|
|
|
|
/**
|
|
* Converts a C++ ValueDictionary to a Java dictionary
|
|
*
|
|
* @param source the ValueDictionary to convert
|
|
*
|
|
* @return a new dictionary object
|
|
*/
|
|
LocalRefPtr JavaLibrary::convert(const ValueDictionary & source)
|
|
{
|
|
if (ms_env == nullptr)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
// create the dictionary
|
|
LocalRefPtr target = createNewObject(ms_clsDictionary, ms_midDictionary);
|
|
if (target == LocalRef::cms_nullPtr)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
for (DictionaryValueMap::const_iterator iter = source.get().begin(); iter != source.get().end(); ++iter)
|
|
{
|
|
JavaString paramName(iter->first.c_str());
|
|
|
|
if (iter->second->getType() == ValueTypeBool::ms_type)
|
|
{
|
|
const ValueTypeBool * value = static_cast<const ValueTypeBool *>(iter->second);
|
|
|
|
callObjectMethod(*target,
|
|
ms_midDictionaryPutBool, paramName.getValue(),
|
|
value->getValue());
|
|
}
|
|
else if (iter->second->getType() == ValueTypeFloat::ms_type)
|
|
{
|
|
const ValueTypeFloat * value = static_cast<const ValueTypeFloat *>(iter->second);
|
|
|
|
callObjectMethod(*target,
|
|
ms_midDictionaryPutFloat, paramName.getValue(),
|
|
value->getValue());
|
|
}
|
|
else if (iter->second->getType() == ValueTypeObjId::ms_type)
|
|
{
|
|
const ValueTypeObjId * value = static_cast<const ValueTypeObjId *>(iter->second);
|
|
|
|
LocalRefPtr arg = getObjId(value->getValue());
|
|
if (arg == LocalRef::cms_nullPtr)
|
|
return LocalRef::cms_nullPtr;
|
|
|
|
callObjectMethod(*target,
|
|
ms_midDictionaryPut, paramName.getValue(), arg->getValue());
|
|
}
|
|
else if (iter->second->getType() == ValueTypeSignedInt::ms_type)
|
|
{
|
|
const ValueTypeSignedInt * value = static_cast<const ValueTypeSignedInt *>(iter->second);
|
|
|
|
callObjectMethod(*target,
|
|
ms_midDictionaryPutInt, paramName.getValue(),
|
|
value->getValue());
|
|
|
|
}
|
|
else if (iter->second->getType() == ValueTypeString::ms_type)
|
|
{
|
|
const ValueTypeString * value = static_cast<const ValueTypeString *>(iter->second);
|
|
|
|
JavaString jvString(value->getValue().c_str());
|
|
callObjectMethod(*target,
|
|
ms_midDictionaryPut, paramName.getValue(), jvString.getValue());
|
|
}
|
|
else
|
|
{
|
|
DEBUG_REPORT_LOG(true, ("Unknown/unhandled data type "
|
|
"(%s) while parsing ValueDictionary\n", iter->second->getType().c_str()));
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
}
|
|
|
|
return target;
|
|
} // JavaLibrary::convert(const ValueDictionary &)
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Converts a Java dictionary to a C++ ValueDictionary
|
|
*
|
|
* @param source the ValueDictionary to convert
|
|
*
|
|
* @return a new dictionary object
|
|
*/
|
|
void JavaLibrary::convert(const jobject & source, ValueDictionary & target)
|
|
{
|
|
target.clear();
|
|
|
|
JNIEnv * env = getEnv();
|
|
if (env == nullptr)
|
|
return;
|
|
|
|
if (!env->IsInstanceOf(source, ms_clsDictionary))
|
|
{
|
|
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::convert from dictionary to ValueDictionary has a bad dictionary"));
|
|
return;
|
|
}
|
|
|
|
// get the list of keys in the dictionary
|
|
LocalRefPtr keyEnumeration = callObjectMethod(LocalRefParam(source), ms_midDictionaryKeys);
|
|
|
|
while (callBooleanMethod(*keyEnumeration, ms_midEnumerationHasMoreElements))
|
|
{
|
|
LocalRefPtr key = callObjectMethod(*keyEnumeration, ms_midEnumerationNextElement);
|
|
|
|
if (!isInstanceOf(*key, ms_clsString))
|
|
{
|
|
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::convert from dictionary to ValueDictionary has a bad key"));
|
|
return;
|
|
}
|
|
|
|
JavaStringParam localKeyStr(*key);
|
|
std::string keyStr;
|
|
IGNORE_RETURN(convert(localKeyStr, keyStr));
|
|
|
|
// convert the value into a C++ ValueType object
|
|
LocalRefPtr value = callObjectMethod(LocalRefParam(source), ms_midDictionaryGet, key->getValue());
|
|
|
|
if (isInstanceOf(*value, ms_clsBoolean))
|
|
{
|
|
jboolean booleanValue = callBooleanMethod(*value, ms_midBooleanBooleanValue);
|
|
target.insert(keyStr, ValueTypeBool(booleanValue ? true : false));
|
|
}
|
|
else if (isInstanceOf(*value, ms_clsFloat))
|
|
{
|
|
jfloat floatValue = callFloatMethod(*value, ms_midFloatFloatValue);
|
|
target.insert(keyStr, ValueTypeFloat(static_cast<float>(floatValue)));
|
|
}
|
|
else if (isInstanceOf(*value, ms_clsObjId))
|
|
{
|
|
NetworkId networkId(getNetworkId(*value));
|
|
target.insert(keyStr, ValueTypeObjId(networkId));
|
|
}
|
|
else if (isInstanceOf(*value, ms_clsInteger))
|
|
{
|
|
jint intValue = callIntMethod(*value, ms_midIntegerIntValue);
|
|
target.insert(keyStr, ValueTypeSignedInt(static_cast<signed int>(intValue)));
|
|
}
|
|
else if (isInstanceOf(*value, ms_clsString))
|
|
{
|
|
JavaStringParam localValueStr(*value);
|
|
std::string valueStr;
|
|
IGNORE_RETURN(convert(localValueStr, valueStr));
|
|
|
|
target.insert(keyStr, ValueTypeString(valueStr));
|
|
}
|
|
else
|
|
{
|
|
JAVA_THROW_SCRIPT_EXCEPTION(true, ("JavaLibrary::convert from dictionary to ValueDictionary - key (%s) is an unsupported type", keyStr.c_str()));
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
jint JNICALL ScriptMethodsClusterWideDataNamespace::getClusterWideData(JNIEnv *, jobject, jstring managerName, jstring elementNameRegex, jboolean lockElements, jlong callbackObject)
|
|
{
|
|
JavaStringParam localJstringManagerName(managerName);
|
|
std::string localManagerName;
|
|
IGNORE_RETURN(JavaLibrary::convert(localJstringManagerName, localManagerName));
|
|
|
|
JavaStringParam localJstringElementNameRegex(elementNameRegex);
|
|
std::string localElementNameRegex;
|
|
IGNORE_RETURN(JavaLibrary::convert(localJstringElementNameRegex, localElementNameRegex));
|
|
|
|
return static_cast<int>(ClusterWideDataClient::getClusterWideData(localManagerName, localElementNameRegex, (lockElements == JNI_TRUE), NetworkId(callbackObject)));
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
void JNICALL ScriptMethodsClusterWideDataNamespace::releaseClusterWideDataLock(JNIEnv *, jobject, jstring managerName, jint lockKey)
|
|
{
|
|
JavaStringParam localJstringManagerName(managerName);
|
|
std::string localManagerName;
|
|
IGNORE_RETURN(JavaLibrary::convert(localJstringManagerName, localManagerName));
|
|
|
|
ClusterWideDataClient::releaseClusterWideDataLock(localManagerName, static_cast<unsigned long>(lockKey));
|
|
|
|
return;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
void JNICALL ScriptMethodsClusterWideDataNamespace::removeClusterWideData(JNIEnv *, jobject, jstring managerName, jstring elementNameRegex, jint lockKey)
|
|
{
|
|
JavaStringParam localJstringManagerName(managerName);
|
|
std::string localManagerName;
|
|
IGNORE_RETURN(JavaLibrary::convert(localJstringManagerName, localManagerName));
|
|
|
|
JavaStringParam localJstringElementNameRegex(elementNameRegex);
|
|
std::string localElementNameRegex;
|
|
IGNORE_RETURN(JavaLibrary::convert(localJstringElementNameRegex, localElementNameRegex));
|
|
|
|
ClusterWideDataClient::removeClusterWideData(localManagerName, localElementNameRegex, static_cast<unsigned long>(lockKey));
|
|
|
|
return;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
void JNICALL ScriptMethodsClusterWideDataNamespace::updateClusterWideData(JNIEnv *, jobject, jstring managerName, jstring elementNameRegex, jobject data, jint lockKey)
|
|
{
|
|
JavaStringParam localJstringManagerName(managerName);
|
|
std::string localManagerName;
|
|
IGNORE_RETURN(JavaLibrary::convert(localJstringManagerName, localManagerName));
|
|
|
|
JavaStringParam localJstringElementNameRegex(elementNameRegex);
|
|
std::string localElementNameRegex;
|
|
IGNORE_RETURN(JavaLibrary::convert(localJstringElementNameRegex, localElementNameRegex));
|
|
|
|
ValueDictionary valueDictionary;
|
|
JavaLibrary::convert(data, valueDictionary);
|
|
|
|
ClusterWideDataClient::updateClusterWideData(localManagerName, localElementNameRegex, valueDictionary, static_cast<unsigned long>(lockKey));
|
|
|
|
return;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------------------
|
|
|
|
void JNICALL ScriptMethodsClusterWideDataNamespace::replaceClusterWideData(JNIEnv *, jobject, jstring managerName, jstring elementNameRegex, jobject data, jboolean autoRemove, jint lockKey)
|
|
{
|
|
JavaStringParam localJstringManagerName(managerName);
|
|
std::string localManagerName;
|
|
IGNORE_RETURN(JavaLibrary::convert(localJstringManagerName, localManagerName));
|
|
|
|
JavaStringParam localJstringElementNameRegex(elementNameRegex);
|
|
std::string localElementNameRegex;
|
|
IGNORE_RETURN(JavaLibrary::convert(localJstringElementNameRegex, localElementNameRegex));
|
|
|
|
ValueDictionary valueDictionary;
|
|
JavaLibrary::convert(data, valueDictionary);
|
|
|
|
ClusterWideDataClient::replaceClusterWideData(localManagerName, localElementNameRegex, valueDictionary, (autoRemove == JNI_TRUE), static_cast<unsigned long>(lockKey));
|
|
|
|
return;
|
|
}
|