diff --git a/core/smn_keyvalues.cpp b/core/smn_keyvalues.cpp index 8d018820a..c6b968779 100644 --- a/core/smn_keyvalues.cpp +++ b/core/smn_keyvalues.cpp @@ -751,6 +751,36 @@ static cell_t smn_KvGetDataType(IPluginContext *pCtx, const cell_t *params) return pStk->pCurRoot.front()->GetDataType(name); } +staitc cell_t smn_KeyValuesExport(IPluginContext *pCtx, const cell_t *params) +{ + Handle_t hndl = static_cast(params[1]); + HandleError herr; + HandleSecurity sec; + KeyValueStack *pStk; + char *name; + + 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); + } + pCtx->LocalToString(params[2], &name); + + KeyValues *pNewKV = new KeyValues(name[0] == '\0' ? NULL : name); + + *pNewKV = *pStk->pCurRoot; // 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 +1271,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 7e38ad106..58f3b886d 100644 --- a/plugins/include/keyvalues.inc +++ b/plugins/include/keyvalues.inc @@ -62,6 +62,14 @@ 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. + // + // @param name Name of the root section where the export is placed. + // If NULL_STIRNG, export without a root section. + // @return A Handle to a new KeyValues structure. + public native KeyValues Export(const char[] name = NULL_STRING); + // Exports a KeyValues tree to a file. The tree is dumped from the current position. // // @param file File to dump write to.