dom/mobilemessage/src/ipc/SmsChild.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 /* This Source Code Form is subject to the terms of the Mozilla Public
michael@0 2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
michael@0 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
michael@0 4
michael@0 5 #include "SmsChild.h"
michael@0 6 #include "SmsMessage.h"
michael@0 7 #include "MmsMessage.h"
michael@0 8 #include "SmsSegmentInfo.h"
michael@0 9 #include "nsIObserverService.h"
michael@0 10 #include "mozilla/Services.h"
michael@0 11 #include "mozilla/dom/ContentChild.h"
michael@0 12 #include "mozilla/dom/mobilemessage/Constants.h" // For MessageType
michael@0 13 #include "MobileMessageThread.h"
michael@0 14 #include "MainThreadUtils.h"
michael@0 15
michael@0 16 using namespace mozilla;
michael@0 17 using namespace mozilla::dom;
michael@0 18 using namespace mozilla::dom::mobilemessage;
michael@0 19
michael@0 20 namespace {
michael@0 21
michael@0 22 already_AddRefed<nsISupports>
michael@0 23 CreateMessageFromMessageData(const MobileMessageData& aData)
michael@0 24 {
michael@0 25 nsCOMPtr<nsISupports> message;
michael@0 26
michael@0 27 switch(aData.type()) {
michael@0 28 case MobileMessageData::TMmsMessageData:
michael@0 29 message = new MmsMessage(aData.get_MmsMessageData());
michael@0 30 break;
michael@0 31 case MobileMessageData::TSmsMessageData:
michael@0 32 message = new SmsMessage(aData.get_SmsMessageData());
michael@0 33 break;
michael@0 34 default:
michael@0 35 MOZ_CRASH("Unexpected type of MobileMessageData");
michael@0 36 }
michael@0 37
michael@0 38 return message.forget();
michael@0 39 }
michael@0 40
michael@0 41 void
michael@0 42 NotifyObserversWithMobileMessage(const char* aEventName,
michael@0 43 const MobileMessageData& aData)
michael@0 44 {
michael@0 45 nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
michael@0 46 if (!obs) {
michael@0 47 return;
michael@0 48 }
michael@0 49
michael@0 50 nsCOMPtr<nsISupports> msg = CreateMessageFromMessageData(aData);
michael@0 51 obs->NotifyObservers(msg, aEventName, nullptr);
michael@0 52 }
michael@0 53
michael@0 54 } // anonymous namespace
michael@0 55
michael@0 56 namespace mozilla {
michael@0 57 namespace dom {
michael@0 58 namespace mobilemessage {
michael@0 59
michael@0 60 void
michael@0 61 SmsChild::ActorDestroy(ActorDestroyReason aWhy)
michael@0 62 {
michael@0 63 }
michael@0 64
michael@0 65 bool
michael@0 66 SmsChild::RecvNotifyReceivedMessage(const MobileMessageData& aData)
michael@0 67 {
michael@0 68 NotifyObserversWithMobileMessage(kSmsReceivedObserverTopic, aData);
michael@0 69 return true;
michael@0 70 }
michael@0 71
michael@0 72 bool
michael@0 73 SmsChild::RecvNotifyRetrievingMessage(const MobileMessageData& aData)
michael@0 74 {
michael@0 75 NotifyObserversWithMobileMessage(kSmsRetrievingObserverTopic, aData);
michael@0 76 return true;
michael@0 77 }
michael@0 78
michael@0 79 bool
michael@0 80 SmsChild::RecvNotifySendingMessage(const MobileMessageData& aData)
michael@0 81 {
michael@0 82 NotifyObserversWithMobileMessage(kSmsSendingObserverTopic, aData);
michael@0 83 return true;
michael@0 84 }
michael@0 85
michael@0 86 bool
michael@0 87 SmsChild::RecvNotifySentMessage(const MobileMessageData& aData)
michael@0 88 {
michael@0 89 NotifyObserversWithMobileMessage(kSmsSentObserverTopic, aData);
michael@0 90 return true;
michael@0 91 }
michael@0 92
michael@0 93 bool
michael@0 94 SmsChild::RecvNotifyFailedMessage(const MobileMessageData& aData)
michael@0 95 {
michael@0 96 NotifyObserversWithMobileMessage(kSmsFailedObserverTopic, aData);
michael@0 97 return true;
michael@0 98 }
michael@0 99
michael@0 100 bool
michael@0 101 SmsChild::RecvNotifyDeliverySuccessMessage(const MobileMessageData& aData)
michael@0 102 {
michael@0 103 NotifyObserversWithMobileMessage(kSmsDeliverySuccessObserverTopic, aData);
michael@0 104 return true;
michael@0 105 }
michael@0 106
michael@0 107 bool
michael@0 108 SmsChild::RecvNotifyDeliveryErrorMessage(const MobileMessageData& aData)
michael@0 109 {
michael@0 110 NotifyObserversWithMobileMessage(kSmsDeliveryErrorObserverTopic, aData);
michael@0 111 return true;
michael@0 112 }
michael@0 113
michael@0 114 bool
michael@0 115 SmsChild::RecvNotifyReceivedSilentMessage(const MobileMessageData& aData)
michael@0 116 {
michael@0 117 NotifyObserversWithMobileMessage(kSilentSmsReceivedObserverTopic, aData);
michael@0 118 return true;
michael@0 119 }
michael@0 120
michael@0 121 bool
michael@0 122 SmsChild::RecvNotifyReadSuccessMessage(const MobileMessageData& aData)
michael@0 123 {
michael@0 124 NotifyObserversWithMobileMessage(kSmsReadSuccessObserverTopic, aData);
michael@0 125 return true;
michael@0 126 }
michael@0 127
michael@0 128 bool
michael@0 129 SmsChild::RecvNotifyReadErrorMessage(const MobileMessageData& aData)
michael@0 130 {
michael@0 131 NotifyObserversWithMobileMessage(kSmsReadErrorObserverTopic, aData);
michael@0 132 return true;
michael@0 133 }
michael@0 134
michael@0 135 PSmsRequestChild*
michael@0 136 SmsChild::AllocPSmsRequestChild(const IPCSmsRequest& aRequest)
michael@0 137 {
michael@0 138 MOZ_CRASH("Caller is supposed to manually construct a request!");
michael@0 139 }
michael@0 140
michael@0 141 bool
michael@0 142 SmsChild::DeallocPSmsRequestChild(PSmsRequestChild* aActor)
michael@0 143 {
michael@0 144 delete aActor;
michael@0 145 return true;
michael@0 146 }
michael@0 147
michael@0 148 PMobileMessageCursorChild*
michael@0 149 SmsChild::AllocPMobileMessageCursorChild(const IPCMobileMessageCursor& aCursor)
michael@0 150 {
michael@0 151 MOZ_CRASH("Caller is supposed to manually construct a cursor!");
michael@0 152 }
michael@0 153
michael@0 154 bool
michael@0 155 SmsChild::DeallocPMobileMessageCursorChild(PMobileMessageCursorChild* aActor)
michael@0 156 {
michael@0 157 // MobileMessageCursorChild is refcounted, must not be freed manually.
michael@0 158 // Originally AddRefed in SendCursorRequest() in SmsIPCService.cpp.
michael@0 159 static_cast<MobileMessageCursorChild*>(aActor)->Release();
michael@0 160 return true;
michael@0 161 }
michael@0 162
michael@0 163 /*******************************************************************************
michael@0 164 * SmsRequestChild
michael@0 165 ******************************************************************************/
michael@0 166
michael@0 167 SmsRequestChild::SmsRequestChild(nsIMobileMessageCallback* aReplyRequest)
michael@0 168 : mReplyRequest(aReplyRequest)
michael@0 169 {
michael@0 170 MOZ_COUNT_CTOR(SmsRequestChild);
michael@0 171 MOZ_ASSERT(aReplyRequest);
michael@0 172 }
michael@0 173
michael@0 174 void
michael@0 175 SmsRequestChild::ActorDestroy(ActorDestroyReason aWhy)
michael@0 176 {
michael@0 177 // Nothing needed here.
michael@0 178 }
michael@0 179
michael@0 180 bool
michael@0 181 SmsRequestChild::Recv__delete__(const MessageReply& aReply)
michael@0 182 {
michael@0 183 MOZ_ASSERT(NS_IsMainThread());
michael@0 184 MOZ_ASSERT(mReplyRequest);
michael@0 185 nsCOMPtr<SmsMessage> message;
michael@0 186 switch(aReply.type()) {
michael@0 187 case MessageReply::TReplyMessageSend: {
michael@0 188 const MobileMessageData& data =
michael@0 189 aReply.get_ReplyMessageSend().messageData();
michael@0 190 nsCOMPtr<nsISupports> msg = CreateMessageFromMessageData(data);
michael@0 191 mReplyRequest->NotifyMessageSent(msg);
michael@0 192 }
michael@0 193 break;
michael@0 194 case MessageReply::TReplyMessageSendFail:
michael@0 195 mReplyRequest->NotifySendMessageFailed(aReply.get_ReplyMessageSendFail().error());
michael@0 196 break;
michael@0 197 case MessageReply::TReplyGetMessage: {
michael@0 198 const MobileMessageData& data =
michael@0 199 aReply.get_ReplyGetMessage().messageData();
michael@0 200 nsCOMPtr<nsISupports> msg = CreateMessageFromMessageData(data);
michael@0 201 mReplyRequest->NotifyMessageGot(msg);
michael@0 202 }
michael@0 203 break;
michael@0 204 case MessageReply::TReplyGetMessageFail:
michael@0 205 mReplyRequest->NotifyGetMessageFailed(aReply.get_ReplyGetMessageFail().error());
michael@0 206 break;
michael@0 207 case MessageReply::TReplyMessageDelete: {
michael@0 208 const InfallibleTArray<bool>& deletedResult = aReply.get_ReplyMessageDelete().deleted();
michael@0 209 mReplyRequest->NotifyMessageDeleted(const_cast<bool *>(deletedResult.Elements()),
michael@0 210 deletedResult.Length());
michael@0 211 }
michael@0 212 break;
michael@0 213 case MessageReply::TReplyMessageDeleteFail:
michael@0 214 mReplyRequest->NotifyDeleteMessageFailed(aReply.get_ReplyMessageDeleteFail().error());
michael@0 215 break;
michael@0 216 case MessageReply::TReplyMarkeMessageRead:
michael@0 217 mReplyRequest->NotifyMessageMarkedRead(aReply.get_ReplyMarkeMessageRead().read());
michael@0 218 break;
michael@0 219 case MessageReply::TReplyMarkeMessageReadFail:
michael@0 220 mReplyRequest->NotifyMarkMessageReadFailed(aReply.get_ReplyMarkeMessageReadFail().error());
michael@0 221 break;
michael@0 222 case MessageReply::TReplyGetSegmentInfoForText: {
michael@0 223 const SmsSegmentInfoData& data =
michael@0 224 aReply.get_ReplyGetSegmentInfoForText().infoData();
michael@0 225 nsCOMPtr<nsIDOMMozSmsSegmentInfo> info = new SmsSegmentInfo(data);
michael@0 226 mReplyRequest->NotifySegmentInfoForTextGot(info);
michael@0 227 }
michael@0 228 break;
michael@0 229 case MessageReply::TReplyGetSegmentInfoForTextFail:
michael@0 230 mReplyRequest->NotifyGetSegmentInfoForTextFailed(
michael@0 231 aReply.get_ReplyGetSegmentInfoForTextFail().error());
michael@0 232 break;
michael@0 233 case MessageReply::TReplyGetSmscAddress:
michael@0 234 mReplyRequest->NotifyGetSmscAddress(aReply.get_ReplyGetSmscAddress().smscAddress());
michael@0 235 break;
michael@0 236 case MessageReply::TReplyGetSmscAddressFail:
michael@0 237 mReplyRequest->NotifyGetSmscAddressFailed(aReply.get_ReplyGetSmscAddressFail().error());
michael@0 238 break;
michael@0 239 default:
michael@0 240 MOZ_CRASH("Received invalid response parameters!");
michael@0 241 }
michael@0 242
michael@0 243 return true;
michael@0 244 }
michael@0 245
michael@0 246 /*******************************************************************************
michael@0 247 * MobileMessageCursorChild
michael@0 248 ******************************************************************************/
michael@0 249
michael@0 250 NS_IMPL_ISUPPORTS(MobileMessageCursorChild, nsICursorContinueCallback)
michael@0 251
michael@0 252 MobileMessageCursorChild::MobileMessageCursorChild(nsIMobileMessageCursorCallback* aCallback)
michael@0 253 : mCursorCallback(aCallback)
michael@0 254 {
michael@0 255 MOZ_COUNT_CTOR(MobileMessageCursorChild);
michael@0 256 MOZ_ASSERT(aCallback);
michael@0 257 }
michael@0 258
michael@0 259 void
michael@0 260 MobileMessageCursorChild::ActorDestroy(ActorDestroyReason aWhy)
michael@0 261 {
michael@0 262 // Nothing needed here.
michael@0 263 }
michael@0 264
michael@0 265 bool
michael@0 266 MobileMessageCursorChild::RecvNotifyResult(const MobileMessageCursorData& aData)
michael@0 267 {
michael@0 268 MOZ_ASSERT(mCursorCallback);
michael@0 269
michael@0 270 nsCOMPtr<nsISupports> result;
michael@0 271 switch(aData.type()) {
michael@0 272 case MobileMessageCursorData::TMmsMessageData:
michael@0 273 result = new MmsMessage(aData.get_MmsMessageData());
michael@0 274 break;
michael@0 275 case MobileMessageCursorData::TSmsMessageData:
michael@0 276 result = new SmsMessage(aData.get_SmsMessageData());
michael@0 277 break;
michael@0 278 case MobileMessageCursorData::TThreadData:
michael@0 279 result = new MobileMessageThread(aData.get_ThreadData());
michael@0 280 break;
michael@0 281 default:
michael@0 282 MOZ_CRASH("Received invalid response parameters!");
michael@0 283 }
michael@0 284
michael@0 285 mCursorCallback->NotifyCursorResult(result);
michael@0 286 return true;
michael@0 287 }
michael@0 288
michael@0 289 bool
michael@0 290 MobileMessageCursorChild::Recv__delete__(const int32_t& aError)
michael@0 291 {
michael@0 292 MOZ_ASSERT(mCursorCallback);
michael@0 293
michael@0 294 if (aError != nsIMobileMessageCallback::SUCCESS_NO_ERROR) {
michael@0 295 mCursorCallback->NotifyCursorError(aError);
michael@0 296 } else {
michael@0 297 mCursorCallback->NotifyCursorDone();
michael@0 298 }
michael@0 299 mCursorCallback = nullptr;
michael@0 300
michael@0 301 return true;
michael@0 302 }
michael@0 303
michael@0 304 // nsICursorContinueCallback
michael@0 305
michael@0 306 NS_IMETHODIMP
michael@0 307 MobileMessageCursorChild::HandleContinue()
michael@0 308 {
michael@0 309 MOZ_ASSERT(mCursorCallback);
michael@0 310
michael@0 311 SendContinue();
michael@0 312 return NS_OK;
michael@0 313 }
michael@0 314
michael@0 315 } // namespace mobilemessage
michael@0 316 } // namespace dom
michael@0 317 } // namespace mozilla

mercurial