Bug 674725 - Part AP - Implementation of cursor.continue() in the DOM code. r=smaug

This commit is contained in:
Mounir Lamouri 2012-01-17 19:42:39 +01:00
Родитель f57e963193
Коммит 9a5b88b84e
13 изменённых файлов: 104 добавлений и 9 удалений

Просмотреть файл

@ -45,7 +45,7 @@
interface nsIDOMMozSmsFilter; interface nsIDOMMozSmsFilter;
[scriptable, function, uuid(33358749-d1b3-4bd6-835c-ef3869f0e966)] [scriptable, function, uuid(a253ec42-142e-490b-a479-1e9c605c0a58)]
interface nsISmsDatabaseService : nsISupports interface nsISmsDatabaseService : nsISupports
{ {
// Takes some information required to save the message and returns its id. // Takes some information required to save the message and returns its id.
@ -55,4 +55,5 @@ interface nsISmsDatabaseService : nsISupports
void deleteMessage(in long messageId, in long requestId, [optional] in unsigned long long processId); void deleteMessage(in long messageId, in long requestId, [optional] in unsigned long long processId);
void createMessageList(in nsIDOMMozSmsFilter filter, in boolean reverse, in long requestId, [optional] in unsigned long long processId); void createMessageList(in nsIDOMMozSmsFilter filter, in boolean reverse, in long requestId, [optional] in unsigned long long processId);
void getNextMessageInList(in long listId, in long requestId, in unsigned long long processId);
}; };

Просмотреть файл

@ -41,6 +41,9 @@
#include "nsIDOMSmsFilter.h" #include "nsIDOMSmsFilter.h"
#include "nsIDOMSmsMessage.h" #include "nsIDOMSmsMessage.h"
#include "nsIDOMSmsRequest.h" #include "nsIDOMSmsRequest.h"
#include "SmsRequest.h"
#include "SmsRequestManager.h"
#include "nsISmsDatabaseService.h"
DOMCI_DATA(MozSmsCursor, mozilla::dom::sms::SmsCursor) DOMCI_DATA(MozSmsCursor, mozilla::dom::sms::SmsCursor)
@ -60,12 +63,14 @@ NS_IMPL_CYCLE_COLLECTING_ADDREF(SmsCursor)
NS_IMPL_CYCLE_COLLECTING_RELEASE(SmsCursor) NS_IMPL_CYCLE_COLLECTING_RELEASE(SmsCursor)
SmsCursor::SmsCursor(nsIDOMMozSmsFilter* aFilter) SmsCursor::SmsCursor(nsIDOMMozSmsFilter* aFilter)
: mFilter(aFilter) : mListId(-1)
, mFilter(aFilter)
{ {
} }
SmsCursor::SmsCursor(nsIDOMMozSmsFilter* aFilter, nsIDOMMozSmsRequest* aRequest) SmsCursor::SmsCursor(PRInt32 aListId, nsIDOMMozSmsFilter* aFilter, nsIDOMMozSmsRequest* aRequest)
: mFilter(aFilter) : mListId(aListId)
, mFilter(aFilter)
, mRequest(aRequest) , mRequest(aRequest)
{ {
} }
@ -92,9 +97,16 @@ SmsCursor::Continue()
return NS_ERROR_DOM_INVALID_STATE_ERR; return NS_ERROR_DOM_INVALID_STATE_ERR;
} }
// TODO: ask for the next message and reset the request mMessage = nsnull;
// TODO: add the associated request to the request manager static_cast<SmsRequest*>(mRequest.get())->Reset();
// and send the id to the backend
PRInt32 requestId = SmsRequestManager::GetInstance()->AddRequest(mRequest);
nsCOMPtr<nsISmsDatabaseService> smsDBService =
do_GetService(SMS_DATABASE_SERVICE_CONTRACTID);
NS_ENSURE_TRUE(smsDBService, NS_ERROR_FAILURE);
smsDBService->GetNextMessageInList(mListId, requestId, 0);
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -59,11 +59,12 @@ public:
NS_DECL_CYCLE_COLLECTION_CLASS(SmsCursor) NS_DECL_CYCLE_COLLECTION_CLASS(SmsCursor)
SmsCursor(nsIDOMMozSmsFilter* aFilter); SmsCursor(nsIDOMMozSmsFilter* aFilter);
SmsCursor(nsIDOMMozSmsFilter* aFilter, nsIDOMMozSmsRequest* aRequest); SmsCursor(PRInt32 aListId, nsIDOMMozSmsFilter* aFilter, nsIDOMMozSmsRequest* aRequest);
void SetMessage(nsIDOMMozSmsMessage* aMessage); void SetMessage(nsIDOMMozSmsMessage* aMessage);
private: private:
PRInt32 mListId;
nsCOMPtr<nsIDOMMozSmsFilter> mFilter; nsCOMPtr<nsIDOMMozSmsFilter> mFilter;
nsCOMPtr<nsIDOMMozSmsRequest> mRequest; nsCOMPtr<nsIDOMMozSmsRequest> mRequest;
nsCOMPtr<nsIDOMMozSmsMessage> mMessage; nsCOMPtr<nsIDOMMozSmsMessage> mMessage;

Просмотреть файл

@ -105,6 +105,21 @@ SmsRequest::~SmsRequest()
} }
} }
void
SmsRequest::Reset()
{
NS_ASSERTION(mDone, "mDone should be true if we try to reset!");
NS_ASSERTION(mResult != JSVAL_VOID, "mResult should be set if we try to reset!");
NS_ASSERTION(mError == eNoError, "There should be no error if we try to reset!");
if (mResultRooted) {
UnrootResult();
}
mResult = JSVAL_VOID;
mDone = false;
}
void void
SmsRequest::RootResult() SmsRequest::RootResult()
{ {

Просмотреть файл

@ -75,6 +75,8 @@ public:
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(SmsRequest, NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(SmsRequest,
nsDOMEventTargetWrapperCache) nsDOMEventTargetWrapperCache)
void Reset();
private: private:
SmsRequest() MOZ_DELETE; SmsRequest() MOZ_DELETE;

Просмотреть файл

@ -76,6 +76,26 @@ SmsRequestManager::GetInstance()
return sInstance; return sInstance;
} }
PRInt32
SmsRequestManager::AddRequest(nsIDOMMozSmsRequest* aRequest)
{
// TODO: merge with CreateRequest
PRInt32 size = mRequests.Count();
// Look for empty slots.
for (PRInt32 i=0; i<size; ++i) {
if (mRequests[i]) {
continue;
}
mRequests.ReplaceObjectAt(aRequest, i);
return i;
}
mRequests.AppendObject(aRequest);
return size;
}
PRInt32 PRInt32
SmsRequestManager::CreateRequest(nsPIDOMWindow* aWindow, SmsRequestManager::CreateRequest(nsPIDOMWindow* aWindow,
nsIScriptContext* aScriptContext, nsIScriptContext* aScriptContext,
@ -204,7 +224,7 @@ SmsRequestManager::NotifyCreateMessageList(PRInt32 aRequestId, PRInt32 aListId,
// TODO: use Filter! // TODO: use Filter!
SmsRequest* request = GetRequest(aRequestId); SmsRequest* request = GetRequest(aRequestId);
nsCOMPtr<SmsCursor> cursor = new SmsCursor(nsnull, request); nsCOMPtr<SmsCursor> cursor = new SmsCursor(aListId, nsnull, request);
cursor->SetMessage(aMessage); cursor->SetMessage(aMessage);
NotifySuccess<nsIDOMMozSmsCursor*>(aRequestId, cursor); NotifySuccess<nsIDOMMozSmsCursor*>(aRequestId, cursor);

Просмотреть файл

@ -62,6 +62,8 @@ public:
nsIScriptContext* aScriptContext, nsIScriptContext* aScriptContext,
nsIDOMMozSmsRequest** aRequest); nsIDOMMozSmsRequest** aRequest);
PRInt32 AddRequest(nsIDOMMozSmsRequest* aRequest);
void NotifySmsSent(PRInt32 aRequestId, nsIDOMMozSmsMessage* aMessage); void NotifySmsSent(PRInt32 aRequestId, nsIDOMMozSmsMessage* aMessage);
void NotifySmsSendFailed(PRInt32 aRequestId, SmsRequest::ErrorType aError); void NotifySmsSendFailed(PRInt32 aRequestId, SmsRequest::ErrorType aError);
void NotifyGotSms(PRInt32 aRequestId, nsIDOMMozSmsMessage* aMessage); void NotifyGotSms(PRInt32 aRequestId, nsIDOMMozSmsMessage* aMessage);

Просмотреть файл

@ -99,6 +99,14 @@ SmsDatabaseService::CreateMessageList(nsIDOMMozSmsFilter* aFilter,
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
SmsDatabaseService::GetNextMessageInList(PRInt32 aListId, PRInt32 aRequestId,
PRUint64 aProcessId)
{
// TODO: implement
return NS_OK;
}
} // namespace sms } // namespace sms
} // namespace dom } // namespace dom
} // namespace mozilla } // namespace mozilla

Просмотреть файл

@ -78,6 +78,14 @@ SmsDatabaseService::CreateMessageList(nsIDOMMozSmsFilter* aFilter,
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
SmsDatabaseService::GetNextMessageInList(PRInt32 aListId, PRInt32 aRequestId,
PRUint64 aProcessId)
{
NS_ERROR("We should not be here!");
return NS_OK;
}
} // namespace sms } // namespace sms
} // namespace dom } // namespace dom
} // namespace mozilla } // namespace mozilla

Просмотреть файл

@ -113,6 +113,8 @@ parent:
CreateMessageList(SmsFilterData aFilter, bool aReverse, PRInt32 aRequestId, PRUint64 aProcessId); CreateMessageList(SmsFilterData aFilter, bool aReverse, PRInt32 aRequestId, PRUint64 aProcessId);
GetNextMessageInList(PRInt32 aListId, PRInt32 aRequestId, PRUint64 aProcessId);
__delete__(); __delete__();
}; };

Просмотреть файл

@ -147,6 +147,15 @@ SmsIPCService::CreateMessageList(nsIDOMMozSmsFilter* aFilter, bool aReverse,
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
SmsIPCService::GetNextMessageInList(PRInt32 aListId, PRInt32 aRequestId,
PRUint64 aProcessId)
{
GetSmsChild()->SendGetNextMessageInList(aListId, aRequestId,
ContentChild::GetSingleton()->GetID());
return NS_OK;
}
} // namespace sms } // namespace sms
} // namespace dom } // namespace dom
} // namespace mozilla } // namespace mozilla

Просмотреть файл

@ -233,6 +233,20 @@ SmsParent::RecvCreateMessageList(const SmsFilterData& aFilter,
return true; return true;
} }
bool
SmsParent::RecvGetNextMessageInList(const PRInt32& aListId,
const PRInt32& aRequestId,
const PRUint64& aProcessId)
{
nsCOMPtr<nsISmsDatabaseService> smsDBService =
do_GetService(SMS_DATABASE_SERVICE_CONTRACTID);
NS_ENSURE_TRUE(smsDBService, true);
smsDBService->GetNextMessageInList(aListId, aRequestId, aProcessId);
return true;
}
} // namespace sms } // namespace sms
} // namespace dom } // namespace dom
} // namespace mozilla } // namespace mozilla

Просмотреть файл

@ -63,6 +63,7 @@ public:
NS_OVERRIDE virtual bool RecvGetMessage(const PRInt32& aMessageId, const PRInt32& aRequestId, const PRUint64& aProcessId); NS_OVERRIDE virtual bool RecvGetMessage(const PRInt32& aMessageId, const PRInt32& aRequestId, const PRUint64& aProcessId);
NS_OVERRIDE virtual bool RecvDeleteMessage(const PRInt32& aMessageId, const PRInt32& aRequestId, const PRUint64& aProcessId); NS_OVERRIDE virtual bool RecvDeleteMessage(const PRInt32& aMessageId, const PRInt32& aRequestId, const PRUint64& aProcessId);
NS_OVERRIDE virtual bool RecvCreateMessageList(const SmsFilterData& aFilter, const bool& aReverse, const PRInt32& aRequestId, const PRUint64& aProcessId); NS_OVERRIDE virtual bool RecvCreateMessageList(const SmsFilterData& aFilter, const bool& aReverse, const PRInt32& aRequestId, const PRUint64& aProcessId);
NS_OVERRIDE virtual bool RecvGetNextMessageInList(const PRInt32& aListId, const PRInt32& aRequestId, const PRUint64& aProcessId);
protected: protected:
virtual void ActorDestroy(ActorDestroyReason why); virtual void ActorDestroy(ActorDestroyReason why);