Propchange: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.cpp
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.hpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.hpp?rev=179286&view=auto
==============================================================================
--- 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.hpp
 (added)
+++ 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.hpp
 Tue May 31 14:45:06 2005
@@ -0,0 +1,71 @@
+/*
+ * Copyright 1999-2000,2004 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * $Id$
+ */
+
+
+#if !defined(CURLNETACCESSOR_HPP)
+#define CURLNETACCESSOR_HPP
+
+
+#include <xercesc/util/XercesDefs.hpp>
+#include <xercesc/util/XMLURL.hpp>
+#include <xercesc/util/BinInputStream.hpp>
+#include <xercesc/util/XMLNetAccessor.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+//
+// This class is the wrapper for the socket based code which
+// provides the ability to fetch a resource specified using
+// a HTTP or FTP URL.
+//
+
+class XMLUTIL_EXPORT CurlNetAccessor : public XMLNetAccessor
+{
+public :
+    CurlNetAccessor();
+    ~CurlNetAccessor();
+    
+    virtual BinInputStream* makeNew(const XMLURL&  urlSource, const 
XMLNetHTTPInfo* httpInfo=0);
+    virtual const XMLCh* getId() const;
+
+    virtual void initCurl(void);
+    virtual void cleanupCurl(void);
+
+private :
+       static int fgCurlInitCount;
+    static const XMLCh fgMyName[];
+
+    CurlNetAccessor(const CurlNetAccessor&);
+    CurlNetAccessor& operator=(const CurlNetAccessor&);
+
+}; // CurlNetAccessor
+
+
+inline const XMLCh* CurlNetAccessor::getId() const
+{
+    return fgMyName;
+}
+
+
+XERCES_CPP_NAMESPACE_END
+
+#endif // CURLNETACCESSOR_HPP
+
+

Propchange: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.hpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.hpp
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.loT
URL: 
http://svn.apache.org/viewcvs/xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.loT?rev=179286&view=auto
==============================================================================
--- 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.loT
 (added)
+++ 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlNetAccessor.loT
 Tue May 31 14:45:06 2005
@@ -0,0 +1,7 @@
+# xercesc/util/NetAccessors/Curl/CurlNetAccessor.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.14 (1.1220.2.195 2005/02/12 
12:12:33)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.

Added: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp?rev=179286&view=auto
==============================================================================
--- 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
 (added)
+++ 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
 Tue May 31 14:45:06 2005
@@ -0,0 +1,245 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/time.h>
+
+#include <xercesc/util/XercesDefs.hpp>
+#include <xercesc/util/XMLNetAccessor.hpp>
+#include <xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp>
+#include <xercesc/util/XMLString.hpp>
+#include <xercesc/util/XMLExceptMsgs.hpp>
+#include <xercesc/util/Janitor.hpp>
+#include <xercesc/util/XMLUniDefs.hpp>
+#include <xercesc/util/TransService.hpp>
+#include <xercesc/util/TranscodingException.hpp>
+#include <xercesc/util/PlatformUtils.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+
+CurlURLInputStream::CurlURLInputStream(const XMLURL& urlSource, const 
XMLNetHTTPInfo* httpInfo/*=0*/)
+      : fMulti(0)
+      , fEasy(0)
+      , fMemoryManager(urlSource.getMemoryManager())
+      , fURLSource(urlSource)
+      , fURL(0)
+      , fTotalBytesRead(0)
+      , fWritePtr(0)
+      , fBytesRead(0)
+      , fBytesToRead(0)
+      , fDataAvailable(false)
+      , fBufferHeadPtr(fBuffer)
+      , fBufferTailPtr(fBuffer)
+{
+       // Allocate the curl multi handle
+       fMulti = curl_multi_init();
+       
+       // Allocate the curl easy handle
+       fEasy = curl_easy_init();
+       
+       // Get the text of the URL we're going to use
+       fURL.reset(XMLString::transcode(fURLSource.getURLText(), 
fMemoryManager), fMemoryManager);
+
+       //printf("Curl trying to fetch %s\n", fURL.get());
+
+       // Set URL option
+       curl_easy_setopt(fEasy, CURLOPT_URL, fURL.get());
+       curl_easy_setopt(fEasy, CURLOPT_WRITEDATA, this);                       
                        // Pass this pointer to write function
+       curl_easy_setopt(fEasy, CURLOPT_WRITEFUNCTION, staticWriteCallback);    
// Our static write function
+       
+       // Add easy handle to the multi stack
+       curl_multi_add_handle(fMulti, fEasy);
+}
+
+
+CurlURLInputStream::~CurlURLInputStream()
+{
+       // Remove the easy handle from the multi stack
+       curl_multi_remove_handle(fMulti, fEasy);
+       
+       // Cleanup the easy handle
+       curl_easy_cleanup(fEasy);
+       
+       // Cleanup the multi handle
+       curl_multi_cleanup(fMulti);
+}
+
+
+size_t
+CurlURLInputStream::staticWriteCallback(char *buffer,
+                                      size_t size,
+                                      size_t nitems,
+                                      void *outstream)
+{
+       return ((CurlURLInputStream*)outstream)->writeCallback(buffer, size, 
nitems);
+}
+
+
+
+size_t
+CurlURLInputStream::writeCallback(char *buffer,
+                                      size_t size,
+                                      size_t nitems)
+{
+       XMLSize_t cnt = size * nitems;
+       XMLSize_t totalConsumed = 0;
+               
+       // Consume as many bytes as possible immediately into the buffer
+       XMLSize_t consume = (cnt > fBytesToRead) ? fBytesToRead : cnt;
+       memcpy(fWritePtr, buffer, consume);
+       fWritePtr               += consume;
+       fBytesRead              += consume;
+       fTotalBytesRead += consume;
+       fBytesToRead    -= consume;
+
+       //printf("write callback consuming %d bytes\n", consume);
+
+       // If bytes remain, rebuffer as many as possible into our holding buffer
+       buffer                  += consume;
+       totalConsumed   += consume;
+       cnt                             -= consume;
+       if (cnt > 0)
+       {
+               XMLSize_t bufAvail = sizeof(fBuffer) - (fBufferHeadPtr - 
fBuffer);
+               consume = (cnt > bufAvail) ? bufAvail : cnt;
+               memcpy(fBufferHeadPtr, buffer, consume);
+               fBufferHeadPtr  += consume;
+               buffer                  += consume;
+               totalConsumed   += consume;
+               //printf("write callback rebuffering %d bytes\n", consume);
+       }
+       
+       // Return the total amount we've consumed. If we don't consume all the 
bytes
+       // then an error will be generated. Since our buffer size is equal to 
the
+       // maximum size that curl will write, this should never happen unless 
there
+       // is a logic error somewhere here.
+       return totalConsumed;
+}
+
+
+
+unsigned int
+CurlURLInputStream::readBytes(XMLByte* const    toFill
+                                     , const unsigned int    maxToRead)
+{
+       fBytesRead = 0;
+       fBytesToRead = maxToRead;
+       fWritePtr = toFill;
+       
+       for (bool tryAgain = true; fBytesToRead > 0 && (tryAgain || fBytesRead 
== 0); )
+       {
+               // First, any buffered data we have available
+               XMLSize_t bufCnt = fBufferHeadPtr - fBufferTailPtr;
+               bufCnt = (bufCnt > fBytesToRead) ? fBytesToRead : bufCnt;
+               if (bufCnt > 0)
+               {
+                       memcpy(fWritePtr, fBufferTailPtr, bufCnt);
+                       fWritePtr               += bufCnt;
+                       fBytesRead              += bufCnt;
+                       fTotalBytesRead += bufCnt;
+                       fBytesToRead    -= bufCnt;
+                       
+                       fBufferTailPtr  += bufCnt;
+                       if (fBufferTailPtr == fBufferHeadPtr)
+                               fBufferHeadPtr = fBufferTailPtr = fBuffer;
+                               
+                       //printf("consuming rebuffered %d bytes\n", bufCnt);
+
+                       tryAgain = true;
+                       continue;
+               }
+       
+               int runningHandles = 0;
+               CURLMcode curlResult = curl_multi_perform(fMulti, 
&runningHandles);
+               tryAgain = (curlResult == CURLM_CALL_MULTI_PERFORM);
+               
+               // Process messages from curl
+               int msgsInQueue = 0;
+               for (CURLMsg* msg = NULL; (msg = curl_multi_info_read(fMulti, 
&msgsInQueue)) != NULL; )
+               {
+                       //printf("msg %d, %d from curl\n", msg->msg, 
msg->data.result);
+
+                       if (msg->msg != CURLMSG_DONE)
+                               continue;
+                               
+                       switch (msg->data.result)
+                       {
+                       case CURLE_OK:
+                               // We completed successfully. runningHandles 
should have dropped to zero, so we'll bail out below...
+                               break;
+                               
+                       case CURLE_UNSUPPORTED_PROTOCOL:
+                ThrowXMLwithMemMgr(MalformedURLException, 
XMLExcepts::URL_UnsupportedProto, fMemoryManager);
+                break;
+
+            case CURLE_COULDNT_RESOLVE_HOST:
+            case CURLE_COULDNT_RESOLVE_PROXY:
+                ThrowXMLwithMemMgr1(NetAccessorException,  
XMLExcepts::NetAcc_TargetResolution, fURLSource.getHost(), fMemoryManager);
+                break;
+                
+            case CURLE_COULDNT_CONNECT:
+                ThrowXMLwithMemMgr1(NetAccessorException, 
XMLExcepts::NetAcc_ConnSocket, fURLSource.getURLText(), fMemoryManager);
+               
+            case CURLE_RECV_ERROR:
+                ThrowXMLwithMemMgr1(NetAccessorException, 
XMLExcepts::NetAcc_ReadSocket, fURLSource.getURLText(), fMemoryManager);
+                break;
+
+            default:
+                ThrowXMLwithMemMgr1(NetAccessorException, 
XMLExcepts::NetAcc_InternalError, fURLSource.getURLText(), fMemoryManager);
+                               break;
+                       }
+               }
+               
+               // If nothing is running any longer, bail out
+               if (runningHandles == 0)
+                       break;
+               
+               // If there is no further data to read, and we haven't
+               // read any yet on this invocation, call select to wait for data
+               if (!tryAgain && fBytesRead == 0)
+               {
+                       fd_set readSet[16];
+                       fd_set writeSet[16];
+                       fd_set exceptSet[16];
+                       int fdcnt = 16;
+                       
+                       // As curl for the file descriptors to wait on
+                       (void) curl_multi_fdset(fMulti, readSet, writeSet, 
exceptSet, &fdcnt);
+                       
+                       // Wait on the file descriptors
+                       timeval tv;
+                       tv.tv_sec  = 2;
+                       tv.tv_usec = 0;
+                       (void) select(fdcnt, readSet, writeSet, exceptSet, &tv);
+               }
+       }
+       
+       return fBytesRead;
+}
+
+
+XERCES_CPP_NAMESPACE_END
+

Propchange: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.cpp
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp?rev=179286&view=auto
==============================================================================
--- 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
 (added)
+++ 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
 Tue May 31 14:45:06 2005
@@ -0,0 +1,120 @@
+/*
+ * Copyright 1999-2000,2004 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * $Id$
+ */
+
+#if !defined(CURLURLINPUTSTREAM_HPP)
+#define CURLURLINPUTSTREAM_HPP
+
+#include <curl.h>
+#include <multi.h>
+#include <easy.h>
+
+#include <xercesc/util/XMLURL.hpp>
+#include <xercesc/util/XMLExceptMsgs.hpp>
+#include <xercesc/util/Janitor.hpp>
+#include <xercesc/util/BinInputStream.hpp>
+#include <xercesc/util/XMLNetAccessor.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+//
+// This class implements the BinInputStream interface specified by the XML
+// parser.
+//
+
+class XMLUTIL_EXPORT CurlURLInputStream : public BinInputStream
+{
+public :
+    CurlURLInputStream(const XMLURL&  urlSource, const XMLNetHTTPInfo* 
httpInfo=0);
+    ~CurlURLInputStream();
+
+    unsigned int curPos() const;
+    unsigned int readBytes
+    (
+                XMLByte* const  toFill
+        , const unsigned int    maxToRead
+    );
+
+
+private :
+    // -----------------------------------------------------------------------
+    //  Unimplemented constructors and operators
+    // -----------------------------------------------------------------------
+    CurlURLInputStream(const CurlURLInputStream&);
+    CurlURLInputStream& operator=(const CurlURLInputStream&);
+    
+    static size_t staticWriteCallback(char *buffer,
+                                      size_t size,
+                                      size_t nitems,
+                                      void *outstream);
+    size_t writeCallback(                        char *buffer,
+                                      size_t size,
+                                      size_t nitems);
+
+
+    // -----------------------------------------------------------------------
+    //  Private data members
+    //
+    //  fSocket
+    //      The socket representing the connection to the remote file.
+    //  fBytesProcessed
+    //      Its a rolling count of the number of bytes processed off this
+    //      input stream.
+    //  fBuffer
+    //      Holds the http header, plus the first part of the actual
+    //      data.  Filled at the time the stream is opened, data goes
+    //      out to user in response to readBytes().
+    //  fBufferPos, fBufferEnd
+    //      Pointers into fBuffer, showing start and end+1 of content
+    //      that readBytes must return.
+    // -----------------------------------------------------------------------
+       
+    CURLM*                             fMulti;
+    CURL*                              fEasy;
+    
+    MemoryManager*      fMemoryManager;
+    
+    XMLURL                             fURLSource;
+    ArrayJanitor<char> fURL;
+    
+    unsigned long       fTotalBytesRead;
+    XMLByte*                   fWritePtr;
+    unsigned long              fBytesRead;
+    unsigned long              fBytesToRead;
+    bool                               fDataAvailable;
+    
+    // Overflow buffer for when curl writes more data to us
+    // than we've asked for.
+    XMLByte                            fBuffer[CURL_MAX_WRITE_SIZE];
+    XMLByte*                   fBufferHeadPtr;
+    XMLByte*                   fBufferTailPtr;
+    
+}; // CurlURLInputStream
+
+
+inline unsigned int
+CurlURLInputStream::curPos() const
+{
+    return fTotalBytesRead;
+}
+
+XERCES_CPP_NAMESPACE_END
+
+#endif // CURLURLINPUTSTREAM_HPP
+

Propchange: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.hpp
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.loT
URL: 
http://svn.apache.org/viewcvs/xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.loT?rev=179286&view=auto
==============================================================================
--- 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.loT
 (added)
+++ 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/NetAccessors/Curl/CurlURLInputStream.loT
 Tue May 31 14:45:06 2005
@@ -0,0 +1,7 @@
+# xercesc/util/NetAccessors/Curl/CurlURLInputStream.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.14 (1.1220.2.195 2005/02/12 
12:12:33)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.

Modified: 
xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/PlatformUtils.cpp
URL: 
http://svn.apache.org/viewcvs/xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/PlatformUtils.cpp?rev=179286&r1=179285&r2=179286&view=diff
==============================================================================
--- xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/PlatformUtils.cpp 
(original)
+++ xerces/c/branches/jberry/3.0-unstable/src/xercesc/util/PlatformUtils.cpp 
Tue May 31 14:45:06 2005
@@ -76,6 +76,9 @@
 #endif
 
 #include <xercesc/util/XMLNetAccessor.hpp>
+#if XERCES_USE_NETACCESSOR_CURL
+#      include <xercesc/util/NetAccessors/Curl/CurlNetAccessor.hpp>
+#endif
 #if XERCES_USE_NETACCESSOR_SOCKET
 #      include <xercesc/util/NetAccessors/Socket/SocketNetAccessor.hpp>
 #endif
@@ -380,7 +383,9 @@
 {
        XMLNetAccessor* na = 0;
        
-       #if defined (XERCES_USE_NETACCESSOR_SOCKET)
+       #if defined (XERCES_USE_NETACCESSOR_CURL)
+               na = new CurlNetAccessor();
+       #elif defined (XERCES_USE_NETACCESSOR_SOCKET)
                na = new SocketNetAccessor();
        #elif defined (XERCES_USE_NETACCESSOR_LIBWWW)
                na = new LibWWWNetAccessor();



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to