6ec5b97af70d20ba9c77d67c12a32599bfb47926
[browser-dbus-bridge.git] / xpcom-dbusservice / DBusSignal.cpp
1 /**
2  * Browser D-Bus Bridge, XPCOM version
3  *
4  * Copyright © 2008 Movial Creative Technologies Inc
5  *  Contact: Movial Creative Technologies Inc, <info@movial.com>
6  *  Authors: Lauri Mylläri, <lauri.myllari@movial.fi>
7  *           Kalle Vahlman, <kalle.vahlman@movial.com>
8  *
9  * The contents of this file are subject to the Mozilla Public License
10  * Version 1.1 (the "License"); you may not use this file except in
11  * compliance with the License. You may obtain a copy of the License at
12  * http://www.mozilla.org/MPL/
13  *
14  * Software distributed under the License is distributed on an "AS IS"
15  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
16  * License for the specific language governing rights and limitations
17  * under the License.
18  *
19  * The Original Code is the Browser D-Bus Bridge, XPCOM version.
20  *
21  * The Initial Developer of the Original Code is Movial Creative Technologies
22  * Inc. Portions created by Initial Developer are Copyright (C) 2008
23  * Movial Creative Technologies Inc. All Rights Reserved.
24  *
25  */
26
27 #include <stdio.h>
28
29 #include "IDBusService.h"
30
31 #include "DBusSignal.h"
32
33 #include "bdb-debug.h"
34
35
36 //
37 // DBusSignal implementation
38 //
39
40 NS_IMPL_ISUPPORTS2(DBusSignal, IDBusSignal, nsISupportsWeakReference)
41
42 DBusSignal::DBusSignal(DBusService *aDBusService,
43                        PRUint32 aBusType,
44                        const nsACString& aInterface,
45                        const nsACString& aSignal,
46                        const nsACString& aSender,
47                        const nsACString& aObject) :
48     mDBusService(aDBusService),
49     mBusType(aBusType),
50     mInterface(aInterface),
51     mSignal(aSignal),
52     mSender(aSender),
53     mObject(aObject),
54     mCallback(0),
55     mEnabled(PR_FALSE),
56     mFilterActive(PR_FALSE)
57 {
58     BDBLOG(("DBusSignal::DBusSignal()\n"));
59     BDBLOG(("  mBusType   : %d\n", mBusType));
60     BDBLOG(("  aInterface : %s\n", PromiseFlatCString(aInterface).get()));
61     BDBLOG(("  aSignal    : %s\n", PromiseFlatCString(aSignal).get()));
62     BDBLOG(("  aSender    : %s\n", PromiseFlatCString(aSender).get()));
63     BDBLOG(("  aObject    : %s\n", PromiseFlatCString(aObject).get()));
64     BDBLOG(("  mEnabled   : %d\n", mEnabled));
65 }
66
67 DBusSignal::~DBusSignal()
68 {
69     BDBLOG(("DBusSignal::~DBusSignal()\n"));
70     if (mFilterActive)
71         filterDisable();
72     if (mCallback)
73         NS_RELEASE(mCallback);
74 }
75
76 NS_IMETHODIMP
77 DBusSignal::GetOnEmit(IDBusSignalObserver **aCallback)
78 {
79     BDBLOG(("DBusSignal::GetOnEmit()\n"));
80     NS_IF_ADDREF(*aCallback = mCallback);
81     return NS_OK;
82 }
83
84 NS_IMETHODIMP
85 DBusSignal::SetOnEmit(IDBusSignalObserver *aCallback)
86 {
87     BDBLOG(("DBusSignal::SetOnEmit(%08x)\n", aCallback));
88     if (mCallback)
89     {
90         if (mFilterActive)
91             filterDisable();
92         NS_RELEASE(mCallback);
93     }
94     mCallback = aCallback;
95     NS_IF_ADDREF(mCallback);
96     if (mEnabled && mCallback)
97         filterEnable();
98     return NS_OK;
99 }
100
101 NS_IMETHODIMP
102 DBusSignal::GetEnabled(PRBool *aEnabled)
103 {
104     BDBLOG(("DBusSignal::GetEnabled()\n"));
105     *aEnabled = mEnabled;
106     return NS_OK;
107 }
108
109 NS_IMETHODIMP
110 DBusSignal::SetEnabled(PRBool aEnabled)
111 {
112     BDBLOG(("DBusSignal::SetEnabled(%s)\n", aEnabled ? "PR_TRUE" : "PR_FALSE"));
113
114     if (aEnabled && !mCallback)
115     {
116         BDBLOG(("  ERROR: trying to enable with no onEmit set!\n"));
117         return NS_ERROR_NOT_AVAILABLE;
118     }
119
120     /* change filter state if necessary */
121     if (mFilterActive && !aEnabled)
122         filterDisable();
123     if (!mFilterActive && aEnabled && mCallback)
124         filterEnable();
125
126     mEnabled = aEnabled;
127
128 }
129
130 NS_IMETHODIMP
131 DBusSignal::GetBusType(PRUint32 *aBusType)
132 {
133     *aBusType = mBusType;
134     return NS_OK;
135 }
136
137 NS_IMETHODIMP
138 DBusSignal::GetInterfaceName(nsACString& aInterface)
139 {
140     aInterface.Assign(mInterface);
141     return NS_OK;
142 }
143
144 NS_IMETHODIMP
145 DBusSignal::GetSignalName(nsACString& aSignal)
146 {
147     aSignal.Assign(mSignal);
148     return NS_OK;
149 }
150
151 NS_IMETHODIMP
152 DBusSignal::GetSender(nsACString& aSender)
153 {
154     aSender.Assign(mSender);
155     return NS_OK;
156 }
157
158 NS_IMETHODIMP
159 DBusSignal::GetObjectPath(nsACString& aObject)
160 {
161     aObject.Assign(mObject);
162     return NS_OK;
163 }
164
165 void
166 DBusSignal::filterEnable()
167 {
168     BDBLOG(("DBusSignal::filterEnable()\n"));
169     mFilterActive = PR_TRUE;
170
171     mDBusService->AddSignalObserver(this);
172 }
173
174 void
175 DBusSignal::filterDisable()
176 {
177     BDBLOG(("DBusSignal::filterDisable()\n"));
178     mFilterActive = PR_FALSE;
179     
180     mDBusService->RemoveSignalObserver(this);
181 }
182
183 /* vim: set cindent ts=4 et sw=4: */