1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=cpp: */
4 * Copyright (C) 2008 Sergey Yanovich <ynvich@gmail.com>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
22 #include "xpcom-config.h"
25 #include "nsAutoPtr.h"
26 #include "nsServiceManagerUtils.h"
27 #include "nsStringAPI.h"
29 #include "nsIStreamListener.h"
31 #include "nsIFileURL.h"
32 #include "nsINetUtil.h"
33 #include "nsComponentManagerUtils.h"
34 #include "nsNetUtil.h"
37 #include "nsThreadUtils.h"
38 #include "nsIRunnable.h"
39 #include "nsIThread.h"
41 /* Project includes */
43 #include "aaSqliteChannel.h"
44 #include "aaSqlitePump.h"
46 aaSqliteChannel::aaSqliteChannel(nsIURI
*aURI
)
48 , mContentType("text/dbxml")
55 NS_IMPL_THREADSAFE_ISUPPORTS4(aaSqliteChannel
,
63 aaSqliteChannel::GetName(nsACString
& aName
)
65 return NS_ERROR_NOT_IMPLEMENTED
;
69 aaSqliteChannel::IsPending(PRBool
*_retval NS_OUTPARAM
)
71 NS_ENSURE_ARG_POINTER(_retval
);
72 *_retval
= !!mObserver
;
77 aaSqliteChannel::GetStatus(nsresult
*aStatus
)
79 NS_ENSURE_ARG_POINTER(aStatus
);
85 aaSqliteChannel::Cancel(nsresult aStatus
)
87 return NS_ERROR_NOT_IMPLEMENTED
;
91 aaSqliteChannel::Suspend()
93 return NS_ERROR_NOT_IMPLEMENTED
;
97 aaSqliteChannel::Resume()
99 return NS_ERROR_NOT_IMPLEMENTED
;
103 aaSqliteChannel::GetLoadGroup(nsILoadGroup
* *aLoadGroup
)
105 NS_ENSURE_ARG_POINTER(aLoadGroup
);
106 NS_IF_ADDREF(*aLoadGroup
= mLoadGroup
);
110 aaSqliteChannel::SetLoadGroup(nsILoadGroup
* aLoadGroup
)
112 mLoadGroup
= aLoadGroup
;
117 aaSqliteChannel::GetLoadFlags(nsLoadFlags
*aLoadFlags
)
119 NS_ENSURE_ARG_POINTER(aLoadFlags
);
120 *aLoadFlags
= mLoadFlags
;
124 aaSqliteChannel::SetLoadFlags(nsLoadFlags aLoadFlags
)
126 mLoadFlags
= aLoadFlags
;
132 aaSqliteChannel::GetOriginalURI(nsIURI
* *aOriginalURI
)
134 NS_ENSURE_ARG_POINTER(aOriginalURI
);
135 NS_IF_ADDREF(*aOriginalURI
= mURI
);
139 aaSqliteChannel::SetOriginalURI(nsIURI
* aOriginalURI
)
141 return NS_ERROR_NOT_IMPLEMENTED
;
145 aaSqliteChannel::GetURI(nsIURI
* *aURI
)
147 NS_ENSURE_ARG_POINTER(aURI
);
148 NS_IF_ADDREF(*aURI
= mURI
);
153 aaSqliteChannel::GetOwner(nsISupports
* *aOwner
)
155 NS_ENSURE_ARG_POINTER(aOwner
);
156 NS_IF_ADDREF(*aOwner
= mOwner
);
160 aaSqliteChannel::SetOwner(nsISupports
* aOwner
)
167 aaSqliteChannel::GetNotificationCallbacks(nsIInterfaceRequestor
*
168 *aNotificationCallbacks
)
170 return NS_ERROR_NOT_IMPLEMENTED
;
173 aaSqliteChannel::SetNotificationCallbacks(nsIInterfaceRequestor
*
174 aNotificationCallbacks
)
176 return NS_ERROR_NOT_IMPLEMENTED
;
180 aaSqliteChannel::GetSecurityInfo(nsISupports
* *aSecurityInfo
)
182 return NS_ERROR_NOT_IMPLEMENTED
;
186 aaSqliteChannel::GetContentType(nsACString
& aContentType
)
188 aContentType
.Assign(mContentType
);
192 aaSqliteChannel::SetContentType(const nsACString
& aContentType
)
195 if(NS_UNLIKELY(mStarted
&& !mHadStart
))
196 return NS_ERROR_UNEXPECTED
;
200 nsCAutoString contentCharset
;
201 rv
= NS_ParseContentType(aContentType
, mContentType
, contentCharset
);
202 NS_ENSURE_SUCCESS(rv
, rv
);
209 aaSqliteChannel::GetContentCharset(nsACString
& aContentCharset
)
211 return NS_ERROR_NOT_IMPLEMENTED
;
214 aaSqliteChannel::SetContentCharset(const nsACString
& aContentCharset
)
216 return NS_ERROR_NOT_IMPLEMENTED
;
220 aaSqliteChannel::GetContentLength(PRInt32
*aContentLength
)
222 return NS_ERROR_NOT_IMPLEMENTED
;
225 aaSqliteChannel::SetContentLength(PRInt32 aContentLength
)
227 return NS_ERROR_NOT_IMPLEMENTED
;
231 aaSqliteChannel::Open(nsIInputStream
**_retval NS_OUTPARAM
)
233 return NS_ERROR_NOT_IMPLEMENTED
;
237 aaSqliteChannel::AsyncOpen(nsIStreamListener
*aListener
, nsISupports
*aContext
)
239 NS_ENSURE_ARG_POINTER(aListener
);
240 NS_ENSURE_STATE(mURI
);
243 if (NS_UNLIKELY(mStarted
)) return NS_ERROR_ALREADY_OPENED
;
245 nsCOMPtr
<nsIEventTarget
> worker
=
246 do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID
, &rv
);
247 NS_ENSURE_SUCCESS(rv
, rv
);
249 mObserver
= aListener
;
251 nsCOMPtr
<nsIURL
> url
= do_QueryInterface(mURI
, &rv
);
252 NS_ENSURE_SUCCESS(rv
, rv
);
255 rv
= url
->GetQuery(query
);
256 NS_ENSURE_SUCCESS(rv
, rv
);
258 NS_ENSURE_TRUE(StringBeginsWith(query
, NS_LITERAL_CSTRING("sql=")),
259 NS_ERROR_INVALID_ARG
);
260 const nsACString
& sqlQuery
= Substring(query
, 4);
262 nsCOMPtr
<nsINetUtil
> netUtil
= do_CreateInstance(NS_NETUTIL_CONTRACTID
, &rv
);
263 NS_ENSURE_SUCCESS(rv
, rv
);
266 rv
= netUtil
->UnescapeString(sqlQuery
, nsINetUtil::ESCAPE_XALPHAS
, sql
);
267 NS_ENSURE_SUCCESS(rv
, rv
);
269 nsCOMPtr
<nsIFileURL
> fileURL
= do_QueryInterface(mURI
, &rv
);
270 NS_ENSURE_SUCCESS(rv
, rv
);
272 nsCOMPtr
<nsIFile
> db
;
273 rv
= fileURL
->GetFile(getter_AddRefs(db
));
274 NS_ENSURE_SUCCESS(rv
, rv
);
276 nsRefPtr
<aaSqlitePump
> pump
= new aaSqlitePump(db
, sql
.get(), this);
277 NS_ENSURE_TRUE(pump
, NS_ERROR_OUT_OF_MEMORY
);
279 rv
= worker
->Dispatch(pump
, NS_DISPATCH_NORMAL
);
280 NS_ENSURE_SUCCESS(rv
, rv
);
284 if (mLoadGroup
) mLoadGroup
->AddRequest(this, nsnull
);
289 aaSqliteChannel::OnStartRequest(nsIRequest
*aRequest
, nsISupports
*aContext
)
291 NS_ENSURE_STATE(mObserver
&& !mHadStart
);
293 return mObserver
->OnStartRequest(aRequest
, aContext
);
297 aaSqliteChannel::OnStopRequest(nsIRequest
*aRequest
, nsISupports
*aContext
,
298 nsresult aStatusCode
)
300 NS_ENSURE_STATE(mObserver
&& mHadStart
);
302 rv
= mObserver
->OnStopRequest(aRequest
, aContext
, aStatusCode
);
303 if (mLoadGroup
) mLoadGroup
->RemoveRequest(this, nsnull
, aStatusCode
);
309 aaSqliteChannel::OnDataAvailable(nsIRequest
*aRequest
, nsISupports
*aContext
,
310 nsIInputStream
*aInputStream
, PRUint32 aOffset
, PRUint32 aCount
)
312 NS_ENSURE_STATE(mObserver
&& mHadStart
);
313 return mObserver
->OnDataAvailable(aRequest
, aContext
, aInputStream
,