diff --git a/core/smn_keyvalues.cpp b/core/smn_keyvalues.cpp index 8d018820af..439e643b7e 100644 --- a/core/smn_keyvalues.cpp +++ b/core/smn_keyvalues.cpp @@ -751,6 +751,34 @@ static cell_t smn_KvGetDataType(IPluginContext *pCtx, const cell_t *params) return pStk->pCurRoot.front()->GetDataType(name); } +static cell_t smn_KeyValuesExport(IPluginContext *pCtx, const cell_t *params) +{ + Handle_t hndl = static_cast(params[1]); + HandleError herr; + HandleSecurity sec; + KeyValueStack *pStk; + + sec.pOwner = NULL; + sec.pIdentity = g_pCoreIdent; + + if ((herr=handlesys->ReadHandle(hndl, g_KeyValueType, &sec, (void **)&pStk)) + != HandleError_None) + { + return pCtx->ThrowNativeError("Invalid key value handle %x (error %d)", hndl, herr); + } + + KeyValues *pNewKV = new KeyValues(NULL /* Will be initialized in KeyValues::operator=() */ ); + + *pNewKV = *(pStk->pCurRoot.front()); // KeyValues::operator=() to recursive copy. + + KeyValueStack *pExportStk = new KeyValueStack; + + pExportStk->pBase = pNewKV; + pExportStk->pCurRoot.push(pNewKV); + + return handlesys->CreateHandle(g_KeyValueType, pExportStk, pCtx->GetIdentity(), g_pCoreIdent, NULL); +} + static cell_t smn_KeyValuesToFile(IPluginContext *pCtx, const cell_t *params) { Handle_t hndl = static_cast(params[1]); @@ -1241,6 +1269,7 @@ REGISTER_NATIVES(keyvaluenatives) {"KeyValues.Import", KeyValues_Import}, {"KeyValues.ImportFromFile", smn_FileToKeyValues}, {"KeyValues.ImportFromString", smn_StringToKeyValues}, + {"KeyValues.Export", smn_KeyValuesExport}, {"KeyValues.ExportToFile", smn_KeyValuesToFile}, {"KeyValues.ExportToString", smn_KeyValuesToString}, {"KeyValues.ExportLength.get", smn_KeyValuesExportLength}, diff --git a/plugins/include/keyvalues.inc b/plugins/include/keyvalues.inc index 7e38ad1069..d9f42dac75 100644 --- a/plugins/include/keyvalues.inc +++ b/plugins/include/keyvalues.inc @@ -62,6 +62,12 @@ methodmap KeyValues < Handle // @param firstValue If firstKey is non-empty, specifies the first key's value. public native KeyValues(const char[] name, const char[] firstKey="", const char[] firstValue=""); + // Exports a KeyValues tree to new descriptor. The tree is dumped from the current position. + // The Handle must be closed. + // + // @return A Handle to a new KeyValues structure. + public native KeyValues Export(); + // Exports a KeyValues tree to a file. The tree is dumped from the current position. // // @param file File to dump write to.