summaryrefslogtreecommitdiffstats
path: root/xbmc/interfaces/json-rpc/TextureOperations.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/interfaces/json-rpc/TextureOperations.cpp')
-rw-r--r--xbmc/interfaces/json-rpc/TextureOperations.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/xbmc/interfaces/json-rpc/TextureOperations.cpp b/xbmc/interfaces/json-rpc/TextureOperations.cpp
new file mode 100644
index 0000000..326093b
--- /dev/null
+++ b/xbmc/interfaces/json-rpc/TextureOperations.cpp
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2013-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "TextureOperations.h"
+
+#include "FileItem.h"
+#include "ServiceBroker.h"
+#include "TextureCache.h"
+#include "TextureDatabase.h"
+#include "utils/Variant.h"
+
+using namespace JSONRPC;
+
+JSONRPC_STATUS CTextureOperations::GetTextures(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
+{
+ CFileItemList listItems;
+
+ CTextureDatabase db;
+ if (!db.Open())
+ return InternalError;
+
+ CDatabase::Filter dbFilter;
+ const CVariant &filter = parameterObject["filter"];
+ if (filter.isObject())
+ {
+ CVariant xspObj(CVariant::VariantTypeObject);
+
+ if (filter.isMember("field"))
+ {
+ xspObj["and"] = CVariant(CVariant::VariantTypeArray);
+ xspObj["and"].push_back(filter);
+ }
+ else
+ xspObj = filter;
+
+ // decipher the rules
+ CDatabaseQueryRuleCombination rule;
+ if (!rule.Load(xspObj, &db))
+ return InvalidParams;
+
+ dbFilter.AppendWhere(rule.GetWhereClause(db, ""));
+ }
+
+ // fetch textures from the database
+ CVariant items = CVariant(CVariant::VariantTypeArray);
+ if (!db.GetTextures(items, dbFilter))
+ return InternalError;
+
+ // return only what was asked for, plus textureid
+ CVariant prop = parameterObject["properties"];
+ prop.push_back("textureid");
+ if (!items.empty() && prop.isArray())
+ {
+ std::set<std::string> fields;
+ CVariant &item = items[0];
+ for (CVariant::const_iterator_map field = item.begin_map(); field != item.end_map(); ++field)
+ {
+ if (std::find(prop.begin_array(), prop.end_array(), field->first) == prop.end_array())
+ fields.insert(field->first);
+ }
+ // erase these fields
+ for (CVariant::iterator_array item = items.begin_array(); item != items.end_array(); ++item)
+ {
+ for (const auto& i : fields)
+ item->erase(i);
+ }
+ if (fields.find("url") == fields.end())
+ {
+ // wrap cached url to something retrieval from Files.GetFiles()
+ for (CVariant::iterator_array item = items.begin_array(); item != items.end_array(); ++item)
+ {
+ CVariant &cachedUrl = (*item)["url"];
+ cachedUrl = CTextureUtils::GetWrappedImageURL(cachedUrl.asString());
+ }
+ }
+ }
+
+ result["textures"] = items;
+ return OK;
+}
+
+JSONRPC_STATUS CTextureOperations::RemoveTexture(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
+{
+ int id = (int)parameterObject["textureid"].asInteger();
+
+ if (!CServiceBroker::GetTextureCache()->ClearCachedImage(id))
+ return InvalidParams;
+
+ return ACK;
+}