Mercurial > hg > orthanc
comparison OrthancServer/LuaScripting.cpp @ 1447:5ba7471780ae
refactoring: HttpToolbox, DumpJson in Lua
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 01 Jul 2015 17:42:06 +0200 |
parents | d26c8a93d05a |
children | 164a381abb2b |
comparison
equal
deleted
inserted
replaced
1446:8dc80ba768aa | 1447:5ba7471780ae |
---|---|
56 const void* value = LuaContext::GetGlobalVariable(state, "_ServerContext"); | 56 const void* value = LuaContext::GetGlobalVariable(state, "_ServerContext"); |
57 return const_cast<ServerContext*>(reinterpret_cast<const ServerContext*>(value)); | 57 return const_cast<ServerContext*>(reinterpret_cast<const ServerContext*>(value)); |
58 } | 58 } |
59 | 59 |
60 | 60 |
61 // Syntax in Lua: RestApiGet(uri, builtin) | |
61 int LuaScripting::RestApiGet(lua_State *state) | 62 int LuaScripting::RestApiGet(lua_State *state) |
62 { | 63 { |
63 ServerContext* serverContext = GetServerContext(state); | 64 ServerContext* serverContext = GetServerContext(state); |
64 if (serverContext == NULL) | 65 if (serverContext == NULL) |
65 { | 66 { |
87 { | 88 { |
88 lua_pushstring(state, result.c_str()); | 89 lua_pushstring(state, result.c_str()); |
89 } | 90 } |
90 else | 91 else |
91 { | 92 { |
92 LOG(ERROR) << "Lua: Error in RestApiGet() for URI " << uri; | 93 LOG(ERROR) << "Lua: Error in RestApiGet() for URI: " << uri; |
94 lua_pushnil(state); | |
95 } | |
96 | |
97 return 1; | |
98 } | |
99 | |
100 | |
101 int LuaScripting::RestApiPostOrPut(lua_State *state, | |
102 bool isPost) | |
103 { | |
104 ServerContext* serverContext = GetServerContext(state); | |
105 if (serverContext == NULL) | |
106 { | |
107 LOG(ERROR) << "Lua: The Orthanc API is unavailable"; | |
108 lua_pushnil(state); | |
109 return 1; | |
110 } | |
111 | |
112 // Check the types of the arguments | |
113 int nArgs = lua_gettop(state); | |
114 if ((nArgs != 2 && nArgs != 3) || | |
115 !lua_isstring(state, 1) || // URI | |
116 !lua_isstring(state, 2) || // Body | |
117 (nArgs == 3 && !lua_isboolean(state, 3))) // Restrict to built-in API? | |
118 { | |
119 LOG(ERROR) << "Lua: Bad parameters to " << (isPost ? "RestApiPost()" : "RestApiPut()"); | |
120 lua_pushnil(state); | |
121 return 1; | |
122 } | |
123 | |
124 const char* uri = lua_tostring(state, 1); | |
125 size_t bodySize = 0; | |
126 const char* bodyData = lua_tolstring(state, 2, &bodySize); | |
127 bool builtin = (nArgs == 3 ? lua_toboolean(state, 3) : false); | |
128 | |
129 std::string result; | |
130 if (isPost ? | |
131 HttpToolbox::SimplePost(result, serverContext->GetHttpHandler().RestrictToOrthancRestApi(builtin), | |
132 uri, bodyData, bodySize) : | |
133 HttpToolbox::SimplePut(result, serverContext->GetHttpHandler().RestrictToOrthancRestApi(builtin), | |
134 uri, bodyData, bodySize)) | |
135 { | |
136 lua_pushstring(state, result.c_str()); | |
137 } | |
138 else | |
139 { | |
140 LOG(ERROR) << "Lua: Error in " << (isPost ? "RestApiPost()" : "RestApiPut()") << " for URI: " << uri; | |
141 lua_pushnil(state); | |
142 } | |
143 | |
144 return 1; | |
145 } | |
146 | |
147 | |
148 // Syntax in Lua: RestApiPost(uri, body, builtin) | |
149 int LuaScripting::RestApiPost(lua_State *state) | |
150 { | |
151 return RestApiPostOrPut(state, true); | |
152 } | |
153 | |
154 | |
155 // Syntax in Lua: RestApiPut(uri, body, builtin) | |
156 int LuaScripting::RestApiPut(lua_State *state) | |
157 { | |
158 return RestApiPostOrPut(state, false); | |
159 } | |
160 | |
161 | |
162 // Syntax in Lua: RestApiDelete(uri, builtin) | |
163 int LuaScripting::RestApiDelete(lua_State *state) | |
164 { | |
165 ServerContext* serverContext = GetServerContext(state); | |
166 if (serverContext == NULL) | |
167 { | |
168 LOG(ERROR) << "Lua: The Orthanc API is unavailable"; | |
169 lua_pushnil(state); | |
170 return 1; | |
171 } | |
172 | |
173 // Check the types of the arguments | |
174 int nArgs = lua_gettop(state); | |
175 if ((nArgs != 1 && nArgs != 2) || | |
176 !lua_isstring(state, 1) || // URI | |
177 (nArgs == 2 && !lua_isboolean(state, 2))) // Restrict to built-in API? | |
178 { | |
179 LOG(ERROR) << "Lua: Bad parameters to RestApiGet()"; | |
180 lua_pushnil(state); | |
181 return 1; | |
182 } | |
183 | |
184 const char* uri = lua_tostring(state, 1); | |
185 bool builtin = (nArgs == 2 ? lua_toboolean(state, 2) : false); | |
186 | |
187 if (HttpToolbox::SimpleDelete(serverContext->GetHttpHandler().RestrictToOrthancRestApi(builtin), uri)) | |
188 { | |
189 lua_pushboolean(state, 1); | |
190 } | |
191 else | |
192 { | |
193 LOG(ERROR) << "Lua: Error in RestApiGet() for URI: " << uri; | |
93 lua_pushnil(state); | 194 lua_pushnil(state); |
94 } | 195 } |
95 | 196 |
96 return 1; | 197 return 1; |
97 } | 198 } |
249 | 350 |
250 LuaScripting::LuaScripting(ServerContext& context) : context_(context) | 351 LuaScripting::LuaScripting(ServerContext& context) : context_(context) |
251 { | 352 { |
252 lua_.SetGlobalVariable("_ServerContext", &context); | 353 lua_.SetGlobalVariable("_ServerContext", &context); |
253 lua_.RegisterFunction("RestApiGet", RestApiGet); | 354 lua_.RegisterFunction("RestApiGet", RestApiGet); |
355 lua_.RegisterFunction("RestApiPost", RestApiPost); | |
356 lua_.RegisterFunction("RestApiPut", RestApiPut); | |
357 lua_.RegisterFunction("RestApiDelete", RestApiDelete); | |
254 | 358 |
255 lua_.Execute(Orthanc::EmbeddedResources::LUA_TOOLBOX); | 359 lua_.Execute(Orthanc::EmbeddedResources::LUA_TOOLBOX); |
256 lua_.SetHttpProxy(Configuration::GetGlobalStringParameter("HttpProxy", "")); | 360 lua_.SetHttpProxy(Configuration::GetGlobalStringParameter("HttpProxy", "")); |
257 } | 361 } |
258 | 362 |
327 default: | 431 default: |
328 throw OrthancException(ErrorCode_InternalError); | 432 throw OrthancException(ErrorCode_InternalError); |
329 } | 433 } |
330 | 434 |
331 | 435 |
332 Json::Value tags; | 436 Json::Value tags, metadata; |
333 if (context_.GetIndex().LookupResource(tags, change.GetPublicId(), change.GetResourceType())) | 437 if (context_.GetIndex().LookupResource(tags, change.GetPublicId(), change.GetResourceType()) && |
438 context_.GetIndex().GetMetadata(metadata, change.GetPublicId())) | |
334 { | 439 { |
335 boost::mutex::scoped_lock lock(mutex_); | 440 boost::mutex::scoped_lock lock(mutex_); |
336 | 441 |
337 if (lua_.IsExistingFunction(name)) | 442 if (lua_.IsExistingFunction(name)) |
338 { | 443 { |
339 InitializeJob(); | 444 InitializeJob(); |
340 | 445 |
341 LuaFunctionCall call(lua_, name); | 446 LuaFunctionCall call(lua_, name); |
342 call.PushString(change.GetPublicId()); | 447 call.PushString(change.GetPublicId()); |
343 call.PushJson(tags["MainDicomTags"]); | 448 call.PushJson(tags["MainDicomTags"]); |
449 call.PushJson(metadata); | |
344 call.Execute(); | 450 call.Execute(); |
345 | 451 |
346 SubmitJob(std::string("Lua script: ") + name); | 452 SubmitJob(std::string("Lua script: ") + name); |
347 } | 453 } |
348 } | 454 } |