1 /*
2 * Copyright (C) 2013-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9 #include "TextureOperations.h"
10
11 #include "TextureCache.h"
12 #include "TextureDatabase.h"
13 #include "utils/Variant.h"
14
15 using namespace JSONRPC;
16
GetTextures(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)17 JSONRPC_STATUS CTextureOperations::GetTextures(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
18 {
19 CFileItemList listItems;
20
21 CTextureDatabase db;
22 if (!db.Open())
23 return InternalError;
24
25 CDatabase::Filter dbFilter;
26 const CVariant &filter = parameterObject["filter"];
27 if (filter.isObject())
28 {
29 CVariant xspObj(CVariant::VariantTypeObject);
30
31 if (filter.isMember("field"))
32 {
33 xspObj["and"] = CVariant(CVariant::VariantTypeArray);
34 xspObj["and"].push_back(filter);
35 }
36 else
37 xspObj = filter;
38
39 // decipher the rules
40 CDatabaseQueryRuleCombination rule;
41 if (!rule.Load(xspObj, &db))
42 return InvalidParams;
43
44 dbFilter.AppendWhere(rule.GetWhereClause(db, ""));
45 }
46
47 // fetch textures from the database
48 CVariant items = CVariant(CVariant::VariantTypeArray);
49 if (!db.GetTextures(items, dbFilter))
50 return InternalError;
51
52 // return only what was asked for, plus textureid
53 CVariant prop = parameterObject["properties"];
54 prop.push_back("textureid");
55 if (!items.empty() && prop.isArray())
56 {
57 std::set<std::string> fields;
58 CVariant &item = items[0];
59 for (CVariant::const_iterator_map field = item.begin_map(); field != item.end_map(); ++field)
60 {
61 if (std::find(prop.begin_array(), prop.end_array(), field->first) == prop.end_array())
62 fields.insert(field->first);
63 }
64 // erase these fields
65 for (CVariant::iterator_array item = items.begin_array(); item != items.end_array(); ++item)
66 {
67 for (const auto& i : fields)
68 item->erase(i);
69 }
70 if (fields.find("url") == fields.end())
71 {
72 // wrap cached url to something retrieval from Files.GetFiles()
73 for (CVariant::iterator_array item = items.begin_array(); item != items.end_array(); ++item)
74 {
75 CVariant &cachedUrl = (*item)["url"];
76 cachedUrl = CTextureUtils::GetWrappedImageURL(cachedUrl.asString());
77 }
78 }
79 }
80
81 result["textures"] = items;
82 return OK;
83 }
84
RemoveTexture(const std::string & method,ITransportLayer * transport,IClient * client,const CVariant & parameterObject,CVariant & result)85 JSONRPC_STATUS CTextureOperations::RemoveTexture(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result)
86 {
87 int id = (int)parameterObject["textureid"].asInteger();
88
89 if (!CTextureCache::GetInstance().ClearCachedImage(id))
90 return InvalidParams;
91
92 return ACK;
93 }
94