[XPCOM] Keep the JS context with the Service/Method objects, we
[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                        JSContext *cx) :
49     mDBusService(aDBusService),
50     mBusType(aBusType),
51     mInterface(aInterface),
52     mSignal(aSignal),
53     mSender(aSender),
54     mObject(aObject),
55     mCallback(0),
56     mEnabled(PR_FALSE),
57     mFilterActive(PR_FALSE),
58     mJScx(cx)
59 {
60     BDBLOG(("DBusSignal::DBusSignal()\n"));
61     BDBLOG(("  mBusType   : %d\n", mBusType));
62     BDBLOG(("  aInterface : %s\n", PromiseFlatCString(aInterface).get()));
63     BDBLOG(("  aSignal    : %s\n", PromiseFlatCString(aSignal).get()));
64     BDBLOG(("  aSender    : %s\n", PromiseFlatCString(aSender).get()));
65     BDBLOG(("  aObject    : %s\n", PromiseFlatCString(aObject).get()));
66     BDBLOG(("  mEnabled   : %d\n", mEnabled));
67 }
68
69 DBusSignal::~DBusSignal()
70 {
71     BDBLOG(("DBusSignal::~DBusSignal()\n"));
72     if (mFilterActive)
73         filterDisable();
74     if (mCallback)
75         NS_RELEASE(mCallback);
76 }
77
78 NS_IMETHODIMP
79 DBusSignal::GetOnEmit(IDBusSignalObserver **aCallback)
80 {
81     BDBLOG(("DBusSignal::GetOnEmit()\n"));
82     NS_IF_ADDREF(*aCallback = mCallback);
83     return NS_OK;
84 }
85
86 NS_IMETHODIMP
87 DBusSignal::SetOnEmit(IDBusSignalObserver *aCallback)
88 {
89     BDBLOG(("DBusSignal::SetOnEmit(%08x)\n", aCallback));
90     if (mCallback)
91     {
92         if (mFilterActive)
93             filterDisable();
94         NS_RELEASE(mCallback);
95     }
96     mCallback = aCallback;
97     NS_IF_ADDREF(mCallback);
98     if (mEnabled && mCallback)
99         filterEnable();
100     return NS_OK;
101 }
102
103 NS_IMETHODIMP
104 DBusSignal::GetEnabled(PRBool *aEnabled)
105 {
106     BDBLOG(("DBusSignal::GetEnabled()\n"));
107     *aEnabled = mEnabled;
108     return NS_OK;
109 }
110
111 NS_IMETHODIMP
112 DBusSignal::SetEnabled(PRBool aEnabled)
113 {
114     BDBLOG(("DBusSignal::SetEnabled(%s)\n", aEnabled ? "PR_TRUE" : "PR_FALSE"));
115
116     if (aEnabled && !mCallback)
117     {
118         BDBLOG(("  ERROR: trying to enable with no onEmit set!\n"));
119         return NS_ERROR_NOT_AVAILABLE;
120     }
121
122     /* change filter state if necessary */
123     if (mFilterActive && !aEnabled)
124         filterDisable();
125     if (!mFilterActive && aEnabled && mCallback)
126         filterEnable();
127
128     mEnabled = aEnabled;
129
130 }
131
132 NS_IMETHODIMP
133 DBusSignal::GetBusType(PRUint32 *aBusType)
134 {
135     *aBusType = mBusType;
136     return NS_OK;
137 }
138
139 NS_IMETHODIMP
140 DBusSignal::GetInterfaceName(nsACString& aInterface)
141 {
142     aInterface.Assign(mInterface);
143     return NS_OK;
144 }
145
146 NS_IMETHODIMP
147 DBusSignal::GetSignalName(nsACString& aSignal)
148 {
149     aSignal.Assign(mSignal);
150     return NS_OK;
151 }
152
153 NS_IMETHODIMP
154 DBusSignal::GetSender(nsACString& aSender)
155 {
156     aSender.Assign(mSender);
157     return NS_OK;
158 }
159
160 NS_IMETHODIMP
161 DBusSignal::GetObjectPath(nsACString& aObject)
162 {
163     aObject.Assign(mObject);
164     return NS_OK;
165 }
166
167 NS_IMETHODIMP
168 DBusSignal::GetJSContext(JSContext **aJSContext)
169 {
170     *aJSContext = mJScx;
171     return NS_OK;
172 }
173
174 void
175 DBusSignal::filterEnable()
176 {
177     BDBLOG(("DBusSignal::filterEnable()\n"));
178     mFilterActive = PR_TRUE;
179
180     mDBusService->AddSignalObserver(this);
181 }
182
183 void
184 DBusSignal::filterDisable()
185 {
186     BDBLOG(("DBusSignal::filterDisable()\n"));
187     mFilterActive = PR_FALSE;
188     
189     mDBusService->RemoveSignalObserver(this);
190 }
191
192 /* vim: set cindent ts=4 et sw=4: */