Merge lp:~bilalakhtar/unity/software-center-integration-for-o into lp:unity

Proposed by Bilal Akhtar
Status: Superseded
Proposed branch: lp:~bilalakhtar/unity/software-center-integration-for-o
Merge into: lp:unity
Diff against target: 330 lines (+223/-4)
6 files modified
plugins/unityshell/src/Launcher.cpp (+3/-3)
plugins/unityshell/src/Launcher.h (+1/-0)
plugins/unityshell/src/LauncherController.cpp (+55/-1)
plugins/unityshell/src/LauncherController.h (+2/-0)
plugins/unityshell/src/SoftwareCenterLauncherIcon.cpp (+102/-0)
plugins/unityshell/src/SoftwareCenterLauncherIcon.h (+60/-0)
To merge this branch: bzr merge lp:~bilalakhtar/unity/software-center-integration-for-o
Reviewer Review Type Date Requested Status
Mikkel Kamstrup Erlandsen (community) Needs Fixing
Neil J. Patel (community) Needs Fixing
Unity Team Pending
Review via email: mp+71905@code.launchpad.net

This proposal has been superseded by a proposal from 2012-01-20.

Description of the change

This branch contains the first phase of the implementation of software-center integration with Unity. The complete spec on how it should be implemented, is located at:
https://wiki.ubuntu.com/SoftwareCenter#Learning_how_to_launch_an_application

This branch brings the following changes:
1) An app being installed is shown in the launcher with a tooltip "Waiting to install"
2) A progress bar on the launcher item displays the download/install progress.
3) When the app gets installed, the launcher items becomes usable, and the tooltip gets changed to the app name.

Things which are still to be implemented, in the next phases:
1) Animate the movement of the icon from the USC window to the Unity launcher.
2) Make the launcher icon wiggle when installation is complete
3) Stop the launcher icon from blinking when clicked in "waiting to install" state.

In the meantime, you can merge this branch into Unity while I implement the remaining aspects

Branch Testing instructions:
1) Make sure Unity built from my branch is running.
2) Get software-center from bzr branch lp:~gary-lasker/software-center/launcher-integration-lp761851
3) In the software center branch dir, run PYTHONPATH=. python ./software-center
4) Make sure that in the software center View menu, "New Applications In Launcher" is CHECKED.
5) Install a package using software-center that contains a desktop file (like gnome-color-chooser, gnome-mplayer or could be any package with a .desktop file)
6) Watch the Unity launcher :-)

To post a comment you must log in.
Revision history for this message
Neil J. Patel (njpatel) wrote :

Hey Bilal, great work so far! I have some points which will hopefully reduce the code and make it a bit nicer to merge:

+ We try and not do anything _sync() in Unity, as it effects startup time and, if done after startup, painting time of Compiz. I see that you are connecting to the apt daemon via D-Bus, to make the code cleaner and automatically async, I suggest you use unity::glib::DBusProxy in <UnityCore/GLibDBusProxy.h> I added, which wraps the GIO DBusProxy bits in a C++ wrapper that:

  - Connects to your chosen bus and object asynchronously
  - Let's you use the Connect() method that allows you to connect to signals from the proxy individually [instead of
    having a if (signal_name == foo) else if () etc etc], and also allows you to use a sigc::mem_fun instead of a
    static function, which should make the code nicer.

You also forgot to store the proxy pointer and unref it on destruction (as well as disconnecting the signal). Using the glib::DBusProxy will handle all this for you internally, so you'll only need to delete the proxy instance once your done with it.

+ You shouldn't be g_variant_unref'ing the "params" value, as it is passed as a function argument and not expected to be unref'd. I think you wanted to unref "property_value".

+ When you start using glib::DBusProxy, you should be able to incorporate initialize_tooltip_text(); into your constructor as the constructor won't be as large anymore.

+ Instead of if (!app), do if (!BAMF_IS_APPLICATION(app))

review: Needs Fixing
Revision history for this message
Bilal Akhtar (bilalakhtar) wrote :

Hi Neil,

I managed to get my file to use GLibDBusProxy. Remember the memory issue when adding the tooltip line suddenly made all the dbus calls fail mysteriously ? Moving to GLibDBusProxy has resurrected that weird issue, and now, I'm not able to find out the line which is causing it :(

Can you help me at it? I'll describe exactly what the issue is and where its happening:

1) The SCLauncherIcon class constructor is called, and both _aptdaemon_trans and _aptdaemon_trans_prop are initialized.

2) The Progress Get call is made. It fails, GLibDBusProxy returns an error that the proxy doesn't exist (while in fact it does, I've double-checked it with the aptdaemon log). Nothing comes in the log after this, except for point 3 below:

3) Mysteriously, the OnFinished callback gets called correctly when the transaction finishes (as expected), and I get the "Transaction Finished" message in the log at the right time.

Sure, C/C++ suck :(

Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) wrote :

Have you tried running a 'dbus-monitor > dbus-dump.txt' before doing a test run (and ctrl-c the command after). And then inspect the DBus traffic in that file carefully to make sure it looks like you expect?

Revision history for this message
Bilal Akhtar (bilalakhtar) wrote :

Yes, its exactly how its expected to be. Aptdaemon is creating the exactly same object which is being said by Unity to "not exist".

Revision history for this message
Bilal Akhtar (bilalakhtar) wrote :

Okay, so this merge request is okay for a review again. Everything which I've mentioned in the description works, I've tested it with Gary's branch and all.

Do note that the animation hasn't been implemented yet, I'll do that later on. Most of the groundwork is complete, only the animation and the wiggle etc has to land, which I'll do next weekend.

This was originally supposed to land in Oneiric but due to my faults it was postponed to Precise., but I've had good progress so far in the Precise cycle and as per current state, expect all changes to have landed by Alpha 2.

Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) wrote :

Just some drive by comments - I am not sure I am the right guy to review this...

166 + * Copyright (C) 2010 Canonical Ltd

I believe we write 2012 these days ;-)

223 + _aptdaemon_trans->Connect("Finished", sigc::mem_fun(*this, &SoftwareCenterLauncherIcon::OnFinished));
224 + _aptdaemon_trans->Connect("PropertyChanged", sigc::mem_fun(*this, &SoftwareCenterLauncherIcon::OnPropertyChanged));

Are you sure you mean '*this' and not 'this'?

Generally; I don't like the 'if (!g_strcmp0 (variable, "XYZ"))' construction. Do it like how it's done elsewhere too, with == 0. It improves legibility. Humans doesn't not suck at negations ;-)

review: Needs Fixing
Revision history for this message
Bilal Akhtar (bilalakhtar) wrote :

Okay, fixed, ready for a review again!

Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) wrote :

Sorry :-)

249 + if (!g_strcmp0 (property_name, "Progress")) {

Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) wrote :

I am taking the branch for a test spin - and one problem I've discovered so far is that if S-C hangs (because apt is broken typically) then you'll be perpetually stuck with a launcher icon with an empty progress bar on it.

I am not sure what to do in these situations. I guess the right thing is to simply have some sort of timeout. If there haven't been progress in 20s then silently remove the launcher icon. There are probably better ways though..?

review: Needs Fixing
Revision history for this message
Mikkel Kamstrup Erlandsen (kamstrup) wrote :

More comments - mostly also noted in your merge request:

 - Clicking the icon when the root password dialog from USC is up, starts pulsing the icon as if launched. From the spec I gather the icon should be grayed out and unresponive.

 - Same for while the app is installing

 - With lots of apps in the launcher the new app is "folded away". Meaning that I can't see the progress bar or tell when the app is done installing. I'd suggest that we wiggle it/call for attention/set urgency when done installing.

I guess these are points 2) and 3) on your todo list - except that you should "graying out while installing" as well?

But with the g_strcmp0() fix I noted, I guess this branch is good enough to merge. It is at leats ways better than not having it.

Revision history for this message
Bilal Akhtar (bilalakhtar) wrote :

As for the grey out part, I chatted with MPT at UDS and he was ready to compromise on that part and instead get a progress bar implemented.So, we'll implement a progress bar for now and we'll see later what we can do about the graying part.

Revision history for this message
Bilal Akhtar (bilalakhtar) wrote :

I'll make the g_strcmp0 fix this evening and then you can go ahead with it for now.

Revision history for this message
Bilal Akhtar (bilalakhtar) wrote :

There, you can review it again :)

Revision history for this message
Bilal Akhtar (bilalakhtar) wrote :

As for your question on SC hanging, in theory a crashed SC shouldn't screw anything up, the progress bar will still be updated regularly as it queries progress status from aptdaemon and not software-center. And if aptdaemon crashes, the apt process itself would crash I guess. If Apt crashes and not aptdaemon, aptdaemon would send a "finished" signal which would clear up the progress bar and remove it from the launcher.

So I guess the current implementation is okay for now, we'll investigate later on if issues arise.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'plugins/unityshell/src/Launcher.cpp'
--- plugins/unityshell/src/Launcher.cpp 2012-01-14 13:05:16 +0000
+++ plugins/unityshell/src/Launcher.cpp 2012-01-17 20:09:26 +0000
@@ -112,8 +112,8 @@
112 " <interface name='com.canonical.Unity.Launcher'>"112 " <interface name='com.canonical.Unity.Launcher'>"
113 ""113 ""
114 " <method name='AddLauncherItemFromPosition'>"114 " <method name='AddLauncherItemFromPosition'>"
115 " <arg type='s' name='title' direction='in'/>"
115 " <arg type='s' name='icon' direction='in'/>"116 " <arg type='s' name='icon' direction='in'/>"
116 " <arg type='s' name='title' direction='in'/>"
117 " <arg type='i' name='icon_x' direction='in'/>"117 " <arg type='i' name='icon_x' direction='in'/>"
118 " <arg type='i' name='icon_y' direction='in'/>"118 " <arg type='i' name='icon_y' direction='in'/>"
119 " <arg type='i' name='icon_size' direction='in'/>"119 " <arg type='i' name='icon_size' direction='in'/>"
@@ -3313,10 +3313,10 @@
3313 gchar* desktop_file;3313 gchar* desktop_file;
3314 gchar* aptdaemon_task;3314 gchar* aptdaemon_task;
33153315
3316 g_variant_get(parameters, "(ssiiiss)", &icon, &title, &icon_x, &icon_y, &icon_size, &desktop_file, &aptdaemon_task, NULL);3316 g_variant_get(parameters, "(ssiiiss)", &title, &icon, &icon_x, &icon_y, &icon_size, &desktop_file, &aptdaemon_task, NULL);
33173317
3318 Launcher* self = (Launcher*)user_data;3318 Launcher* self = (Launcher*)user_data;
3319 self->launcher_addrequest.emit(desktop_file, NULL);3319 self->launcher_addrequest_special.emit(desktop_file, NULL, aptdaemon_task, icon);
33203320
3321 g_dbus_method_invocation_return_value(invocation, NULL);3321 g_dbus_method_invocation_return_value(invocation, NULL);
3322 g_free(icon);3322 g_free(icon);
33233323
=== modified file 'plugins/unityshell/src/Launcher.h'
--- plugins/unityshell/src/Launcher.h 2012-01-07 13:26:49 +0000
+++ plugins/unityshell/src/Launcher.h 2012-01-17 20:09:26 +0000
@@ -195,6 +195,7 @@
195 void EnableCheckWindowOverLauncher(gboolean enabled);195 void EnableCheckWindowOverLauncher(gboolean enabled);
196196
197 sigc::signal<void, char*, LauncherIcon*> launcher_addrequest;197 sigc::signal<void, char*, LauncherIcon*> launcher_addrequest;
198 sigc::signal<void, char*, LauncherIcon*, char*, char*> launcher_addrequest_special;
198 sigc::signal<void, LauncherIcon*> launcher_removerequest;199 sigc::signal<void, LauncherIcon*> launcher_removerequest;
199 sigc::signal<void> selection_change;200 sigc::signal<void> selection_change;
200 sigc::signal<void> hidden_changed;201 sigc::signal<void> hidden_changed;
201202
=== modified file 'plugins/unityshell/src/LauncherController.cpp'
--- plugins/unityshell/src/LauncherController.cpp 2012-01-07 17:09:23 +0000
+++ plugins/unityshell/src/LauncherController.cpp 2012-01-17 20:09:26 +0000
@@ -38,12 +38,12 @@
38#include "LauncherEntryRemote.h"38#include "LauncherEntryRemote.h"
39#include "LauncherEntryRemoteModel.h"39#include "LauncherEntryRemoteModel.h"
40#include "LauncherIcon.h"40#include "LauncherIcon.h"
41#include "SoftwareCenterLauncherIcon.h"
41#include "LauncherModel.h"42#include "LauncherModel.h"
42#include "WindowManager.h"43#include "WindowManager.h"
43#include "TrashLauncherIcon.h"44#include "TrashLauncherIcon.h"
44#include "BFBLauncherIcon.h"45#include "BFBLauncherIcon.h"
4546
46
47namespace unity47namespace unity
48{48{
49namespace launcher49namespace launcher
@@ -67,6 +67,7 @@
67 void OnIconAdded(LauncherIcon* icon);67 void OnIconAdded(LauncherIcon* icon);
6868
69 void OnLauncherAddRequest(char* path, LauncherIcon* before);69 void OnLauncherAddRequest(char* path, LauncherIcon* before);
70 void OnLauncherAddRequestSpecial(char* path, LauncherIcon* before, char* aptdaemon_trans_id, char* icon_path);
70 void OnLauncherRemoveRequest(LauncherIcon* icon);71 void OnLauncherRemoveRequest(LauncherIcon* icon);
7172
72 void OnLauncherEntryRemoteAdded(LauncherEntryRemote* entry);73 void OnLauncherEntryRemoteAdded(LauncherEntryRemote* entry);
@@ -84,6 +85,8 @@
8485
85 LauncherIcon* CreateFavorite(const char* file_path);86 LauncherIcon* CreateFavorite(const char* file_path);
8687
88 SoftwareCenterLauncherIcon* CreateSCLauncherIcon(const char* file_path, const char* aptdaemon_trans_id, char* icon_path);
89
87 void SetupBamf();90 void SetupBamf();
8891
89 void OnExpoActivated();92 void OnExpoActivated();
@@ -147,6 +150,7 @@
147150
148 launcher_->SetModel(model_.get());151 launcher_->SetModel(model_.get());
149 launcher_->launcher_addrequest.connect(sigc::mem_fun(this, &Impl::OnLauncherAddRequest));152 launcher_->launcher_addrequest.connect(sigc::mem_fun(this, &Impl::OnLauncherAddRequest));
153 launcher_->launcher_addrequest_special.connect(sigc::mem_fun(this, &Impl::OnLauncherAddRequestSpecial));
150 launcher_->launcher_removerequest.connect(sigc::mem_fun(this, &Impl::OnLauncherRemoveRequest));154 launcher_->launcher_removerequest.connect(sigc::mem_fun(this, &Impl::OnLauncherRemoveRequest));
151155
152 device_section_ = new DeviceLauncherSection(raw_launcher);156 device_section_ = new DeviceLauncherSection(raw_launcher);
@@ -235,6 +239,30 @@
235 unity::FavoriteStore::GetDefault().SetFavorites(desktop_paths);239 unity::FavoriteStore::GetDefault().SetFavorites(desktop_paths);
236}240}
237241
242void
243Controller::Impl::OnLauncherAddRequestSpecial(char* path, LauncherIcon* before, char* aptdaemon_trans_id, char* icon_path)
244{
245 std::list<BamfLauncherIcon*> launchers;
246 std::list<BamfLauncherIcon*>::iterator it;
247
248 launchers = model_->GetSublist<BamfLauncherIcon> ();
249 for (it = launchers.begin(); it != launchers.end(); it++)
250 {
251 if (g_strcmp0(path, (*it)->DesktopFile()) == 0)
252 return;
253 }
254
255 SoftwareCenterLauncherIcon* result = CreateSCLauncherIcon(path, aptdaemon_trans_id, icon_path);
256 if (result)
257 {
258 RegisterIcon(result);
259
260 if (before)
261 model_->ReorderBefore(result, before, false);
262 }
263 Save();
264}
265
238void Controller::Impl::SortAndUpdate()266void Controller::Impl::SortAndUpdate()
239{267{
240 gint shortcut = 1;268 gint shortcut = 1;
@@ -444,6 +472,32 @@
444 return icon;472 return icon;
445}473}
446474
475SoftwareCenterLauncherIcon*
476Controller::Impl::CreateSCLauncherIcon(const char* file_path, const char* aptdaemon_trans_id, char* icon_path)
477{
478 BamfApplication* app;
479 SoftwareCenterLauncherIcon* icon;
480
481 app = bamf_matcher_get_application_for_desktop_file(matcher_, file_path, true);
482 if (!BAMF_IS_APPLICATION(app))
483 return NULL;
484
485 if (g_object_get_qdata(G_OBJECT(app), g_quark_from_static_string("unity-seen")))
486 {
487 bamf_view_set_sticky(BAMF_VIEW(app), true);
488 return 0;
489 }
490
491 g_object_set_qdata(G_OBJECT(app), g_quark_from_static_string("unity-seen"), GINT_TO_POINTER(1));
492
493 bamf_view_set_sticky(BAMF_VIEW(app), true);
494 icon = new SoftwareCenterLauncherIcon(launcher_.GetPointer(), app, (char*)aptdaemon_trans_id, icon_path);
495 icon->SetIconType(LauncherIcon::TYPE_APPLICATION);
496 icon->SetSortPriority(sort_priority_++);
497
498 return icon;
499}
500
447void Controller::Impl::SetupBamf()501void Controller::Impl::SetupBamf()
448{502{
449 GList* apps, *l;503 GList* apps, *l;
450504
=== modified file 'plugins/unityshell/src/LauncherController.h'
--- plugins/unityshell/src/LauncherController.h 2011-11-30 03:06:44 +0000
+++ plugins/unityshell/src/LauncherController.h 2012-01-17 20:09:26 +0000
@@ -26,6 +26,8 @@
26#include <sigc++/sigc++.h>26#include <sigc++/sigc++.h>
27#include <core/core.h>27#include <core/core.h>
2828
29#include "SoftwareCenterLauncherIcon.h"
30
29namespace unity31namespace unity
30{32{
31namespace launcher33namespace launcher
3234
=== added file 'plugins/unityshell/src/SoftwareCenterLauncherIcon.cpp'
--- plugins/unityshell/src/SoftwareCenterLauncherIcon.cpp 1970-01-01 00:00:00 +0000
+++ plugins/unityshell/src/SoftwareCenterLauncherIcon.cpp 2012-01-17 20:09:26 +0000
@@ -0,0 +1,102 @@
1// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
2/*
3 * Copyright (C) 2012 Canonical Ltd
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 *
17 * Authored by: Bilal Akhtar <bilalakhtar@ubuntu.com>
18 */
19
20#include "Nux/Nux.h"
21#include "Nux/BaseWindow.h"
22
23#include "BamfLauncherIcon.h"
24#include "Launcher.h"
25#include "LauncherController.h"
26#include "PluginAdapter.h"
27#include "FavoriteStore.h"
28
29#include "ubus-server.h"
30#include "UBusMessages.h"
31
32#include <glib.h>
33#include <glib/gvariant.h>
34#include <glib/gi18n-lib.h>
35#include <gio/gio.h>
36#include <libindicator/indicator-desktop-shortcuts.h>
37#include <core/core.h>
38#include <core/atoms.h>
39
40#include "SoftwareCenterLauncherIcon.h"
41
42namespace unity
43{
44namespace launcher
45{
46
47SoftwareCenterLauncherIcon::SoftwareCenterLauncherIcon(Launcher* IconManager, BamfApplication* app, char* aptdaemon_trans_id, char* icon_path)
48: BamfLauncherIcon(IconManager, app)
49{
50 _aptdaemon_trans_id = aptdaemon_trans_id;
51
52 g_debug("Aptdaemon transaction ID: %s", _aptdaemon_trans_id);
53
54 _aptdaemon_trans = new unity::glib::DBusProxy("org.debian.apt",
55 _aptdaemon_trans_id,
56 "org.debian.apt.transaction",
57 G_BUS_TYPE_SYSTEM,
58 G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START);
59
60 _aptdaemon_trans->Connect("Finished", sigc::mem_fun(this, &SoftwareCenterLauncherIcon::OnFinished));
61 _aptdaemon_trans->Connect("PropertyChanged", sigc::mem_fun(this, &SoftwareCenterLauncherIcon::OnPropertyChanged));
62
63 icon_name = icon_path;
64}
65
66SoftwareCenterLauncherIcon::~SoftwareCenterLauncherIcon() {
67
68}
69
70void
71SoftwareCenterLauncherIcon::OnFinished(GVariant* params) {
72
73 tooltip_text = BamfName();
74
75 SetQuirk(LauncherIcon::QUIRK_PROGRESS, FALSE);
76}
77
78void
79SoftwareCenterLauncherIcon::OnPropertyChanged(GVariant* params) {
80
81 gint32 progress;
82 gchar* property_name;
83 GVariant* property_value;
84
85 g_variant_get_child (params, 0, "s", &property_name);
86 if (g_strcmp0 (property_name, "Progress") == 0) {
87 g_variant_get_child (params,1,"v",&property_value);
88 g_variant_get (property_value, "i", &progress);
89
90 if (progress < 100) {
91 SetQuirk(LauncherIcon::QUIRK_PROGRESS, TRUE);
92 tooltip_text = _("Waiting to install");
93 }
94 SetProgress(((float)progress) / ((float)100));
95 }
96 g_variant_unref(property_value);
97 g_free(property_name);
98
99}
100
101}
102}
0103
=== added file 'plugins/unityshell/src/SoftwareCenterLauncherIcon.h'
--- plugins/unityshell/src/SoftwareCenterLauncherIcon.h 1970-01-01 00:00:00 +0000
+++ plugins/unityshell/src/SoftwareCenterLauncherIcon.h 2012-01-17 20:09:26 +0000
@@ -0,0 +1,60 @@
1// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
2/*
3 * Copyright (C) 2010 Canonical Ltd
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 *
17 * Authored by: Bilal Akhtar <bilalakhtar@ubuntu.com>
18 */
19
20#ifndef SOFTWARECENTERLAUNCHERICON_H
21#define SOFTWARECENTERLAUNCHERICON_H
22
23#include "BamfLauncherIcon.h"
24#include <Nux/BaseWindow.h>
25#include <NuxCore/Math/MathInc.h>
26#include <core/core.h>
27#include <gio/gio.h>
28#include <glib.h>
29#include <glib/gvariant.h>
30#include <UnityCore/GLibDBusProxy.h>
31
32
33namespace unity
34{
35namespace launcher
36{
37
38
39class SoftwareCenterLauncherIcon : public BamfLauncherIcon
40{
41public:
42
43 SoftwareCenterLauncherIcon(Launcher* IconManager, BamfApplication* app, char* aptdaemon_trans_id, char* icon_path);
44 virtual ~SoftwareCenterLauncherIcon();
45
46 gchar* original_tooltip_text;
47
48private:
49 char* _aptdaemon_trans_id;
50 unity::glib::DBusProxy* _aptdaemon_trans;
51
52 void OnFinished(GVariant* params);
53
54 void OnPropertyChanged(GVariant* params);
55};
56
57}
58}
59
60#endif