~indicator-applet-developers/hud/trunk.14.04

« back to all changes in this revision

Viewing changes to libqtgmenu/internal/QtGActionGroup.cpp

  • Committer: CI bot
  • Author(s): Pete Woods, Marcus Tomlinson
  • Date: 2014-06-04 14:04:03 UTC
  • mfrom: (390.1.44 trunk)
  • Revision ID: ps-jenkins@lists.canonical.com-20140604140403-a70c33snru5b6k4x
Harden HUD against misbehaving applications

Report the offending applications using Apport's recoverable problem tool.
Switch to using shared pointers where possible for managing memory. Fixes: 1298656, 1316473, 1322050, 1325538

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
 
22
22
using namespace qtgmenu;
23
23
 
24
 
QtGActionGroup::QtGActionGroup( const QString& action_prefix, GActionGroup* action_group )
 
24
QtGActionGroup::QtGActionGroup( QSharedPointer<GDBusConnection> connection,
 
25
        const QString& action_prefix,
 
26
        const QString& service,
 
27
        const QString& path )
25
28
    : m_action_prefix( action_prefix ),
26
 
      m_action_group( action_group )
 
29
      m_action_group(
 
30
                G_ACTION_GROUP(
 
31
                        g_dbus_action_group_get(connection.data(),
 
32
                                service.toUtf8().constData(),
 
33
                                path.toUtf8().constData())), &g_object_unref)
27
34
{
28
35
  ConnectCallbacks();
29
36
 
30
 
  auto actions_list = g_action_group_list_actions( m_action_group );
 
37
  auto actions_list = g_action_group_list_actions( m_action_group.data() );
31
38
  if( actions_list )
32
39
  {
33
40
    for( int i = 0; actions_list[i]; ++i )
46
53
    return;
47
54
  }
48
55
 
49
 
  auto actions_list = g_action_group_list_actions( m_action_group );
 
56
  auto actions_list = g_action_group_list_actions( m_action_group.data() );
50
57
  if( actions_list )
51
58
  {
52
59
    for( int i = 0; actions_list[i]; ++i )
58
65
  }
59
66
 
60
67
  DisconnectCallbacks();
61
 
 
62
 
  g_object_unref( m_action_group );
63
 
  m_action_group = nullptr;
64
 
 
65
 
  return;
66
68
}
67
69
 
68
 
GActionGroup* QtGActionGroup::ActionGroup() const
 
70
QSharedPointer<GActionGroup> QtGActionGroup::ActionGroup() const
69
71
{
70
72
  return m_action_group;
71
73
}
83
85
  const QString& action(split.second);
84
86
  QByteArray action_utf = action.toUtf8();
85
87
 
86
 
  const GVariantType* type = g_action_group_get_action_parameter_type( m_action_group,
 
88
  const GVariantType* type = g_action_group_get_action_parameter_type( m_action_group.data(),
87
89
                  action_utf.constData() );
88
90
 
89
91
  if( type == nullptr )
90
92
  {
91
 
    g_action_group_activate_action( m_action_group, action_utf.constData(), nullptr );
 
93
    g_action_group_activate_action( m_action_group.data(), action_utf.constData(), nullptr );
92
94
  }
93
95
  else
94
96
  {
96
98
    if( g_variant_type_equal( type, G_VARIANT_TYPE_STRING ) )
97
99
    {
98
100
      GVariant* param = g_variant_new_string( action_utf.constData() );
99
 
      g_action_group_activate_action( m_action_group, action_utf.constData(), param );
 
101
      g_action_group_activate_action( m_action_group.data(), action_utf.constData(), param );
100
102
      g_variant_unref( param );
101
103
    }
102
104
  }
116
118
 
117
119
void QtGActionGroup::EmitStates()
118
120
{
119
 
  auto actions_list = g_action_group_list_actions( m_action_group );
 
121
  auto actions_list = g_action_group_list_actions( m_action_group.data() );
120
122
 
121
123
  for( int i = 0; actions_list && actions_list[i]; ++i )
122
124
  {
123
125
    gchar* action_name = actions_list[i];
124
126
 
125
 
    bool enabled = G_ACTION_GROUP_GET_IFACE( m_action_group ) ->get_action_enabled( m_action_group,
 
127
    bool enabled = G_ACTION_GROUP_GET_IFACE( m_action_group.data() ) ->get_action_enabled( m_action_group.data(),
126
128
        action_name );
127
 
    if( !enabled )
128
 
      emit ActionEnabled( FullName(m_action_prefix, action_name), enabled );
 
129
    emit ActionEnabled( FullName(m_action_prefix, action_name), enabled );
129
130
 
130
 
    const GVariantType* type = g_action_group_get_action_parameter_type( m_action_group,
 
131
    const GVariantType* type = g_action_group_get_action_parameter_type( m_action_group.data(),
131
132
        action_name );
132
 
    if( type != nullptr )
133
 
      emit ActionParameterized( FullName(m_action_prefix, action_name), type != nullptr );
 
133
    emit ActionParameterized( FullName(m_action_prefix, action_name), type != nullptr );
134
134
  }
135
135
 
136
136
  g_strfreev( actions_list );
142
142
  QtGActionGroup* self = reinterpret_cast< QtGActionGroup* >( user_data );
143
143
  emit self->ActionAdded( action_name );
144
144
 
145
 
  bool enabled = G_ACTION_GROUP_GET_IFACE( self->m_action_group ) ->get_action_enabled(
146
 
      self->m_action_group, action_name );
 
145
  bool enabled = G_ACTION_GROUP_GET_IFACE( self->m_action_group.data() ) ->get_action_enabled(
 
146
      self->m_action_group.data(), action_name );
147
147
  if( !enabled )
148
148
    emit self->ActionEnabled( FullName(self->m_action_prefix, action_name), enabled );
149
149
 
150
 
  const GVariantType* type = g_action_group_get_action_parameter_type( self->m_action_group,
 
150
  const GVariantType* type = g_action_group_get_action_parameter_type( self->m_action_group.data(),
151
151
      action_name );
152
152
  if( type != nullptr )
153
153
    emit self->ActionParameterized( FullName(self->m_action_prefix, action_name), type != nullptr );
178
178
{
179
179
  if( m_action_group && m_action_added_handler == 0 )
180
180
  {
181
 
    m_action_added_handler = g_signal_connect( m_action_group, "action-added",
 
181
    m_action_added_handler = g_signal_connect( m_action_group.data(), "action-added",
182
182
        G_CALLBACK( ActionAddedCallback ), this );
183
183
  }
184
184
  if( m_action_group && m_action_removed_handler == 0 )
185
185
  {
186
 
    m_action_removed_handler = g_signal_connect( m_action_group, "action-removed",
 
186
    m_action_removed_handler = g_signal_connect( m_action_group.data(), "action-removed",
187
187
        G_CALLBACK( ActionRemovedCallback ), this );
188
188
  }
189
189
  if( m_action_group && m_action_enabled_handler == 0 )
190
190
  {
191
 
    m_action_enabled_handler = g_signal_connect( m_action_group, "action-enabled-changed",
 
191
    m_action_enabled_handler = g_signal_connect( m_action_group.data(), "action-enabled-changed",
192
192
        G_CALLBACK( ActionEnabledCallback ), this );
193
193
  }
194
194
  if( m_action_group && m_action_state_changed_handler == 0 )
195
195
  {
196
 
    m_action_state_changed_handler = g_signal_connect( m_action_group, "action-state-changed",
 
196
    m_action_state_changed_handler = g_signal_connect( m_action_group.data(), "action-state-changed",
197
197
        G_CALLBACK( ActionStateChangedCallback ), this );
198
198
  }
199
199
}
202
202
{
203
203
  if( m_action_group && m_action_added_handler != 0 )
204
204
  {
205
 
    g_signal_handler_disconnect( m_action_group, m_action_added_handler );
 
205
    g_signal_handler_disconnect( m_action_group.data(), m_action_added_handler );
206
206
  }
207
207
  if( m_action_group && m_action_removed_handler != 0 )
208
208
  {
209
 
    g_signal_handler_disconnect( m_action_group, m_action_removed_handler );
 
209
    g_signal_handler_disconnect( m_action_group.data(), m_action_removed_handler );
210
210
  }
211
211
  if( m_action_group && m_action_enabled_handler != 0 )
212
212
  {
213
 
    g_signal_handler_disconnect( m_action_group, m_action_enabled_handler );
 
213
    g_signal_handler_disconnect( m_action_group.data(), m_action_enabled_handler );
214
214
  }
215
215
  if( m_action_group && m_action_state_changed_handler != 0 )
216
216
  {
217
 
    g_signal_handler_disconnect( m_action_group, m_action_state_changed_handler );
 
217
    g_signal_handler_disconnect( m_action_group.data(), m_action_state_changed_handler );
218
218
  }
219
219
 
220
220
  m_action_added_handler = 0;