[libmce-glib] Added MceTklock object. JB#36523
Tracks MCE tklock mode
This commit is contained in:
		
							
								
								
									
										3
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								Makefile
									
									
									
									
									
								
							@@ -39,7 +39,8 @@ LIB = $(LIB_SONAME).$(VERSION_MINOR).$(VERSION_RELEASE)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
SRC = \
 | 
					SRC = \
 | 
				
			||||||
  mce_display.c \
 | 
					  mce_display.c \
 | 
				
			||||||
  mce_proxy.c
 | 
					  mce_proxy.c \
 | 
				
			||||||
 | 
					  mce_tklock.c
 | 
				
			||||||
GEN_SRC = \
 | 
					GEN_SRC = \
 | 
				
			||||||
  com.nokia.mce.request.c \
 | 
					  com.nokia.mce.request.c \
 | 
				
			||||||
  com.nokia.mce.signal.c
 | 
					  com.nokia.mce.signal.c
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										120
									
								
								include/mce_tklock.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								include/mce_tklock.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2016 Jolla Ltd.
 | 
				
			||||||
 | 
					 * Contact: Slava Monich <slava.monich@jolla.com>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You may use this file under the terms of BSD license as follows:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *   1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *   2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *      documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *   3. Neither the name of Jolla Ltd nor the names of its contributors may
 | 
				
			||||||
 | 
					 *      be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					 *      without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
 | 
				
			||||||
 | 
					 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
				
			||||||
 | 
					 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
				
			||||||
 | 
					 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
				
			||||||
 | 
					 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
				
			||||||
 | 
					 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
				
			||||||
 | 
					 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 | 
				
			||||||
 | 
					 * THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The views and conclusions contained in the software and documentation
 | 
				
			||||||
 | 
					 * are those of the authors and should not be interpreted as representing
 | 
				
			||||||
 | 
					 * any official policies, either expressed or implied.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef MCE_TKLOCK_H
 | 
				
			||||||
 | 
					#define MCE_TKLOCK_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "mce_types.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum mce_tklock_mode {
 | 
				
			||||||
 | 
					    MCE_TKLOCK_MODE_LOCKED,
 | 
				
			||||||
 | 
					    MCE_TKLOCK_MODE_SILENT_LOCKED,
 | 
				
			||||||
 | 
					    MCE_TKLOCK_MODE_LOCKED_DIM,
 | 
				
			||||||
 | 
					    MCE_TKLOCK_MODE_LOCKED_DELAY,
 | 
				
			||||||
 | 
					    MCE_TKLOCK_MODE_SILENT_LOCKED_DIM,
 | 
				
			||||||
 | 
					    MCE_TKLOCK_MODE_UNLOCKED,
 | 
				
			||||||
 | 
					    MCE_TKLOCK_MODE_SILENT_UNLOCKED
 | 
				
			||||||
 | 
					} MCE_TKLOCK_MODE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct mce_tklock_priv MceTklockPriv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct mce_tklock {
 | 
				
			||||||
 | 
					    GObject object;
 | 
				
			||||||
 | 
					    MceTklockPriv* priv;
 | 
				
			||||||
 | 
					    gboolean valid;
 | 
				
			||||||
 | 
					    MCE_TKLOCK_MODE mode;
 | 
				
			||||||
 | 
					    gboolean locked;
 | 
				
			||||||
 | 
					} MceTklock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef void
 | 
				
			||||||
 | 
					(*MceTklockFunc)(
 | 
				
			||||||
 | 
					    MceTklock* tklock,
 | 
				
			||||||
 | 
					    void* arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MceTklock*
 | 
				
			||||||
 | 
					mce_tklock_new(
 | 
				
			||||||
 | 
					    void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MceTklock*
 | 
				
			||||||
 | 
					mce_tklock_ref(
 | 
				
			||||||
 | 
					    MceTklock* tklock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_unref(
 | 
				
			||||||
 | 
					    MceTklock* tklock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulong
 | 
				
			||||||
 | 
					mce_tklock_add_valid_changed_handler(
 | 
				
			||||||
 | 
					    MceTklock* tklock,
 | 
				
			||||||
 | 
					    MceTklockFunc fn,
 | 
				
			||||||
 | 
					    void* arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulong
 | 
				
			||||||
 | 
					mce_tklock_add_mode_changed_handler(
 | 
				
			||||||
 | 
					    MceTklock* tklock,
 | 
				
			||||||
 | 
					    MceTklockFunc fn,
 | 
				
			||||||
 | 
					    void* arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulong
 | 
				
			||||||
 | 
					mce_tklock_add_locked_changed_handler(
 | 
				
			||||||
 | 
					    MceTklock* tklock,
 | 
				
			||||||
 | 
					    MceTklockFunc fn,
 | 
				
			||||||
 | 
					    void* arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_remove_handler(
 | 
				
			||||||
 | 
					    MceTklock* tklock,
 | 
				
			||||||
 | 
					    gulong id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_remove_handlers(
 | 
				
			||||||
 | 
					    MceTklock* tklock,
 | 
				
			||||||
 | 
					    gulong *ids,
 | 
				
			||||||
 | 
					    guint count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_END_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* MCE_TKLOCK_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
@@ -7,5 +7,8 @@
 | 
				
			|||||||
    <method name="get_display_status">
 | 
					    <method name="get_display_status">
 | 
				
			||||||
      <arg direction="out" name="display_state" type="s"/>
 | 
					      <arg direction="out" name="display_state" type="s"/>
 | 
				
			||||||
    </method>
 | 
					    </method>
 | 
				
			||||||
 | 
					    <method name="get_tklock_mode">
 | 
				
			||||||
 | 
					      <arg direction="out" name="mode_name" type="s"/>
 | 
				
			||||||
 | 
					    </method>
 | 
				
			||||||
  </interface>
 | 
					  </interface>
 | 
				
			||||||
</node>
 | 
					</node>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,5 +7,8 @@
 | 
				
			|||||||
    <signal name="display_status_ind">
 | 
					    <signal name="display_status_ind">
 | 
				
			||||||
      <arg name="display_state" type="s"/>
 | 
					      <arg name="display_state" type="s"/>
 | 
				
			||||||
    </signal>
 | 
					    </signal>
 | 
				
			||||||
 | 
					    <signal name="tklock_mode_ind">
 | 
				
			||||||
 | 
					      <arg name="tklock_mode" type="s"/>
 | 
				
			||||||
 | 
					    </signal>
 | 
				
			||||||
  </interface>
 | 
					  </interface>
 | 
				
			||||||
</node>
 | 
					</node>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										352
									
								
								src/mce_tklock.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										352
									
								
								src/mce_tklock.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,352 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2016 Jolla Ltd.
 | 
				
			||||||
 | 
					 * Contact: Slava Monich <slava.monich@jolla.com>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * You may use this file under the terms of BSD license as follows:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					 * modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					 * are met:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *   1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					 *   2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					 *      notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					 *      documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					 *   3. Neither the name of Jolla Ltd nor the names of its contributors may
 | 
				
			||||||
 | 
					 *      be used to endorse or promote products derived from this software
 | 
				
			||||||
 | 
					 *      without specific prior written permission.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
 | 
				
			||||||
 | 
					 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
				
			||||||
 | 
					 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
				
			||||||
 | 
					 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
				
			||||||
 | 
					 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
				
			||||||
 | 
					 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
				
			||||||
 | 
					 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 | 
				
			||||||
 | 
					 * THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The views and conclusions contained in the software and documentation
 | 
				
			||||||
 | 
					 * are those of the authors and should not be interpreted as representing
 | 
				
			||||||
 | 
					 * any official policies, either expressed or implied.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "mce_tklock.h"
 | 
				
			||||||
 | 
					#include "mce_proxy.h"
 | 
				
			||||||
 | 
					#include "mce_log_p.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <mce/dbus-names.h>
 | 
				
			||||||
 | 
					#include <mce/mode-names.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gutil_misc.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Generated headers */
 | 
				
			||||||
 | 
					#include "com.nokia.mce.request.h"
 | 
				
			||||||
 | 
					#include "com.nokia.mce.signal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct mce_tklock_priv {
 | 
				
			||||||
 | 
					    MceProxy* proxy;
 | 
				
			||||||
 | 
					    gulong proxy_valid_id;
 | 
				
			||||||
 | 
					    gulong tklock_mode_ind_id;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum mce_tklock_signal {
 | 
				
			||||||
 | 
					    SIGNAL_VALID_CHANGED,
 | 
				
			||||||
 | 
					    SIGNAL_MODE_CHANGED,
 | 
				
			||||||
 | 
					    SIGNAL_LOCKED_CHANGED,
 | 
				
			||||||
 | 
					    SIGNAL_COUNT
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SIGNAL_VALID_CHANGED_NAME  "mce-tklock-valid-changed"
 | 
				
			||||||
 | 
					#define SIGNAL_MODE_CHANGED_NAME   "mce-tklock-mode-changed"
 | 
				
			||||||
 | 
					#define SIGNAL_LOCKED_CHANGED_NAME "mce-tklock-locked-changed"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static guint mce_tklock_signals[SIGNAL_COUNT] = { 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef GObjectClass MceTklockClass;
 | 
				
			||||||
 | 
					G_DEFINE_TYPE(MceTklock, mce_tklock, G_TYPE_OBJECT)
 | 
				
			||||||
 | 
					#define PARENT_CLASS mce_tklock_parent_class
 | 
				
			||||||
 | 
					#define MCE_TKLOCK_TYPE (mce_tklock_get_type())
 | 
				
			||||||
 | 
					#define MCE_TKLOCK(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj,\
 | 
				
			||||||
 | 
					        MCE_TKLOCK_TYPE,MceTklock))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================*
 | 
				
			||||||
 | 
					 * Implementation
 | 
				
			||||||
 | 
					 *==========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_mode_update(
 | 
				
			||||||
 | 
					    MceTklock* self,
 | 
				
			||||||
 | 
					    const char* mode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MceTklockPriv* priv = self->priv;
 | 
				
			||||||
 | 
					    const MCE_TKLOCK_MODE prev_mode = self->mode;
 | 
				
			||||||
 | 
					    const gboolean prev_locked = self->locked;
 | 
				
			||||||
 | 
					    static const struct mce_tklock_mode_desc {
 | 
				
			||||||
 | 
					        const char* name;
 | 
				
			||||||
 | 
					        MCE_TKLOCK_MODE mode;
 | 
				
			||||||
 | 
					        gboolean locked;
 | 
				
			||||||
 | 
					    } mce_tklock_modes [] = {
 | 
				
			||||||
 | 
					        /* Most commonly used modes first */
 | 
				
			||||||
 | 
					        { MCE_TK_LOCKED, MCE_TKLOCK_MODE_LOCKED, TRUE },
 | 
				
			||||||
 | 
					        { MCE_TK_UNLOCKED, MCE_TKLOCK_MODE_UNLOCKED, FALSE },
 | 
				
			||||||
 | 
					        { MCE_TK_SILENT_LOCKED, MCE_TKLOCK_MODE_SILENT_LOCKED, TRUE },
 | 
				
			||||||
 | 
					        { MCE_TK_LOCKED_DIM, MCE_TKLOCK_MODE_LOCKED_DIM, TRUE },
 | 
				
			||||||
 | 
					        { MCE_TK_LOCKED_DELAY, MCE_TKLOCK_MODE_LOCKED_DELAY, TRUE },
 | 
				
			||||||
 | 
					        { MCE_TK_SILENT_LOCKED_DIM, MCE_TKLOCK_MODE_SILENT_LOCKED_DIM, TRUE },
 | 
				
			||||||
 | 
					        { MCE_TK_SILENT_UNLOCKED, MCE_TKLOCK_MODE_SILENT_UNLOCKED, FALSE }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i=0; i<G_N_ELEMENTS(mce_tklock_modes); i++) {
 | 
				
			||||||
 | 
					        if (!g_strcmp0(mode, mce_tklock_modes[i].name)) {
 | 
				
			||||||
 | 
					            self->mode = mce_tklock_modes[i].mode;
 | 
				
			||||||
 | 
					            self->locked = mce_tklock_modes[i].locked;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (i == G_N_ELEMENTS(mce_tklock_modes)) {
 | 
				
			||||||
 | 
					        GWARN("Unexpected mode '%s'", mode);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (self->mode != prev_mode) {
 | 
				
			||||||
 | 
					        g_signal_emit(self, mce_tklock_signals[SIGNAL_MODE_CHANGED], 0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (self->locked != prev_locked) {
 | 
				
			||||||
 | 
					        g_signal_emit(self, mce_tklock_signals[SIGNAL_LOCKED_CHANGED], 0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (priv->proxy->valid && !self->valid) {
 | 
				
			||||||
 | 
					        self->valid = TRUE;
 | 
				
			||||||
 | 
					        g_signal_emit(self, mce_tklock_signals[SIGNAL_VALID_CHANGED], 0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_mode_query_done(
 | 
				
			||||||
 | 
					    GObject* proxy,
 | 
				
			||||||
 | 
					    GAsyncResult* result,
 | 
				
			||||||
 | 
					    gpointer arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GError* error = NULL;
 | 
				
			||||||
 | 
					    char* status = NULL;
 | 
				
			||||||
 | 
					    MceTklock* self = MCE_TKLOCK(arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (com_nokia_mce_request_call_get_tklock_mode_finish(
 | 
				
			||||||
 | 
					        COM_NOKIA_MCE_REQUEST(proxy), &status, result, &error)) {
 | 
				
			||||||
 | 
					        GDEBUG("Mode is currently %s", status);
 | 
				
			||||||
 | 
					        mce_tklock_mode_update(self, status);
 | 
				
			||||||
 | 
					        g_free(status);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					         * We could retry but it's probably not worth the trouble
 | 
				
			||||||
 | 
					         * because the next time user locks/unlocks the screen we
 | 
				
			||||||
 | 
					         * receive mce_tklock_mode_ind and sync our state with mce.
 | 
				
			||||||
 | 
					         * Until then, this object stays invalid.
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        GWARN("Failed to query tklock mode %s", GERRMSG(error));
 | 
				
			||||||
 | 
					        g_error_free(error);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    mce_tklock_unref(self);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_mode_query(
 | 
				
			||||||
 | 
					    MceTklock* self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MceProxy* proxy = self->priv->proxy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (proxy->valid) {
 | 
				
			||||||
 | 
					        com_nokia_mce_request_call_get_tklock_mode(proxy->request, NULL,
 | 
				
			||||||
 | 
					            mce_tklock_mode_query_done, mce_tklock_ref(self));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_valid_changed(
 | 
				
			||||||
 | 
					    MceProxy* proxy,
 | 
				
			||||||
 | 
					    void* arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MceTklock* self = MCE_TKLOCK(arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (proxy->valid) {
 | 
				
			||||||
 | 
					        mce_tklock_mode_query(self);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        if (self->valid) {
 | 
				
			||||||
 | 
					            self->valid = FALSE;
 | 
				
			||||||
 | 
					            g_signal_emit(self, mce_tklock_signals[SIGNAL_VALID_CHANGED], 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_mode_ind(
 | 
				
			||||||
 | 
					    ComNokiaMceSignal* proxy,
 | 
				
			||||||
 | 
					    const char* mode,
 | 
				
			||||||
 | 
					    gpointer arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GDEBUG("Mode is %s", mode);
 | 
				
			||||||
 | 
					    mce_tklock_mode_update(MCE_TKLOCK(arg), mode);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================*
 | 
				
			||||||
 | 
					 * API
 | 
				
			||||||
 | 
					 *==========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MceTklock*
 | 
				
			||||||
 | 
					mce_tklock_new()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* MCE assumes one tklock */
 | 
				
			||||||
 | 
					    static MceTklock* mce_tklock_instance = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (mce_tklock_instance) {
 | 
				
			||||||
 | 
					        mce_tklock_ref(mce_tklock_instance);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        mce_tklock_instance = g_object_new(MCE_TKLOCK_TYPE, NULL);
 | 
				
			||||||
 | 
					        mce_tklock_mode_query(mce_tklock_instance);
 | 
				
			||||||
 | 
					        g_object_add_weak_pointer(G_OBJECT(mce_tklock_instance),
 | 
				
			||||||
 | 
					            (gpointer*)(&mce_tklock_instance));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return mce_tklock_instance;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MceTklock*
 | 
				
			||||||
 | 
					mce_tklock_ref(
 | 
				
			||||||
 | 
					    MceTklock* self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (G_LIKELY(self)) {
 | 
				
			||||||
 | 
					        g_object_ref(MCE_TKLOCK(self));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return self;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_unref(
 | 
				
			||||||
 | 
					    MceTklock* self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (G_LIKELY(self)) {
 | 
				
			||||||
 | 
					        g_object_unref(MCE_TKLOCK(self));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulong
 | 
				
			||||||
 | 
					mce_tklock_add_valid_changed_handler(
 | 
				
			||||||
 | 
					    MceTklock* self,
 | 
				
			||||||
 | 
					    MceTklockFunc fn,
 | 
				
			||||||
 | 
					    void* arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return (G_LIKELY(self) && G_LIKELY(fn)) ? g_signal_connect(self,
 | 
				
			||||||
 | 
					        SIGNAL_VALID_CHANGED_NAME, G_CALLBACK(fn), arg) : 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulong
 | 
				
			||||||
 | 
					mce_tklock_add_mode_changed_handler(
 | 
				
			||||||
 | 
					    MceTklock* self,
 | 
				
			||||||
 | 
					    MceTklockFunc fn,
 | 
				
			||||||
 | 
					    void* arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return (G_LIKELY(self) && G_LIKELY(fn)) ? g_signal_connect(self,
 | 
				
			||||||
 | 
					        SIGNAL_MODE_CHANGED_NAME, G_CALLBACK(fn), arg) : 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gulong
 | 
				
			||||||
 | 
					mce_tklock_add_locked_changed_handler(
 | 
				
			||||||
 | 
					    MceTklock* self,
 | 
				
			||||||
 | 
					    MceTklockFunc fn,
 | 
				
			||||||
 | 
					    void* arg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return (G_LIKELY(self) && G_LIKELY(fn)) ? g_signal_connect(self,
 | 
				
			||||||
 | 
					        SIGNAL_LOCKED_CHANGED_NAME, G_CALLBACK(fn), arg) : 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_remove_handler(
 | 
				
			||||||
 | 
					    MceTklock* self,
 | 
				
			||||||
 | 
					    gulong id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (G_LIKELY(self) && G_LIKELY(id)) {
 | 
				
			||||||
 | 
					        g_signal_handler_disconnect(self, id);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_remove_handlers(
 | 
				
			||||||
 | 
					    MceTklock* self,
 | 
				
			||||||
 | 
					    gulong *ids,
 | 
				
			||||||
 | 
					    guint count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    gutil_disconnect_handlers(self, ids, count);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================*
 | 
				
			||||||
 | 
					 * Internals
 | 
				
			||||||
 | 
					 *==========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_init(
 | 
				
			||||||
 | 
					    MceTklock* self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MceTklockPriv* priv = G_TYPE_INSTANCE_GET_PRIVATE(self, MCE_TKLOCK_TYPE,
 | 
				
			||||||
 | 
					        MceTklockPriv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    self->priv = priv;
 | 
				
			||||||
 | 
					    self->mode = MCE_TKLOCK_MODE_LOCKED;
 | 
				
			||||||
 | 
					    self->locked = TRUE;
 | 
				
			||||||
 | 
					    priv->proxy = mce_proxy_new();
 | 
				
			||||||
 | 
					    priv->proxy_valid_id = mce_proxy_add_valid_changed_handler(priv->proxy,
 | 
				
			||||||
 | 
					        mce_tklock_valid_changed, self);
 | 
				
			||||||
 | 
					    priv->tklock_mode_ind_id = g_signal_connect(priv->proxy->signal,
 | 
				
			||||||
 | 
					        MCE_TKLOCK_MODE_SIG, G_CALLBACK(mce_tklock_mode_ind), self);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_finalize(
 | 
				
			||||||
 | 
					    GObject* object)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    MceTklock* self = MCE_TKLOCK(object);
 | 
				
			||||||
 | 
					    MceTklockPriv* priv = self->priv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_signal_handler_disconnect(priv->proxy->signal,
 | 
				
			||||||
 | 
					        priv->tklock_mode_ind_id);
 | 
				
			||||||
 | 
					    mce_proxy_unref(priv->proxy);
 | 
				
			||||||
 | 
					    G_OBJECT_CLASS(PARENT_CLASS)->finalize(object);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					mce_tklock_class_init(
 | 
				
			||||||
 | 
					    MceTklockClass* klass)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GObjectClass* object_class = G_OBJECT_CLASS(klass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    object_class->finalize = mce_tklock_finalize;
 | 
				
			||||||
 | 
					    g_type_class_add_private(klass, sizeof(MceTklockPriv));
 | 
				
			||||||
 | 
					    mce_tklock_signals[SIGNAL_VALID_CHANGED] =
 | 
				
			||||||
 | 
					        g_signal_new(SIGNAL_VALID_CHANGED_NAME,
 | 
				
			||||||
 | 
					            G_OBJECT_CLASS_TYPE(klass), G_SIGNAL_RUN_FIRST,
 | 
				
			||||||
 | 
					            0, NULL, NULL, NULL, G_TYPE_NONE, 0);
 | 
				
			||||||
 | 
					    mce_tklock_signals[SIGNAL_MODE_CHANGED] =
 | 
				
			||||||
 | 
					        g_signal_new(SIGNAL_MODE_CHANGED_NAME,
 | 
				
			||||||
 | 
					            G_OBJECT_CLASS_TYPE(klass), G_SIGNAL_RUN_FIRST,
 | 
				
			||||||
 | 
					            0, NULL, NULL, NULL, G_TYPE_NONE, 0);
 | 
				
			||||||
 | 
					    mce_tklock_signals[SIGNAL_LOCKED_CHANGED] =
 | 
				
			||||||
 | 
					        g_signal_new(SIGNAL_LOCKED_CHANGED_NAME,
 | 
				
			||||||
 | 
					            G_OBJECT_CLASS_TYPE(klass), G_SIGNAL_RUN_FIRST,
 | 
				
			||||||
 | 
					            0, NULL, NULL, NULL, G_TYPE_NONE, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
		Reference in New Issue
	
	Block a user