RigsofRods
Soft-body Physics Simulation
CacheSystemAngelscript.cpp
Go to the documentation of this file.
1 /*
2  This source file is part of Rigs of Rods
3  Copyright 2005-2012 Pierre-Michel Ricordel
4  Copyright 2007-2012 Thomas Fischer
5  Copyright 2013-2023 Petr Ohlidal
6 
7  For more information, see http://www.rigsofrods.org/
8 
9  Rigs of Rods is free software: you can redistribute it and/or modify
10  it under the terms of the GNU General Public License version 3, as
11  published by the Free Software Foundation.
12 
13  Rigs of Rods is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with Rigs of Rods. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #include "Actor.h"
23 #include "AngelScriptBindings.h"
24 #include "CacheSystem.h"
25 #include "ScriptEngine.h"
26 #include "ScriptUtils.h"
27 
28 #include <angelscript.h>
29 
30 using namespace AngelScript;
31 using namespace RoR;
32 
33 CScriptDictionary* CacheSystemQueryWrapper(CacheSystem* self, CScriptDictionary* dict)
34 {
35  CacheQuery query;
36  std::string log_msg = "modcache.query(): ";
37  std::string search_expr;
38  if (!GetValueFromScriptDict(log_msg, dict, /*required:*/true, "filter_type", "LoaderType", query.cqy_filter_type))
39  {
40  return nullptr;
41  }
42  int64_t i64_filter_category_id; // AngelScript's `Dictionary` converts all ints int `int64`
43  GetValueFromScriptDict(log_msg, dict, /*required:*/false, "filter_category_id", "int64", i64_filter_category_id);
44  query.cqy_filter_category_id = i64_filter_category_id;
45  GetValueFromScriptDict(log_msg, dict, /*required:*/false, "filter_guid", "string", query.cqy_filter_guid);
46  GetValueFromScriptDict(log_msg, dict, /*required:*/false, "search_expr", "string", search_expr);
47 
48  // FIXME: Copypasta of `GUI::MainSelector::UpdateSearchParams()`
49  if (search_expr.find(":") == std::string::npos)
50  {
51  query.cqy_search_method = CacheSearchMethod::FULLTEXT;
52  query.cqy_search_string = search_expr;
53  }
54  else
55  {
56  Ogre::StringVector v = Ogre::StringUtil::split(search_expr, ":");
57  if (v.size() < 2)
58  {
59  query.cqy_search_method = CacheSearchMethod::NONE;
60  query.cqy_search_string = "";
61  }
62  else if (v[0] == "guid")
63  {
64  query.cqy_search_method = CacheSearchMethod::GUID;
65  query.cqy_search_string = v[1];
66  }
67  else if (v[0] == "author")
68  {
69  query.cqy_search_method = CacheSearchMethod::AUTHORS;
70  query.cqy_search_string = v[1];
71  }
72  else if (v[0] == "wheels")
73  {
74  query.cqy_search_method = CacheSearchMethod::WHEELS;
75  query.cqy_search_string = v[1];
76  }
77  else if (v[0] == "file")
78  {
79  query.cqy_search_method = CacheSearchMethod::FILENAME;
80  query.cqy_search_string = v[1];
81  }
82  else
83  {
84  query.cqy_search_method = CacheSearchMethod::NONE;
85  query.cqy_search_string = "";
86  }
87  }
88  // END copypasta
89 
90  size_t results_count = self->Query(query);
91 
92  asITypeInfo* typeinfo_array_entries = App::GetScriptEngine()->getEngine()->GetTypeInfoByDecl("array<CacheEntryClass@>");
93  asITypeInfo* typeinfo_array_scores = App::GetScriptEngine()->getEngine()->GetTypeInfoByDecl("array<uint>");
94 
95  CScriptArray* results_entries = CScriptArray::Create(typeinfo_array_entries);
96  CScriptArray* results_scores = CScriptArray::Create(typeinfo_array_scores);
97  for (CacheQueryResult& result: query.cqy_results)
98  {
99  CacheEntry* entry_ptr = result.cqr_entry.GetRef();
100  results_entries->InsertLast(&entry_ptr);
101  results_scores->InsertLast(&result.cqr_score);
102  }
103 
104  CScriptDictionary* results_dict = CScriptDictionary::Create(App::GetScriptEngine()->getEngine());
105  results_dict->Set("count", (asINT64)results_count);
106  results_dict->Set("entries", results_entries, typeinfo_array_entries->GetTypeId());
107  results_dict->Set("scores", results_scores, typeinfo_array_scores->GetTypeId());
108 
109  return results_dict;
110 }
111 
112 void RoR::RegisterCacheSystem(asIScriptEngine *engine)
113 {
114  CacheEntry::RegisterRefCountingObject(engine, "CacheEntryClass");
115  CacheEntryPtr::RegisterRefCountingObjectPtr(engine, "CacheEntryClassPtr", "CacheEntryClass");
116 
117  int result;
118 
119  // enum LoaderType, which is a primary filter for modcache queries
120  result = engine->RegisterEnum("LoaderType"); ROR_ASSERT(result >= 0);
121  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_NONE", LT_None); ROR_ASSERT(result >= 0);
122  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_TERRAIN", LT_Terrain); ROR_ASSERT(result >= 0);
123  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_VEHICLE", LT_Vehicle); ROR_ASSERT(result >= 0);
124  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_TRUCK", LT_Truck); ROR_ASSERT(result >= 0);
125  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_CAR", LT_Car); ROR_ASSERT(result >= 0);
126  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_BOAT", LT_Boat); ROR_ASSERT(result >= 0);
127  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_AIRPLANE", LT_Airplane); ROR_ASSERT(result >= 0);
128  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_TRAILER", LT_Trailer); ROR_ASSERT(result >= 0);
129  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_TRAIN", LT_Train); ROR_ASSERT(result >= 0);
130  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_LOAD", LT_Load); ROR_ASSERT(result >= 0);
131  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_EXTENSION", LT_Extension); ROR_ASSERT(result >= 0);
132  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_SKIN", LT_Skin); ROR_ASSERT(result >= 0);
133  result = engine->RegisterEnumValue("LoaderType", "LOADER_TYPE_ALLBEAM", LT_AllBeam); ROR_ASSERT(result >= 0);
134 
135  // class CacheEntry, with read-only property access
136  // (Please maintain the same order as in 'CacheSystem.h' and 'doc/*/CacheSystemClass.h')
137 
138  result = engine->RegisterObjectMethod("CacheEntryClass", "const string& get_fpath() const property", asFUNCTIONPR([](CacheEntry* self) -> const std::string& {return self->fpath;}, (CacheEntry*), const std::string&), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
139  result = engine->RegisterObjectMethod("CacheEntryClass", "const string& get_fname() const property", asFUNCTIONPR([](CacheEntry* self) -> const std::string& {return self->fname;}, (CacheEntry*), const std::string&), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
140  result = engine->RegisterObjectMethod("CacheEntryClass", "const string& get_fext() const property", asFUNCTIONPR([](CacheEntry* self) -> const std::string& {return self->fext;}, (CacheEntry*), const std::string&), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
141  result = engine->RegisterObjectMethod("CacheEntryClass", "const string& get_dname() const property", asFUNCTIONPR([](CacheEntry* self) -> const std::string& {return self->dname;}, (CacheEntry*), const std::string&), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
142  result = engine->RegisterObjectMethod("CacheEntryClass", "int get_categoryid() const property", asFUNCTIONPR([](CacheEntry* self) -> int {return self->categoryid;}, (CacheEntry*), int), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
143  result = engine->RegisterObjectMethod("CacheEntryClass", "const string& get_categoryname() const property", asFUNCTIONPR([](CacheEntry* self) -> const std::string& {return self->categoryname;}, (CacheEntry*), const std::string&), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
144  result = engine->RegisterObjectMethod("CacheEntryClass", "const string& get_resource_bundle_type() const property", asFUNCTIONPR([](CacheEntry* self) -> const std::string& {return self->resource_bundle_type;}, (CacheEntry*), const std::string&), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
145  result = engine->RegisterObjectMethod("CacheEntryClass", "const string& get_resource_bundle_path() const property", asFUNCTIONPR([](CacheEntry* self) -> const std::string& {return self->resource_bundle_path;}, (CacheEntry*), const std::string&), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
146  result = engine->RegisterObjectMethod("CacheEntryClass", "int get_number() const property", asFUNCTIONPR([](CacheEntry* self) -> int {return self->number;}, (CacheEntry*), int), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
147  result = engine->RegisterObjectMethod("CacheEntryClass", "bool get_deleted() const property", asFUNCTIONPR([](CacheEntry* self) -> bool {return self->deleted;}, (CacheEntry*), bool), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
148  result = engine->RegisterObjectMethod("CacheEntryClass", "const string& get_filecachename() const property", asFUNCTIONPR([](CacheEntry* self) -> const std::string& {return self->filecachename;}, (CacheEntry*), const std::string&), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
149  result = engine->RegisterObjectMethod("CacheEntryClass", "const string& get_resource_group() const property", asFUNCTIONPR([](CacheEntry* self) -> const std::string& {return self->resource_group;}, (CacheEntry*), const std::string&), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
150 
151  // class CacheSystem (non-counted reference type)
152  result = engine->RegisterObjectType("CacheSystemClass", sizeof(CacheSystem), asOBJ_REF | asOBJ_NOCOUNT); ROR_ASSERT(result>=0);
153  result = engine->RegisterObjectMethod("CacheSystemClass", "CacheEntryClassPtr @findEntryByFilename(LoaderType, bool, const string &in)", asMETHOD(CacheSystem,FindEntryByFilename), asCALL_THISCALL); ROR_ASSERT(result>=0);
154  result = engine->RegisterObjectMethod("CacheSystemClass", "CacheEntryClassPtr @getEntryByNumber(int)", asMETHOD(CacheSystem,GetEntryByNumber), asCALL_THISCALL); ROR_ASSERT(result>=0);
155  result = engine->RegisterObjectMethod("CacheSystemClass", "dictionary@ query(dictionary@)", asFUNCTION(CacheSystemQueryWrapper), asCALL_CDECL_OBJFIRST); ROR_ASSERT(result>=0);
156 
157 }
ROR_ASSERT
#define ROR_ASSERT(_EXPR)
Definition: Application.h:40
RoR::CacheQueryResult::cqr_score
size_t cqr_score
Definition: CacheSystem.h:169
RoR::CacheQuery::cqy_filter_category_id
int cqy_filter_category_id
Definition: CacheSystem.h:185
AngelScriptBindings.h
RoR::RegisterCacheSystem
void RegisterCacheSystem(AngelScript::asIScriptEngine *engine)
defined in CacheSystemAngelscript.cpp
RoR::CacheQuery::cqy_search_method
CacheSearchMethod cqy_search_method
Definition: CacheSystem.h:188
RoR::LT_Skin
@ LT_Skin
Definition: Application.h:302
RoR::CacheQuery
Definition: CacheSystem.h:182
RoR::ScriptEngine::getEngine
AngelScript::asIScriptEngine * getEngine()
Definition: ScriptEngine.h:223
RoR::GetValueFromScriptDict
bool GetValueFromScriptDict(const std::string &log_msg, AngelScript::CScriptDictionary *dict, bool required, std::string const &key, const char *decl, T &out_value)
Definition: ScriptUtils.h:108
RoR::LT_Load
@ LT_Load
Definition: Application.h:300
RoR::LT_Airplane
@ LT_Airplane
Definition: Application.h:297
RoR::LT_Car
@ LT_Car
Definition: Application.h:295
RoR::LT_Extension
@ LT_Extension
Definition: Application.h:301
RoR::CacheQueryResult::cqr_entry
CacheEntryPtr cqr_entry
Definition: CacheSystem.h:168
RoR::CacheSystem
A content database MOTIVATION: RoR users usually have A LOT of content installed.
Definition: CacheSystem.h:288
Actor.h
RoR::App::GetScriptEngine
ScriptEngine * GetScriptEngine()
Definition: Application.cpp:279
RoR::LT_Boat
@ LT_Boat
Definition: Application.h:296
RoR::LT_Truck
@ LT_Truck
Definition: Application.h:294
CacheSystem.h
A database of user-installed content alias 'mods' (vehicles, terrains...)
RoR::CacheQueryResult
Definition: CacheSystem.h:162
ScriptEngine.h
RoR::LT_Vehicle
@ LT_Vehicle
Definition: Application.h:293
RefCountingObjectPtr::GetRef
T * GetRef()
Definition: RefCountingObjectPtr.h:50
RoR::LT_Trailer
@ LT_Trailer
Definition: Application.h:298
RoR::CacheQuery::cqy_search_string
std::string cqy_search_string
Definition: CacheSystem.h:189
RoR::CacheEntry
Definition: CacheSystem.h:55
RoR::LT_Terrain
@ LT_Terrain
Definition: Application.h:292
RoR::CacheQuery::cqy_filter_type
RoR::LoaderType cqy_filter_type
Definition: CacheSystem.h:184
RoR::LT_None
@ LT_None
Definition: Application.h:291
RoR::LT_AllBeam
@ LT_AllBeam
Definition: Application.h:303
RoR::CacheQuery::cqy_filter_guid
std::string cqy_filter_guid
Exact match (case-insensitive); leave empty to disable.
Definition: CacheSystem.h:186
ScriptUtils.h
RoR
Definition: AppContext.h:36
RoR::CacheQuery::cqy_results
std::vector< CacheQueryResult > cqy_results
Definition: CacheSystem.h:191
RoR::LT_Train
@ LT_Train
Definition: Application.h:299
CacheSystemQueryWrapper
CScriptDictionary * CacheSystemQueryWrapper(CacheSystem *self, CScriptDictionary *dict)
Definition: CacheSystemAngelscript.cpp:33