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 &parameterObject, 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 &parameterObject, 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