1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 cin et: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 #include "TestCommon.h"
10 #include "nsIIncrementalDownload.h"
11 #include "nsIRequestObserver.h"
12 #include "nsIProgressEventSink.h"
13 #include "nsThreadUtils.h"
14 #include "nsAutoPtr.h"
17 #include "mozilla/Attributes.h"
19 //-----------------------------------------------------------------------------
21 class FetchObserver MOZ_FINAL
: public nsIRequestObserver
22 , public nsIProgressEventSink
27 NS_DECL_NSIREQUESTOBSERVER
28 NS_DECL_NSIPROGRESSEVENTSINK
31 NS_IMPL_ISUPPORTS(FetchObserver
, nsIRequestObserver
,
35 FetchObserver::OnStartRequest(nsIRequest
*request
, nsISupports
*context
)
37 printf("FetchObserver::OnStartRequest\n");
42 FetchObserver::OnProgress(nsIRequest
*request
, nsISupports
*context
,
43 uint64_t progress
, uint64_t progressMax
)
45 printf("FetchObserver::OnProgress [%lu/%lu]\n",
46 (unsigned long)progress
, (unsigned long)progressMax
);
51 FetchObserver::OnStatus(nsIRequest
*request
, nsISupports
*context
,
52 nsresult status
, const char16_t
*statusText
)
58 FetchObserver::OnStopRequest(nsIRequest
*request
, nsISupports
*context
,
61 printf("FetchObserver::OnStopRequest [status=%x]\n",
62 static_cast<uint32_t>(status
));
68 //-----------------------------------------------------------------------------
71 DoIncrementalFetch(const char *uriSpec
, const char *resultPath
, int32_t chunkSize
,
74 nsCOMPtr
<nsIFile
> resultFile
;
75 nsresult rv
= NS_NewNativeLocalFile(nsDependentCString(resultPath
),
76 false, getter_AddRefs(resultFile
));
81 rv
= NS_NewURI(getter_AddRefs(uri
), uriSpec
);
85 nsCOMPtr
<nsIRequestObserver
> observer
= new FetchObserver();
87 return NS_ERROR_OUT_OF_MEMORY
;
89 nsCOMPtr
<nsIIncrementalDownload
> download
=
90 do_CreateInstance(NS_INCREMENTALDOWNLOAD_CONTRACTID
, &rv
);
94 rv
= download
->Init(uri
, resultFile
, chunkSize
, interval
);
98 rv
= download
->Start(observer
, nullptr);
107 main(int argc
, char **argv
)
109 if (PR_GetEnv("MOZ_BREAK_ON_MAIN"))
113 fprintf(stderr
, "USAGE: TestIncrementalDownload <url> <file> <chunksize> <interval-in-seconds>\n");
117 nsresult rv
= NS_InitXPCOM2(nullptr, nullptr, nullptr);
121 int32_t chunkSize
= atoi(argv
[3]);
122 int32_t interval
= atoi(argv
[4]);
124 rv
= DoIncrementalFetch(argv
[1], argv
[2], chunkSize
, interval
);
126 fprintf(stderr
, "ERROR: DoIncrementalFetch failed [%x]\n",
127 static_cast<uint32_t>(rv
));
129 NS_ShutdownXPCOM(nullptr);