1 /*
2  *Copyright (C) 2018 Laurent Tréguier
3  *
4  *This file is part of DLS.
5  *
6  *DLS is free software: you can redistribute it and/or modify
7  *it under the terms of the GNU General Public License as published by
8  *the Free Software Foundation, either version 3 of the License, or
9  *(at your option) any later version.
10  *
11  *DLS is distributed in the hope that it will be useful,
12  *but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *GNU General Public License for more details.
15  *
16  *You should have received a copy of the GNU General Public License
17  *along with DLS.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 module dls.protocol.messages.window;
22 
23 import dls.protocol.interfaces : MessageActionItem;
24 import std.typecons : Nullable;
25 
26 void showMessageRequest(string id, Nullable!MessageActionItem item)
27 {
28     import dls.protocol.logger : logger;
29     import dls.tools.symbol_tool : SymbolTool;
30     import dls.util.i18n : Tr, tr;
31     import dls.util.uri : Uri;
32     import std.concurrency : locate, receiveOnly, send;
33     import std.process : browse;
34 
35     while (id !in Util.messageRequestInfo)
36     {
37         auto data = receiveOnly!(Util.ThreadMessageData)();
38         Util.bindMessageToRequestId(data[0], data[1], data[2]);
39     }
40 
41     if (!item.isNull)
42     {
43         switch (Util.messageRequestInfo[id][0])
44         {
45         case Tr.app_upgradeSelections:
46             if (item.title == tr(Tr.app_upgradeSelections_upgrade))
47             {
48                 auto uri = new Uri(Util.messageRequestInfo[id][1]);
49                 SymbolTool.instance.upgradeSelections(uri);
50             }
51 
52             break;
53 
54         case Tr.app_upgradeDls:
55             send(locate(Util.messageRequestInfo[id][1]),
56                     item.title == tr(Tr.app_upgradeDls_upgrade));
57             break;
58 
59         case Tr.app_showChangelog:
60             if (item.title == tr(Tr.app_showChangelog_show))
61             {
62                 logger.info("Opening changelog in browser");
63                 browse(Util.messageRequestInfo[id][1]);
64             }
65 
66             break;
67 
68         default:
69             assert(false, Util.messageRequestInfo[id][0] ~ " cannot be handled as requests");
70         }
71     }
72 
73     Util.messageRequestInfo.remove(id);
74 }
75 
76 final abstract class Util
77 {
78     import dls.protocol.jsonrpc : send;
79     import dls.protocol.messages.methods : Window;
80     import dls.util.i18n : Tr, tr, trType;
81     import std.array : array;
82     import std.algorithm : map;
83     import std.typecons : Tuple, tuple;
84 
85     shared alias ThreadMessageData = Tuple!(string, Tr, string);
86 
87     private static Tuple!(Tr, string)[string] messageRequestInfo;
88 
89     static void sendMessage(Tr message, string[] args = [])
90     {
91         import dls.protocol.interfaces : ShowMessageParams;
92 
93         send(Window.showMessage, new ShowMessageParams(trType(message), tr(message, args)));
94     }
95 
96     static string sendMessageRequest(Tr message, Tr[] actions, string[] args = [])
97     {
98         import dls.protocol.interfaces : ShowMessageRequestParams;
99         import std.typecons : nullable;
100 
101         return send(Window.showMessageRequest, new ShowMessageRequestParams(trType(message),
102                 tr(message, args), actions.map!(a => new MessageActionItem(tr(a,
103                 args))).array.nullable));
104     }
105 
106     static void bindMessageToRequestId(string id, Tr message, string data = null)
107     {
108         messageRequestInfo[id] = tuple(message, data);
109     }
110 }