1 /**
2  * Orthanc - A Lightweight, RESTful DICOM Store
3  * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4  * Department, University Hospital of Liege, Belgium
5  * Copyright (C) 2017-2020 Osimis S.A., Belgium
6  *
7  * This program is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation, either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * In addition, as a special exception, the copyright holders of this
13  * program give permission to link the code of its release with the
14  * OpenSSL project's "OpenSSL" library (or with modified versions of it
15  * that use the same license as the "OpenSSL" library), and distribute
16  * the linked executables. You must obey the GNU General Public License
17  * in all respects for all of the code used other than "OpenSSL". If you
18  * modify file(s) with this exception, you may extend this exception to
19  * your version of the file(s), but you are not obligated to do so. If
20  * you do not wish to do so, delete this exception statement from your
21  * version. If you delete this exception statement from all source files
22  * in the program, then also delete it here.
23  *
24  * This program is distributed in the hope that it will be useful, but
25  * WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27  * General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program. If not, see <http://www.gnu.org/licenses/>.
31  **/
32 
33 
34 #include "../PrecompiledHeadersServer.h"
35 #include "OrthancRestApi.h"
36 
37 #include "../ServerContext.h"
38 
39 namespace Orthanc
40 {
41   // Changes API --------------------------------------------------------------
42 
GetSinceAndLimit(int64_t & since,unsigned int & limit,bool & last,const RestApiGetCall & call)43   static void GetSinceAndLimit(int64_t& since,
44                                unsigned int& limit,
45                                bool& last,
46                                const RestApiGetCall& call)
47   {
48     static const unsigned int DEFAULT_LIMIT = 100;
49 
50     if (call.HasArgument("last"))
51     {
52       last = true;
53       return;
54     }
55 
56     last = false;
57 
58     try
59     {
60       since = boost::lexical_cast<int64_t>(call.GetArgument("since", "0"));
61       limit = boost::lexical_cast<unsigned int>(call.GetArgument("limit", boost::lexical_cast<std::string>(DEFAULT_LIMIT)));
62     }
63     catch (boost::bad_lexical_cast&)
64     {
65       since = 0;
66       limit = DEFAULT_LIMIT;
67       return;
68     }
69   }
70 
GetChanges(RestApiGetCall & call)71   static void GetChanges(RestApiGetCall& call)
72   {
73     ServerContext& context = OrthancRestApi::GetContext(call);
74 
75     //std::string filter = GetArgument(getArguments, "filter", "");
76     int64_t since;
77     unsigned int limit;
78     bool last;
79     GetSinceAndLimit(since, limit, last, call);
80 
81     Json::Value result;
82     if (last)
83     {
84       context.GetIndex().GetLastChange(result);
85     }
86     else
87     {
88       context.GetIndex().GetChanges(result, since, limit);
89     }
90 
91     call.GetOutput().AnswerJson(result);
92   }
93 
94 
DeleteChanges(RestApiDeleteCall & call)95   static void DeleteChanges(RestApiDeleteCall& call)
96   {
97     OrthancRestApi::GetIndex(call).DeleteChanges();
98     call.GetOutput().AnswerBuffer("", MimeType_PlainText);
99   }
100 
101 
102   // Exports API --------------------------------------------------------------
103 
GetExports(RestApiGetCall & call)104   static void GetExports(RestApiGetCall& call)
105   {
106     ServerContext& context = OrthancRestApi::GetContext(call);
107 
108     int64_t since;
109     unsigned int limit;
110     bool last;
111     GetSinceAndLimit(since, limit, last, call);
112 
113     Json::Value result;
114     if (last)
115     {
116       context.GetIndex().GetLastExportedResource(result);
117     }
118     else
119     {
120       context.GetIndex().GetExportedResources(result, since, limit);
121     }
122 
123     call.GetOutput().AnswerJson(result);
124   }
125 
126 
DeleteExports(RestApiDeleteCall & call)127   static void DeleteExports(RestApiDeleteCall& call)
128   {
129     OrthancRestApi::GetIndex(call).DeleteExportedResources();
130     call.GetOutput().AnswerBuffer("", MimeType_PlainText);
131   }
132 
133 
RegisterChanges()134   void OrthancRestApi::RegisterChanges()
135   {
136     Register("/changes", GetChanges);
137     Register("/changes", DeleteChanges);
138     Register("/exports", GetExports);
139     Register("/exports", DeleteExports);
140   }
141 }
142