From c1e4fe10d78ecd6ac8ab417cf8321794e8518d7f Mon Sep 17 00:00:00 2001 From: Sergey Gaychuk Date: Sat, 27 Nov 2010 15:01:26 +0200 Subject: [PATCH] transport: protocol handler for sqlite --- transport/sqlite/src/Makefile.in | 1 + transport/sqlite/src/aaModuleSqliteTransport.cpp | 8 +- transport/sqlite/src/aaSqliteChannel.cpp | 33 +++++- transport/sqlite/src/aaSqliteProtocolHandler.cpp | 116 +++++++++++++++++++++ ...liteTransport.cpp => aaSqliteProtocolHandler.h} | 42 ++++---- transport/sqlite/test/Makefile.in | 25 +++++ .../sqlite/test/aaSqliteTransportTestModule.cpp | 1 + transport/sqlite/test/empty.xml | 3 + transport/sqlite/test/transport_sqlite.xml | 11 ++ 9 files changed, 211 insertions(+), 29 deletions(-) create mode 100644 transport/sqlite/src/aaSqliteProtocolHandler.cpp copy transport/sqlite/src/{aaModuleSqliteTransport.cpp => aaSqliteProtocolHandler.h} (56%) create mode 100644 transport/sqlite/test/empty.xml create mode 100644 transport/sqlite/test/transport_sqlite.xml diff --git a/transport/sqlite/src/Makefile.in b/transport/sqlite/src/Makefile.in index c4e9e51..1433c55 100644 --- a/transport/sqlite/src/Makefile.in +++ b/transport/sqlite/src/Makefile.in @@ -60,6 +60,7 @@ CPPSRCS = \ aaSqliteStmt.cpp \ aaSqlitePump.cpp \ aaSqliteChannel.cpp \ + aaSqliteProtocolHandler.cpp \ aaModuleSqliteTransport.cpp \ $(NULL) diff --git a/transport/sqlite/src/aaModuleSqliteTransport.cpp b/transport/sqlite/src/aaModuleSqliteTransport.cpp index 5789432..afc3f49 100644 --- a/transport/sqlite/src/aaModuleSqliteTransport.cpp +++ b/transport/sqlite/src/aaModuleSqliteTransport.cpp @@ -27,6 +27,7 @@ /* Unfrozen API */ /* Project includes */ +#include "aaSqliteProtocolHandler.h" #define DUMMY_CID \ {0x2f3a5eaf, 0x9af4, 0x4979, {0x8d, 0x34, 0xb9, 0x99, 0x84, 0x7a, 0xf4, 0x0d}} @@ -45,12 +46,17 @@ NS_IMPL_ISUPPORTS0(Dummy) /* Module and Factory code */ NS_GENERIC_FACTORY_CONSTRUCTOR(Dummy) +NS_GENERIC_FACTORY_CONSTRUCTOR(aaSqliteProtocolHandler) static const nsModuleComponentInfo kComponents[] = { { "Dummy Component", DUMMY_CID, DUMMY_CONTRACT, - DummyConstructor} + DummyConstructor}, + { AA_SQLITE_PROTOCOL_HANDLER_CLASS_NAME, + AA_SQLITE_PROTOCOL_HANDLER_CID, + AA_SQLITE_PROTOCOL_HANDLER_CONTRACTID, + aaSqliteProtocolHandlerConstructor} }; NS_IMPL_NSGETMODULE(aaModuleSqliteTransport, kComponents) diff --git a/transport/sqlite/src/aaSqliteChannel.cpp b/transport/sqlite/src/aaSqliteChannel.cpp index 06f7563..073bd95 100644 --- a/transport/sqlite/src/aaSqliteChannel.cpp +++ b/transport/sqlite/src/aaSqliteChannel.cpp @@ -274,12 +274,37 @@ aaSqliteChannel::AsyncOpen(nsIStreamListener *aListener, nsISupports *aContext) rv = netUtil->UnescapeString(sqlQuery, nsINetUtil::ESCAPE_XALPHAS, sql); NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr fileURL = do_QueryInterface(mURI, &rv); - NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr db; - rv = fileURL->GetFile(getter_AddRefs(db)); + PRBool schemeIsSqlite = PR_FALSE; + rv = mURI->SchemeIs("sqlite", &schemeIsSqlite); NS_ENSURE_SUCCESS(rv, rv); + if (schemeIsSqlite) + { + nsCOMPtr url = do_QueryInterface(mURI, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + nsCAutoString filePath; + rv = url->GetFilePath(filePath); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr localFile = + do_CreateInstance("@mozilla.org/file/local;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + + rv = localFile->InitWithNativePath(filePath); + NS_ENSURE_SUCCESS(rv, rv); + + db = do_QueryInterface(localFile, &rv); + NS_ENSURE_SUCCESS(rv, rv); + } + else + { + nsCOMPtr fileURL = do_QueryInterface(mURI, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + rv = fileURL->GetFile(getter_AddRefs(db)); + NS_ENSURE_SUCCESS(rv, rv); + } nsRefPtr pump = new aaSqlitePump(db, sql.get(), this); NS_ENSURE_TRUE(pump, NS_ERROR_OUT_OF_MEMORY); diff --git a/transport/sqlite/src/aaSqliteProtocolHandler.cpp b/transport/sqlite/src/aaSqliteProtocolHandler.cpp new file mode 100644 index 0000000..a575606 --- /dev/null +++ b/transport/sqlite/src/aaSqliteProtocolHandler.cpp @@ -0,0 +1,116 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=cpp: */ +/* + * Copyright (C) 2008-2010 Sergey Yanovich + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "aaSqliteProtocolHandler.h" + +#include "nsStringAPI.h" +#include "nsCOMPtr.h" +#include "nsAutoPtr.h" +#include "nsIURI.h" +#include "nsIStandardURL.h" +#include "nsNetCID.h" +#include "nsComponentManagerUtils.h" + +#include "aaSqlitePump.h" +#include "aaSqliteChannel.h" + +NS_IMPL_ISUPPORTS1(aaSqliteProtocolHandler, nsIProtocolHandler) + +/* readonly attribute ACString scheme; */ +NS_IMETHODIMP +aaSqliteProtocolHandler::GetScheme(nsACString & aScheme) +{ + aScheme.AssignLiteral(AA_SQLITE_PROTOCOL); + return NS_OK; +} + +/* readonly attribute long defaultPort; */ +NS_IMETHODIMP +aaSqliteProtocolHandler::GetDefaultPort(PRInt32 *aDefaultPort) +{ + NS_ENSURE_ARG_POINTER(aDefaultPort); + *aDefaultPort = -1; + return NS_OK; +} + +/* readonly attribute unsigned long protocolFlags; */ +NS_IMETHODIMP +aaSqliteProtocolHandler::GetProtocolFlags(PRUint32 *aProtocolFlags) +{ + NS_ENSURE_ARG_POINTER(aProtocolFlags); + *aProtocolFlags = URI_STD | URI_IS_LOCAL_FILE; + return NS_OK; +} + +/* nsIURI newURI (in AUTF8String aSpec, in string aOriginCharset, in nsIURI aBaseURI); */ +NS_IMETHODIMP +aaSqliteProtocolHandler::NewURI(const nsACString & aSpec, + const char *aOriginCharset, nsIURI *aBaseURI, nsIURI **_retval NS_OUTPARAM) +{ + NS_ENSURE_ARG(!aSpec.IsEmpty()); + NS_ENSURE_ARG_POINTER(_retval); + nsresult rv = NS_OK; + + nsCOMPtr uri = do_CreateInstance(NS_STANDARDURL_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr surl = do_QueryInterface(uri, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + rv = surl->Init(nsIStandardURL::URLTYPE_STANDARD, -1, aSpec, aOriginCharset, + aBaseURI); + NS_ENSURE_SUCCESS(rv, rv); + + rv = surl->SetMutable(PR_FALSE); + NS_ENSURE_SUCCESS(rv, rv); + NS_IF_ADDREF(*_retval = uri); + return NS_OK; +} + +/* nsIChannel newChannel (in nsIURI aURI); */ +NS_IMETHODIMP +aaSqliteProtocolHandler::NewChannel(nsIURI *aURI, nsIChannel **_retval NS_OUTPARAM) +{ + NS_ENSURE_ARG_POINTER(aURI); + NS_ENSURE_ARG_POINTER(_retval); + + nsresult rv = NS_OK; + PRBool sqliteScheme = PR_FALSE; + rv = aURI->SchemeIs(AA_SQLITE_PROTOCOL, &sqliteScheme); + NS_ENSURE_SUCCESS(rv, rv); + NS_ENSURE_TRUE(sqliteScheme, NS_ERROR_FAILURE); + + nsCOMPtr channel = new aaSqliteChannel(aURI); + NS_ENSURE_TRUE(channel, NS_ERROR_OUT_OF_MEMORY); + + NS_IF_ADDREF(*_retval = channel); + + return NS_OK; +} + +/* boolean allowPort (in long port, in string scheme); */ +NS_IMETHODIMP +aaSqliteProtocolHandler::AllowPort(PRInt32 port, const char *scheme, + PRBool *_retval NS_OUTPARAM) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + diff --git a/transport/sqlite/src/aaModuleSqliteTransport.cpp b/transport/sqlite/src/aaSqliteProtocolHandler.h similarity index 56% copy from transport/sqlite/src/aaModuleSqliteTransport.cpp copy to transport/sqlite/src/aaSqliteProtocolHandler.h index 5789432..469fdbd 100644 --- a/transport/sqlite/src/aaModuleSqliteTransport.cpp +++ b/transport/sqlite/src/aaSqliteProtocolHandler.h @@ -1,7 +1,7 @@ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=cpp: */ /* - * Copyright (C) 2008 Sergey Yanovich + * Copyright (C) 2008-2010 Sergey Yanovich * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -19,38 +19,32 @@ * Boston, MA 02111-1307, USA. */ -#include "xpcom-config.h" +#ifndef AA_SQLITE_PROTOCOL_HANDLER_H +#define AA_SQLITE_PROTOCOL_HANDLER_H -#include "nsIGenericFactory.h" -#include "nsStringAPI.h" +#include "nsIProtocolHandler.h" -/* Unfrozen API */ +#define AA_SQLITE_PROTOCOL \ + "sqlite" -/* Project includes */ +#define AA_SQLITE_PROTOCOL_HANDLER_CID \ +{0xba95b99, 0xc340, 0x424c, {0x9f, 0x3, 0x97, 0xd3, 0xd4, 0xa8, 0xf0, 0xa3}} -#define DUMMY_CID \ -{0x2f3a5eaf, 0x9af4, 0x4979, {0x8d, 0x34, 0xb9, 0x99, 0x84, 0x7a, 0xf4, 0x0d}} -#define DUMMY_CONTRACT "@aasii.org/dummy;1" +#define AA_SQLITE_PROTOCOL_HANDLER_CONTRACTID \ + NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX AA_SQLITE_PROTOCOL -class Dummy: public nsISupports +#define AA_SQLITE_PROTOCOL_HANDLER_CLASS_NAME \ + "Sqlite Protocol Handler" + +class aaSqliteProtocolHandler : public nsIProtocolHandler { public: - Dummy() {} + aaSqliteProtocolHandler() {} NS_DECL_ISUPPORTS + NS_DECL_NSIPROTOCOLHANDLER private: - ~Dummy() {} + ~aaSqliteProtocolHandler() {} }; -NS_IMPL_ISUPPORTS0(Dummy) - -/* Module and Factory code */ -NS_GENERIC_FACTORY_CONSTRUCTOR(Dummy) +#endif //AA_SQLITE_PROTOCOL_HANDLER_H -static const nsModuleComponentInfo kComponents[] = -{ - { "Dummy Component", - DUMMY_CID, - DUMMY_CONTRACT, - DummyConstructor} -}; -NS_IMPL_NSGETMODULE(aaModuleSqliteTransport, kComponents) diff --git a/transport/sqlite/test/Makefile.in b/transport/sqlite/test/Makefile.in index b826337..f1c2aff 100644 --- a/transport/sqlite/test/Makefile.in +++ b/transport/sqlite/test/Makefile.in @@ -71,6 +71,14 @@ EXTRA_DEPS = \ ../src/aaSqliteChannel.$(OBJ_SUFFIX) \ $(NULL) +XML_TEST_FILES = \ + transport_sqlite.xml \ + $(NULL) + +XML_TRANSPORT_RESULTS = \ + empty.xml \ + $(NULL) + include $(topsrcdir)/config/rules.mk EXTRA_DSO_LDOPTS+= \ @@ -81,3 +89,20 @@ EXTRA_DSO_LDOPTS+= \ $(NSPR_LIBS) \ $(call EXPAND_LIBNAME_PATH,sqlite3,$(LIBXUL_DIST)/lib) \ $(NULL) + +ifdef ENABLE_TESTS + ifdef XML_TEST_FILES +libs:: $(XML_TEST_FILES) + ifndef NO_DIST_INSTALL + $(INSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)/tests/xml + endif + endif + + ifdef XML_TRANSPORT_RESULTS +libs:: $(XML_TRANSPORT_RESULTS) + ifndef NO_DIST_INSTALL + $(INSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)/tests/results/transport + endif + endif +endif + diff --git a/transport/sqlite/test/aaSqliteTransportTestModule.cpp b/transport/sqlite/test/aaSqliteTransportTestModule.cpp index fff3f91..8e09f62 100644 --- a/transport/sqlite/test/aaSqliteTransportTestModule.cpp +++ b/transport/sqlite/test/aaSqliteTransportTestModule.cpp @@ -66,6 +66,7 @@ aaSqliteTransportTestModule::Test(nsITestRunner *aTestRunner) static const char* subtests[] = { AA_SQLITE_CREATE_TABLE1_CONTRACT + ,"@aasii.org/transport/xml/sqlite;1" }; #define subtestCount (sizeof(subtests) / sizeof(char*)) diff --git a/transport/sqlite/test/empty.xml b/transport/sqlite/test/empty.xml new file mode 100644 index 0000000..1b488ca --- /dev/null +++ b/transport/sqlite/test/empty.xml @@ -0,0 +1,3 @@ + + + diff --git a/transport/sqlite/test/transport_sqlite.xml b/transport/sqlite/test/transport_sqlite.xml new file mode 100644 index 0000000..1db1136 --- /dev/null +++ b/transport/sqlite/test/transport_sqlite.xml @@ -0,0 +1,11 @@ + + + {108130BD-4B20-4E9A-8B3F-A8AC59ADE406} + @aasii.org/transport/xml/sqlite;1 + Transport Sqlite Xml Test + + sqlite:///tmp/transport.sqlite?sql=DROP TABLE test + resource:///tests/results/transport/empty.xml + + + -- 2.11.4.GIT