Only in libjingle-0.4.0: Makefile.in
diff -r libjingle-0.4.0/README libjingle/files/README
1,39c1,39
< Libjingle
< 
< Libjingle is a set of components provided by Google to interoperate with Google
< Talk's peer-to-peer and voice capabilities. This package will create several
< static libraries you may link to your project as needed.
< 
< -talk               - No source files in talk/, just these subdirectories
< |-base              - Contains basic low-level portable utility functions for 
< |                     things like threads and sockets
< |-p2p               - The P2P stack
<   |-base            - Base p2p functionality
<   |-client          - Hooks to tie it into XMPP
< |-session           - Signaling
<   |-phone           - Signaling code specific to making phone calls
< |-third_party       - Components that aren't ours
<   |-mediastreamer   - Media components for dealing with sound hardware and 
<   |                   voice codecs
< |-xmllite           - XML parser
< |-xmpp              - XMPP engine
< 
< In addition, this package contains two examples in talk/examples which 
< illustrate the basic concepts of how the provided classes work.
< 
< The xmllite component of libjingle depends on expat. You can download expat 
< from http://expat.sourceforge.net/.
< 
< mediastreamer, the media components used by the example applications depend on
< the oRTP and iLBC components from linphone, which can be found at 
< http://www.linphone.org. Linphone, in turn depends on GLib, which can be found
< at http://www.gtk.org. This GLib dependency should be removed in future 
< releases.
< 
< Building Libjingle
< 
< Once the dependencies are installed, run ./configure. ./configure will return
< an error if it failed to locate the proper dependencies. If ./configure
< succeeds, run 'make' to build the components and examples.
< 
< When the build is complete, you can run the call example from 
---
> Libjingle
> 
> Libjingle is a set of components provided by Google to interoperate with Google
> Talk's peer-to-peer and voice capabilities. This package will create several
> static libraries you may link to your project as needed.
> 
> -talk               - No source files in talk/, just these subdirectories
> |-base              - Contains basic low-level portable utility functions for 
> |                     things like threads and sockets
> |-p2p               - The P2P stack
>   |-base            - Base p2p functionality
>   |-client          - Hooks to tie it into XMPP
> |-session           - Signaling
>   |-phone           - Signaling code specific to making phone calls
> |-third_party       - Components that aren't ours
>   |-mediastreamer   - Media components for dealing with sound hardware and 
>   |                   voice codecs
> |-xmllite           - XML parser
> |-xmpp              - XMPP engine
> 
> In addition, this package contains two examples in talk/examples which 
> illustrate the basic concepts of how the provided classes work.
> 
> The xmllite component of libjingle depends on expat. You can download expat 
> from http://expat.sourceforge.net/.
> 
> mediastreamer, the media components used by the example applications depend on
> the oRTP and iLBC components from linphone, which can be found at 
> http://www.linphone.org. Linphone, in turn depends on GLib, which can be found
> at http://www.gtk.org. This GLib dependency should be removed in future 
> releases.
> 
> Building Libjingle
> 
> Once the dependencies are installed, run ./configure. ./configure will return
> an error if it failed to locate the proper dependencies. If ./configure
> succeeds, run 'make' to build the components and examples.
> 
> When the build is complete, you can run the call example from 
41,57c41,57
< 
< Relay Server
< 
< Libjingle will also build a relay server that may be used to relay traffic
< when a direct peer-to-peer connection could not be established. The relay
< server will build in talk/p2p/base/relayserver and will listen on UDP
< ports 5000 and 5001. See the Libjingle Developer Guide at 
< http://code.google.com/apis/talk/index.html for information about configuring
< a client to use this relay server.
< 
< STUN Server
< 
< Lastly, Libjingle builds a STUN server which implements the STUN protocol for
< Simple Traversal of UDP over NAT. The STUN server is built as
< talk/p2p/base/stunserver and listens on UDP port 7000. See the Libjingle
< Developer Guide at http://code.google.com/apis/talk/index.html for information
< about configuring a client to use this STUN server.
---
> 
> Relay Server
> 
> Libjingle will also build a relay server that may be used to relay traffic
> when a direct peer-to-peer connection could not be established. The relay
> server will build in talk/p2p/base/relayserver and will listen on UDP
> ports 5000 and 5001. See the Libjingle Developer Guide at 
> http://code.google.com/apis/talk/index.html for information about configuring
> a client to use this relay server.
> 
> STUN Server
> 
> Lastly, Libjingle builds a STUN server which implements the STUN protocol for
> Simple Traversal of UDP over NAT. The STUN server is built as
> talk/p2p/base/stunserver and listens on UDP port 7000. See the Libjingle
> Developer Guide at http://code.google.com/apis/talk/index.html for information
> about configuring a client to use this STUN server.
diff -r libjingle-0.4.0/README.win libjingle/files/README.win
1,24c1,24
< 1. Install Visual C++ Express 2005.  It is free from this link:
<    http://msdn.microsoft.com/vstudio/express/visualc/
< 
< 2. Install the platform SDK and integrate it into VC++ express
<    http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/
< 
< 3. Download and install binary package for expat:
<    http://sourceforge.net/project/showfiles.php?group_id=10127&package_id=11277
< 
< 4. Update the Visual C++ directories in the Projects and Solutions section in the Options dialog box
<    Library files: C:\expat-VERSION\StaticLibs
<    Include files: C:\expat-VERSION\Source\Lib
<    where VERSION is the version of expat you've downoaded
< 
< 5. Unzip the libjingle files and open the solution.
< 
< 6. If you wish to build the call example with GIPS Voice Engine Lite, download Voice Engine Lite from http://developer.globalipsound.com
< 
< 7. Extract the Interface and Library directories from the Voice Engine Lite zip file into talk\third_party\gips
< 
< 8. Open talk\third_party\gips\expiration.h and set the GIPS_EXPIRATION #defines to the expiration date provided by GIPS and remove the #error directive
< 
< 9. Build the solution
< 
---
> 1. Install Visual C++ Express 2005.  It is free from this link:
>    http://msdn.microsoft.com/vstudio/express/visualc/
> 
> 2. Install the platform SDK and integrate it into VC++ express
>    http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/
> 
> 3. Download and install binary package for expat:
>    http://sourceforge.net/project/showfiles.php?group_id=10127&package_id=11277
> 
> 4. Update the Visual C++ directories in the Projects and Solutions section in the Options dialog box
>    Library files: C:\expat-VERSION\StaticLibs
>    Include files: C:\expat-VERSION\Source\Lib
>    where VERSION is the version of expat you've downoaded
> 
> 5. Unzip the libjingle files and open the solution.
> 
> 6. If you wish to build the call example with GIPS Voice Engine Lite, download Voice Engine Lite from http://developer.globalipsound.com
> 
> 7. Extract the Interface and Library directories from the Voice Engine Lite zip file into talk\third_party\gips
> 
> 8. Open talk\third_party\gips\expiration.h and set the GIPS_EXPIRATION #defines to the expiration date provided by GIPS and remove the #error directive
> 
> 9. Build the solution
> 
Only in libjingle-0.4.0: aclocal.m4
Only in libjingle-0.4.0: config.guess
diff -r libjingle-0.4.0/config.h libjingle/files/config.h
14c14
< #define HAVE_ALSA_ASOUNDLIB_H 1
---
> /* #undef HAVE_ALSA_ASOUNDLIB_H */
23c23
< #define HAVE_GLIB 1
---
> /* #undef HAVE_GLIB */
38c38
< #define HAVE_ORTP 1
---
> /* #undef HAVE_ORTP */
41c41
< #define HAVE_SPEEX 1
---
> /* #undef HAVE_SPEEX */
47c47
< #define HAVE_SPEEX_SPEEX_H 1
---
> /* #undef HAVE_SPEEX_SPEEX_H */
71c71
< #define LINUX 1
---
> /* #undef LINUX */
113c113
< #define __ALSA_ENABLED__ 1
---
> /* #undef __ALSA_ENABLED__ */
Only in libjingle-0.4.0: config.h.in
Only in libjingle-0.4.0: config.sub
Only in libjingle-0.4.0: configure
Only in libjingle-0.4.0: depcomp
Only in libjingle-0.4.0: install-sh
Only in libjingle-0.4.0: ltmain.sh
Only in libjingle-0.4.0: missing
Only in libjingle-0.4.0/talk: Makefile.in
Only in libjingle-0.4.0/talk/base: Makefile.in
diff -r libjingle-0.4.0/talk/base/asynchttprequest.cc libjingle/files/talk/base/asynchttprequest.cc
73c73
<     talk_base::SSLAdapter * ssl_adapter = talk_base::SSLAdapter::Create(socket);
---
>     talk_base::SSLAdapter * ssl_adapter = factory_->CreateSSLAdapter(socket);
75c75,81
<     ssl_adapter->StartSSL(hostname_.c_str(), true);
---
>     int error = ssl_adapter->StartSSL(hostname_.c_str(),
>                                       use_restartable_ssl_sockets_);
>     if (error != 0) {
>       LOG(LS_WARNING) << "Could not start SSL; error = " << error;
>       delete ssl_adapter;
>       return 0;
>     }
diff -r libjingle-0.4.0/talk/base/asynchttprequest.h libjingle/files/talk/base/asynchttprequest.h
23,24c23
<   public SignalThread,
<   public sigslot::has_slots<> {
---
>   public SignalThread {
106c105,106
<       binary_mode_(false), agent_(user_agent) { }
---
>       binary_mode_(false), agent_(user_agent),
>       ignore_bad_cert_(false), use_restartable_ssl_sockets_(false) { }
114a115,120
>   bool use_restartable_ssl_sockets() const {
>     return use_restartable_ssl_sockets_;
>   }
>   void SetUseRestartableSSLSockets(bool use_restartable_ssl_sockets) {
>     use_restartable_ssl_sockets_ = use_restartable_ssl_sockets;
>   }
133a140
>   bool use_restartable_ssl_sockets_;
diff -r libjingle-0.4.0/talk/base/asynctcpsocket.cc libjingle/files/talk/base/asynctcpsocket.cc
31a32,33
> #include <cstring>
> 
diff -r libjingle-0.4.0/talk/base/autodetectproxy.cc libjingle/files/talk/base/autodetectproxy.cc
29c29
< #include "talk/base/httpcommon.h"
---
> #include "talk/base/httpcommon-inl.h"
114c114
<   Thread::Current()->MessageQueue::Stop();
---
>   Thread::Current()->Quit();
diff -r libjingle-0.4.0/talk/base/autodetectproxy.h libjingle/files/talk/base/autodetectproxy.h
22c22
< class AutoDetectProxy : public SignalThread, public sigslot::has_slots<> {
---
> class AutoDetectProxy : public SignalThread {
diff -r libjingle-0.4.0/talk/base/base64.h libjingle/files/talk/base/base64.h
26,27c26,27
<   static const std::string Base64::Base64Table;
<   static const std::string::size_type Base64::DecodeTable[];
---
>   static const std::string Base64Table;
>   static const std::string::size_type DecodeTable[];
diff -r libjingle-0.4.0/talk/base/common.h libjingle/files/talk/base/common.h
54c54
< #define stdmax(x,y) max(x,y)
---
> #define stdmax(x,y) _max(x,y)
114,119d113
< // A macro to disallow the evil copy constructor and operator= functions
< // This should be used in the private: declarations for a class
< #define DISALLOW_EVIL_CONSTRUCTORS(TypeName)    \
<   TypeName(const TypeName&);                    \
<   void operator=(const TypeName&)
< 
diff -r libjingle-0.4.0/talk/base/criticalsection.h libjingle/files/talk/base/criticalsection.h
39c39
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
41c41
< #endif  // _DEBUG
---
> #endif  // !defined(NDEBUG)
83c83
< public:
---
>  public:
85a86
>     pthread_mutexattr_init(&mutex_attribute);
87a89,90
>     pthread_mutexattr_destroy(&mutex_attribute);
>     TRACK_OWNER(thread_ = 0);
93a97
>     TRACK_OWNER(thread_ = pthread_self());
95a100
>     TRACK_OWNER(thread_ = 0);
98c103,110
< private:
---
> 
> #if CS_TRACK_OWNER
>   bool CurrentThreadIsOwner() const {
>     return pthread_equal(thread_, pthread_self());
>   }
> #endif  // CS_TRACK_OWNER
> 
>  private:
99a112
>   TRACK_OWNER(pthread_t thread_);
diff -r libjingle-0.4.0/talk/base/cryptstring.h libjingle/files/talk/base/cryptstring.h
30a31
> #include <string.h>
diff -r libjingle-0.4.0/talk/base/diskcache.cc libjingle/files/talk/base/diskcache.cc
43c43
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
45c45
< #else  // !_DEBUG
---
> #else  // defined(NDEBUG)
47c47
< #endif  // !_DEBUG
---
> #endif  // !defined(NDEBUG)
231c231
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
238c238
< #endif  // _DEBUG
---
> #endif  // !defined(NDEBUG)
diff -r libjingle-0.4.0/talk/base/diskcache_win32.cc libjingle/files/talk/base/diskcache_win32.cc
38c38
<       entry->streams = max(entry->streams, index + 1);
---
>       entry->streams = _max(entry->streams, index + 1);
diff -r libjingle-0.4.0/talk/base/helpers.cc libjingle/files/talk/base/helpers.cc
38a39
> #include <wincrypt.h>
diff -r libjingle-0.4.0/talk/base/host.cc libjingle/files/talk/base/host.cc
30a31
> #include <cstdlib>
diff -r libjingle-0.4.0/talk/base/httpclient.cc libjingle/files/talk/base/httpclient.cc
670a671
>         HttpAuthContext *context = context_.get();
676c677,678
<           *context_.use(), response, auth_method);
---
>           context, response, auth_method);
>         context_.reset(context);
diff -r libjingle-0.4.0/talk/base/httpcommon.h libjingle/files/talk/base/httpcommon.h
172c172
< inline const uint16 UrlDefaultPort(bool secure) {
---
> inline uint16 UrlDefaultPort(bool secure) {
diff -r libjingle-0.4.0/talk/base/logging.cc libjingle/files/talk/base/logging.cc
27a28
> #include <stdio.h>
76c77
< #if _DEBUG
---
> #if LOGGING
78c79
< #else  // !_DEBUG
---
> #else
80c81
< #endif  // !_DEBUG
---
> #endif
diff -r libjingle-0.4.0/talk/base/logging.h libjingle/files/talk/base/logging.h
67a68,69
> 
> #if defined(SAFE_TO_DEFINE_TALK_BASE_LOGGING_MACROS)
70a73
> #endif // defined(SAFE_TO_DEFINE_TALK_BASE_LOGGING_MACROS)
195a199
> #if defined(SAFE_TO_DEFINE_TALK_BASE_LOGGING_MACROS)
197c201
< #if defined(_DEBUG) && !defined(NDEBUG)
---
> #if !defined(NDEBUG)
290a295
> #endif  // defined(SAFE_TO_DEFINE_TALK_BASE_LOGGING_MACROS)
diff -r libjingle-0.4.0/talk/base/messagequeue.cc libjingle/files/talk/base/messagequeue.cc
98,99c98,99
<     new_ss = true;
<     ss_ = new PhysicalSocketServer();
---
>     default_ss_.reset(new PhysicalSocketServer());
>     ss_ = default_ss_.get();
103a104,107
>   // The signal is done from here to ensure
>   // that it always gets called when the queue
>   // is going away.
>   SignalQueueDestroyed();
108,109d111
<   if (new_ss)
<     delete ss_;
113,115d114
<   if (new_ss)
<     delete ss_;
<   new_ss = false;
119c118
< void MessageQueue::Stop() {
---
> void MessageQueue::Quit() {
124c123
< bool MessageQueue::IsStopping() {
---
> bool MessageQueue::IsQuitting() {
diff -r libjingle-0.4.0/talk/base/messagequeue.h libjingle/files/talk/base/messagequeue.h
35a36
> #include "talk/base/scoped_ptr.h"
162,164c163,164
< 
<   virtual void Stop();
<   virtual bool IsStopping();
---
>   virtual void Quit();
>   virtual bool IsQuitting();
188a189,192
>   // When this signal is sent out, any references to this queue should
>   // no longer be used.
>   sigslot::signal0<> SignalQueueDestroyed;
> 
192a197,198
>   // If a server isn't supplied in the constructor, use this one.
>   scoped_ptr<SocketServer> default_ss_;
diff -r libjingle-0.4.0/talk/base/natserver.cc libjingle/files/talk/base/natserver.cc
28a29
> #include <cstring>
diff -r libjingle-0.4.0/talk/base/natsocketfactory.cc libjingle/files/talk/base/natsocketfactory.cc
29a30
> #include <cstring>
diff -r libjingle-0.4.0/talk/base/openssladapter.cc libjingle/files/talk/base/openssladapter.cc
619c619
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
707c707
< #if _DEBUG
---
> #if !defined(NDEBUG)
736c736
< #endif  // _DEBUG
---
> #endif  // !defined(NDEBUG)
740c740
< #if _DEBUG
---
> #if !defined(NDEBUG)
798c798
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
diff -r libjingle-0.4.0/talk/base/openssladapter.h libjingle/files/talk/base/openssladapter.h
72c72
< #if _DEBUG
---
> #if !defined(NDEBUG)
74c74
< #endif  // !_DEBUG
---
> #endif  // !defined(NDEBUG)
diff -r libjingle-0.4.0/talk/base/physicalsocketserver.cc libjingle/files/talk/base/physicalsocketserver.cc
61a62
> #include "talk/base/winsock_initializer.h"
67,86d67
< #ifdef WIN32
< class WinsockInitializer {
< public:
<   WinsockInitializer() {
<     WSADATA wsaData;
<     WORD wVersionRequested = MAKEWORD(1, 0);
<     err_ = WSAStartup(wVersionRequested, &wsaData);
<   }
<   ~WinsockInitializer() {
<     WSACleanup();
<   }
<   int error() {
<     return err_;
<   }
< private:
<   int err_;
< };
< WinsockInitializer g_winsockinit;
< #endif
< 
124a106,108
> #ifdef WIN32
>     EnsureWinsockInit();
> #endif
187c171,177
<       addr2.Resolve(); // TODO: Do this async later?
---
>       // TODO: Do this async later?
>       if (!addr2.Resolve()) {
>         LOG(LS_ERROR) << "Resolving addr failed";
>         UpdateLastError();
>         Close();
>         return SOCKET_ERROR;
>       }
265a256,259
>       LOG(LS_WARNING) << "EOF from socket; deferring close event";
>       // Must turn this back on so that the select() loop will notice the close
>       // event.
>       enabled_events_ |= kfRead;
402a397
>   virtual bool IsDescriptorClosed() = 0;
452a448,451
>   virtual bool IsDescriptorClosed() {
>     return false;
>   }
> 
490a490,497
>   virtual bool IsDescriptorClosed() {
>     // We don't have a reliable way of distinguishing end-of-stream
>     // from readability.  So test on each readable call.  Is this
>     // inefficient?  Probably.
>     char ch;
>     return (0 == ::recv(s_, &ch, 1, MSG_PEEK));
>   }
> 
546a554,557
>   virtual bool IsDescriptorClosed() {
>     return false;
>   }
> 
916c927,931
<           ff |= kfRead;
---
>           if (pdispatcher->IsDescriptorClosed()) {
>             ff |= kfClose;
>           } else {
>             ff |= kfRead;
>           }
diff -r libjingle-0.4.0/talk/base/proxydetect.cc libjingle/files/talk/base/proxydetect.cc
205,206c205,206
<   const char* list = slist.c_str();
<   while (*list) {
---
>   const char* clist = slist.c_str();
>   while (*clist) {
208,209c208,209
<     if (isspace(*list)) {
<       ++list;
---
>     if (isspace(*clist)) {
>       ++clist;
214,217c214,217
<     const char * start = list;
<     if (const char * end = strchr(list, sep)) {
<       len = (end - list);
<       list += len + 1;
---
>     const char * start = clist;
>     if (const char * end = strchr(clist, sep)) {
>       len = (end - clist);
>       clist += len + 1;
219,220c219,220
<       len = strlen(list);
<       list += len;
---
>       len = strlen(clist);
>       clist += len;
diff -r libjingle-0.4.0/talk/base/schanneladapter.cc libjingle/files/talk/base/schanneladapter.cc
607c607
<   size_t read = min(cb, readable.size());
---
>   size_t read = _min(cb, readable.size());
diff -r libjingle-0.4.0/talk/base/scoped_ptr.h libjingle/files/talk/base/scoped_ptr.h
36,257c36
< namespace talk_base {
< 
< template <typename T>
< class scoped_ptr {
<  private:
< 
<   T* ptr;
< 
<   scoped_ptr(scoped_ptr const &);
<   scoped_ptr & operator=(scoped_ptr const &);
< 
<  public:
< 
<   typedef T element_type;
< 
<   explicit scoped_ptr(T* p = 0): ptr(p) {}
< 
<   ~scoped_ptr() {
<     typedef char type_must_be_complete[sizeof(T)];
<     delete ptr;
<   }
< 
<   void reset(T* p = 0) {
<     typedef char type_must_be_complete[sizeof(T)];
< 
<     if (ptr != p) {
<       delete ptr;
<       ptr = p;
<     }
<   }
< 
<   T& operator*() const {
<     assert(ptr != 0);
<     return *ptr;
<   }
< 
<   T* operator->() const  {
<     assert(ptr != 0);
<     return ptr;
<   }
< 
<   T* get() const  {
<     return ptr;
<   }
< 
<   void swap(scoped_ptr & b) {
<     T* tmp = b.ptr;
<     b.ptr = ptr;
<     ptr = tmp;
<   }
< 
<   T* release() {
<     T* tmp = ptr;
<     ptr = 0;
<     return tmp;
<   }
<   
<   T** accept() {
<     if (ptr) {
<       delete ptr;
<       ptr = 0;
<     }
<     return &ptr;
<   }
< 
<   T** use() {
<     return &ptr;
<   }
< };
< 
< template<typename T> inline
< void swap(scoped_ptr<T>& a, scoped_ptr<T>& b) {
<   a.swap(b);
< }
< 
< 
< 
< 
< //  scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to
< //  is guaranteed, either on destruction of the scoped_array or via an explicit
< //  reset(). Use shared_array or std::vector if your needs are more complex.
< 
< template<typename T>
< class scoped_array {
<  private:
< 
<   T* ptr;
< 
<   scoped_array(scoped_array const &);
<   scoped_array & operator=(scoped_array const &);
< 
<  public:
< 
<   typedef T element_type;
< 
<   explicit scoped_array(T* p = 0) : ptr(p) {}
< 
<   ~scoped_array() {
<     typedef char type_must_be_complete[sizeof(T)];
<     delete[] ptr;
<   }
< 
<   void reset(T* p = 0) {
<     typedef char type_must_be_complete[sizeof(T)];
< 
<     if (ptr != p) {
<       delete [] ptr;
<       ptr = p;
<     }
<   }
< 
<   T& operator[](std::ptrdiff_t i) const {
<     assert(ptr != 0);
<     assert(i >= 0);
<     return ptr[i];
<   }
< 
<   T* get() const {
<     return ptr;
<   }
< 
<   void swap(scoped_array & b) {
<     T* tmp = b.ptr;
<     b.ptr = ptr;
<     ptr = tmp;
<   }
< 
<   T* release() {
<     T* tmp = ptr;
<     ptr = 0;
<     return tmp;
<   }
< 
<   T** accept() {
<     if (ptr) {
<       delete [] ptr;
<       ptr = 0;
<     }
<     return &ptr;
<   }
< };
< 
< template<class T> inline
< void swap(scoped_array<T>& a, scoped_array<T>& b) {
<   a.swap(b);
< }
< 
< // scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a
< // second template argument, the function used to free the object.
< 
< template<typename T, void (*FF)(void*) = free> class scoped_ptr_malloc {
<  private:
< 
<   T* ptr;
< 
<   scoped_ptr_malloc(scoped_ptr_malloc const &);
<   scoped_ptr_malloc & operator=(scoped_ptr_malloc const &);
< 
<  public:
< 
<   typedef T element_type;
< 
<   explicit scoped_ptr_malloc(T* p = 0): ptr(p) {}
< 
<   ~scoped_ptr_malloc() {
<     typedef char type_must_be_complete[sizeof(T)];
<     FF(static_cast<void*>(ptr));
<   }
< 
<   void reset(T* p = 0) {
<     typedef char type_must_be_complete[sizeof(T)];
< 
<     if (ptr != p) {
<       FF(static_cast<void*>(ptr));
<       ptr = p;
<     }
<   }
< 
<   T& operator*() const {
<     assert(ptr != 0);
<     return *ptr;
<   }
< 
<   T* operator->() const {
<     assert(ptr != 0);
<     return ptr;
<   }
< 
<   T* get() const {
<     return ptr;
<   }
< 
<   void swap(scoped_ptr_malloc & b) {
<     T* tmp = b.ptr;
<     b.ptr = ptr;
<     ptr = tmp;
<   }
< 
<   T* release() {
<     T* tmp = ptr;
<     ptr = 0;
<     return tmp;
<   }
< 
<   T** accept() {
<     if (ptr) {
<       FF(static_cast<void*>(ptr));
<       ptr = 0;
<     }
<     return &ptr;
<   }
< };
< 
< template<typename T, void (*FF)(void*)> inline
< void swap(scoped_ptr_malloc<T,FF>& a, scoped_ptr_malloc<T,FF>& b) {
<   a.swap(b);
< }
< 
< } // namespace talk_base
< 
< // TODO: get rid of this global using 
< using talk_base::scoped_ptr;
---
> #include "base/scoped_ptr.h"
diff -r libjingle-0.4.0/talk/base/signalthread.cc libjingle/files/talk/base/signalthread.cc
12a13,15
>   main_->SignalQueueDestroyed.connect(this,
>                                       &SignalThread::OnMainThreadDestroyed);
>   refcount_ = 1;
15a19,23
> void SignalThread::OnMainThreadDestroyed() {
>   EnterExit ee(this);
>   main_ = NULL;
> }
> 
19a28
>   EnterExit ee(this);
25a35
>   EnterExit ee(this);
27c37
<   if (kInit == state_) {
---
>   if (kInit == state_ || kComplete == state_) {
36c46,47
< void SignalThread::Destroy() {
---
> void SignalThread::Destroy(bool wait) {
>   EnterExit ee(this);
39,40c50,51
<     delete this;
<   } else if (kRunning == state_) {
---
>     refcount_--;
>   } else if (kRunning == state_ || kReleasing == state_) {
42,47c53,63
<     // A couple tricky issues here:
<     // 1) Thread::Stop() calls Join(), which we don't want... we just want
<     //    to stop the MessageQueue, which causes ContinueWork() to return false.
<     // 2) OnWorkStop() must follow Stop(), so that when the thread wakes up
<     //    due to OWS(), ContinueWork() will return false.
<     worker_.MessageQueue::Stop();
---
>     // OnWorkStop() must follow Quit(), so that when the thread wakes up due to
>     // OWS(), ContinueWork() will return false.
>     if (wait) {
>       // Release the thread's lock so that it can return from ::Run.
>       cs_.Leave(); 
>       worker_.Stop();
>       cs_.Enter();
>       refcount_--;
>     } else {
>       worker_.Quit();
>     }
54a71
>   EnterExit ee(this);
57c74
<     delete this;
---
>     refcount_--;
66a84
>   EnterExit ee(this);
71a90
>   EnterExit ee(this);
81a101,111
>       // Before signaling that the work is done, make sure that the worker
>       // thread actually is done. We got here because DoWork() finished and
>       // Run() posted the ST_MSG_WORKER_DONE message. This means the worker
>       // thread is about to go away anyway, but sometimes it doesn't actually
>       // finish before SignalWorkDone is processed, and for a reusable
>       // SignalThread this makes an assert in thread.cc fire.
>       //
>       // Calling Stop() on the worker ensures that the OS thread that underlies
>       // the worker will finish, and will be set to NULL, enabling us to call
>       // Start() again.
>       worker_.Stop();
85c115
<       delete this;
---
>       refcount_--;
92c122,127
<   main_->Post(this, ST_MSG_WORKER_DONE);
---
>   {
>     EnterExit ee(this);
>     if (main_) {
>       main_->Post(this, ST_MSG_WORKER_DONE);
>     }
>   }
diff -r libjingle-0.4.0/talk/base/signalthread.h libjingle/files/talk/base/signalthread.h
15a16,19
> //   Periodic tasks: Wait for SignalWorkDone, then eventually call Start()
> //    again to repeat the task. When the instance isn't needed anymore,
> //    call Release. DoWork, OnWorkStart and OnWorkStop are called again,
> //    on a new thread.
22c26
< class SignalThread : protected MessageHandler {
---
> class SignalThread : public sigslot::has_slots<>, protected MessageHandler {
35,36c39,41
<   // SignalWorkDone will not be signalled.
<   void Destroy();
---
>   // SignalWorkDone will not be signalled.  If wait is true, does not return
>   // until the thread is deleted.
>   void Destroy(bool wait);
53c58
<   
---
> 
57c62
<   // Context: Worker Thread.  Subclass should call periodically to
---
>   // Context: Worker Thread.  Subclass should call periodically to 
67c72
<   
---
>  
79a85,106
>   class EnterExit {
>     friend class SignalThread;
>    
>     SignalThread * t_;
>    
>     EnterExit(SignalThread * t) : t_(t) {
>       t_->cs_.Enter();
>       t_->refcount_ += 1;
>     }
>     ~EnterExit() {
>       bool d = (0 == (--(t_->refcount_)));
>       t_->cs_.Leave();
>       if (d)
>         delete t_;
>     }
>   };
> 
>   friend class EnterExit;
>  
>   CriticalSection cs_;
>   int refcount_;
> 
80a108
>   void OnMainThreadDestroyed();
84c112,118
<   enum State { kInit, kRunning, kComplete, kStopping, kReleasing } state_;
---
>   enum State {
>     kInit,            // Initialized, but not started
>     kRunning,         // Started and doing work
>     kReleasing,       // Same as running, but to be deleted when work is done
>     kComplete,        // Work is done
>     kStopping,        // Work is being interrupted
>   } state_;
diff -r libjingle-0.4.0/talk/base/sigslot.h libjingle/files/talk/base/sigslot.h
530c530
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
676c676
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
807c807
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
937c937
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
1067c1067
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
1199c1199
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
1331c1331
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
1463c1463
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
1596c1596
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
diff -r libjingle-0.4.0/talk/base/socket.h libjingle/files/talk/base/socket.h
77a78
> #undef ETIMEDOUT // remove pthread.h's definition
diff -r libjingle-0.4.0/talk/base/socketadapters.cc libjingle/files/talk/base/socketadapters.cc
43a44,45
> #include <cstring>
> 
diff -r libjingle-0.4.0/talk/base/socketaddress.cc libjingle/files/talk/base/socketaddress.cc
52c52
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
54c54
< #else // !_DEBUG
---
> #else // defined(NDEBUG)
56c56
< #endif // !_DEBUG
---
> #endif // !defined(NDEBUG)
diff -r libjingle-0.4.0/talk/base/socketfactory.h libjingle/files/talk/base/socketfactory.h
32a33
> #include "talk/base/ssladapter.h"
46a48,52
> 
>   // Wraps the given socket in an SSL adapter.
>   virtual SSLAdapter* CreateSSLAdapter(AsyncSocket* socket) {
>     return SSLAdapter::Create(socket);
>   }
diff -r libjingle-0.4.0/talk/base/socketpool.cc libjingle/files/talk/base/socketpool.cc
142d141
<     ASSERT(false);
189d187
<       ASSERT(false);
diff -r libjingle-0.4.0/talk/base/ssladapter.cc libjingle/files/talk/base/ssladapter.cc
34c34,35
< #define SSL_USE_OPENSSL 1
---
> // Turn off OpenSSL
> //#define SSL_USE_OPENSSL 1
84a86
> #if SSL_USE_OPENSSL || SSL_USE_SCHANNEL
85a88,90
> #else
>   return NULL;
> #endif
diff -r libjingle-0.4.0/talk/base/stream.cc libjingle/files/talk/base/stream.cc
27a28
> #include <stdio.h>
diff -r libjingle-0.4.0/talk/base/stringencode.cc libjingle/files/talk/base/stringencode.cc
34a35
> #include <stdlib.h>
525c526
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
575c576
< #endif  // _DEBUG
---
> #endif  // !defined(NDEBUG)
diff -r libjingle-0.4.0/talk/base/stringutils.cc libjingle/files/talk/base/stringutils.cc
72c72
< #if _DEBUG
---
> #if !defined(NDEBUG)
76c76
< #endif  // _DEBUG
---
> #endif  // !defined(NDEBUG)
diff -r libjingle-0.4.0/talk/base/stringutils.h libjingle/files/talk/base/stringutils.h
33a34
> #include <string.h>
87a89
> #if 0
93a96
> #endif
200,208d202
< size_t sprintfn(CTYPE* buffer, size_t buflen, const CTYPE* format, ...) {
<   va_list args;
<   va_start(args, format);
<   size_t len = vsprintfn(buffer, buflen, format, args);
<   va_end(args);
<   return len;
< }
< 
< template<class CTYPE>
218a213,221
> template<class CTYPE>
> size_t sprintfn(CTYPE* buffer, size_t buflen, const CTYPE* format, ...) {
>   va_list args;
>   va_start(args, format);
>   size_t len = vsprintfn(buffer, buflen, format, args);
>   va_end(args);
>   return len;
> }
> 
272c275
<   inline static const char* Traits<char>::empty_str() { return ""; }
---
>   inline static const char* empty_str() { return ""; }
diff -r libjingle-0.4.0/talk/base/task.cc libjingle/files/talk/base/task.cc
5c5
<  * Redistribution and use in source and binary forms, with or without 
---
>  * Redistribution and use in source and binary forms, with or without
8c8
<  *  1. Redistributions of source code must retain the above copyright notice, 
---
>  *  1. Redistributions of source code must retain the above copyright notice,
13c13
<  *  3. The name of the author may not be used to endorse or promote products 
---
>  *  3. The name of the author may not be used to endorse or promote products
17c17
<  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
---
>  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19c19
<  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
---
>  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23,24c23,24
<  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
<  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
---
>  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
141c141
<   if (aborted_ || done_)
---
>   if (done_)
150c150
<       Wake();  // to self-delete
---
>       GetRunner()->WakeTasks();
diff -r libjingle-0.4.0/talk/base/taskrunner.h libjingle/files/talk/base/taskrunner.h
63a64,68
>   bool HasPendingTimeoutTask() {
>     return next_timeout_task_ != NULL &&
>         next_timeout_task_->TimedOut();
>   }
> 
diff -r libjingle-0.4.0/talk/base/testclient.cc libjingle/files/talk/base/testclient.cc
29a30
> #include <cstring>
diff -r libjingle-0.4.0/talk/base/thread.cc libjingle/files/talk/base/thread.cc
100a101,105
> bool ThreadManager::ThreadActive(Thread *thread) {
>   CritScope cs(&crit_);
>   return(std::find(threads_.begin(), threads_.end(), thread) != threads_.end());
> }
> 
103a109
>   stopped_ = false;
124,125c130,135
<   pthread_create(&thread_, &attr, PreRun, this);
<   started_ = true;
---
>   CritScope cs(&started_crit_);
>   // Make sure Join() hasn't been called yet.
>   if (stopped_)
>     return;
>   if (pthread_create(&thread_, &attr, PreRun, this) == 0)
>       started_ = true;
128a139,140
>   CritScope cs(&started_crit_);
>   stopped_ = true;
131a144
>     started_ = false;
168a182,185
>   CritScope cs(&started_crit_);
>   // Make sure Join() hasn't been called yet.
>   if (stopped_)
>     return;
181a199,200
>   CritScope cs(&started_crit_);
>   stopped_ = true;
191a211,213
>   // Make sure the thread hasn't been deleted.
>   if (!g_thmgr.ThreadActive(thread))
>     return NULL;
207c229
<   MessageQueue::Stop();
---
>   MessageQueue::Quit();
329c351
<       return false;
---
>       return !IsQuitting();
diff -r libjingle-0.4.0/talk/base/thread.h libjingle/files/talk/base/thread.h
57a58
>   bool ThreadActive(Thread *thread);
134a136
>   CriticalSection started_crit_;
135a138
>   bool stopped_;
diff -r libjingle-0.4.0/talk/base/urlencode.cc libjingle/files/talk/base/urlencode.cc
0a1,2
> #include <stdlib.h>
> #include <string.h>
Only in libjingle-0.4.0/talk/base: win32socketserver.cc
Only in libjingle-0.4.0/talk/base: win32socketserver.h
Only in libjingle/files/talk/base: win32window.cc
diff -r libjingle-0.4.0/talk/base/winping.cc libjingle/files/talk/base/winping.cc
133c133
<   return sizeof(ICMP_ECHO_REPLY) + max(8UL, data_size);
---
>   return sizeof(ICMP_ECHO_REPLY) + _max((uint32)(8UL), data_size);
317c317
< } // namespace talk_base
\ No newline at end of file
---
> } // namespace talk_base
Only in libjingle/files/talk/base: winsock_initializer.cc
Only in libjingle/files/talk/base: winsock_initializer.h
Only in libjingle-0.4.0/talk: examples
Only in libjingle-0.4.0/talk: libjingle.sln
Only in libjingle-0.4.0/talk: libjingle.vcproj
Only in libjingle-0.4.0/talk: p2p
Only in libjingle-0.4.0/talk: session
Only in libjingle-0.4.0/talk: third_party
Only in libjingle-0.4.0/talk/xmllite: Makefile.in
diff -r libjingle-0.4.0/talk/xmllite/qname.cc libjingle/files/talk/xmllite/qname.cc
39c39
<   int result = ns.size() * 101;
---
>   int result = static_cast<int>(ns.size()) * 101;
diff -r libjingle-0.4.0/talk/xmllite/qname.h libjingle/files/talk/xmllite/qname.h
64d63
<       refcount_(1),
66c65,66
<       localPart_(local) {}
---
>       localPart_(local),
>       refcount_(1) {}
diff -r libjingle-0.4.0/talk/xmllite/xmlelement.cc libjingle/files/talk/xmllite/xmlelement.cc
88c88,89
<     pLastChild_(NULL) {
---
>     pLastChild_(NULL),
>     cdata_(false) {
97c98,99
<     pLastChild_(NULL) {
---
>     pLastChild_(NULL),
>     cdata_(false) {
125a128
>   cdata_ = elt.cdata_;
133c136,137
<   pLastChild_(NULL) {
---
>   pLastChild_(NULL),
>   cdata_(false) {
393a398,403
> XmlElement::AddCDATAText(const char * buf, int len) {
>   cdata_ = true;
>   AddParsedText(buf, len);
> }
> 
> void
diff -r libjingle-0.4.0/talk/xmllite/xmlelement.h libjingle/files/talk/xmllite/xmlelement.h
203a204,206
>   // Note: CDATA is not supported by XMPP, therefore using this function will
>   // generate non-XMPP compatible XML.
>   void AddCDATAText(const char * buf, int len);
217a221,222
>   bool IsCDATA() const { return cdata_; }
> 
228a234
>   bool cdata_;
diff -r libjingle-0.4.0/talk/xmllite/xmlparser.cc libjingle/files/talk/xmllite/xmlparser.cc
28,29d27
< #include "talk/xmllite/xmlparser.h"
< 
35a34
> #include "talk/xmllite/xmlconstants.h"
38c37
< #include "talk/xmllite/xmlconstants.h"
---
> #include "talk/xmllite/xmlparser.h"
119a119,121
>   context_.SetPosition(XML_GetCurrentLineNumber(expat_),
>                        XML_GetCurrentColumnNumber(expat_),
>                        XML_GetCurrentByteIndex(expat_));
127a130,132
>   context_.SetPosition(XML_GetCurrentLineNumber(expat_),
>                        XML_GetCurrentColumnNumber(expat_),
>                        XML_GetCurrentByteIndex(expat_));
134a140,142
>   context_.SetPosition(XML_GetCurrentLineNumber(expat_),
>                        XML_GetCurrentColumnNumber(expat_),
>                        XML_GetCurrentByteIndex(expat_));
168c176,180
<   if (XML_Parse(expat_, data, static_cast<int>(len), isFinal) != XML_STATUS_OK)
---
>   if (XML_Parse(expat_, data, static_cast<int>(len), isFinal) !=
>       XML_STATUS_OK) {
>     context_.SetPosition(XML_GetCurrentLineNumber(expat_),
>                          XML_GetCurrentColumnNumber(expat_),
>                          XML_GetCurrentByteIndex(expat_));
169a182
>   }
193c206,209
<     raised_(XML_ERROR_NONE) {
---
>     raised_(XML_ERROR_NONE),
>     line_number_(0),
>     column_number_(0),
>     byte_index_(0) {
247c263,285
< XmlParser::ParseContext::~ParseContext() {
---
> void
> XmlParser::ParseContext::SetPosition(XML_Size line, XML_Size column,
>                                      XML_Index byte_index) {
>   line_number_ = line;
>   column_number_ = column;
>   byte_index_ = byte_index;
> }
> 
> void
> XmlParser::ParseContext::GetPosition(unsigned long * line,
>                                      unsigned long * column,
>                                      unsigned long * byte_index) {
>   if (line != NULL) {
>     *line = static_cast<unsigned long>(line_number_);
>   }
> 
>   if (column != NULL) {
>     *column = static_cast<unsigned long>(column_number_);
>   }
> 
>   if (byte_index != NULL) {
>     *byte_index = static_cast<unsigned long>(byte_index_);
>   }
249a288
> XmlParser::ParseContext::~ParseContext() {
251a291
> }
diff -r libjingle-0.4.0/talk/xmllite/xmlparser.h libjingle/files/talk/xmllite/xmlparser.h
48a49,50
>   virtual void GetPosition(unsigned long * line, unsigned long * column,
>                            unsigned long * byte_index) = 0;
85a88,89
>     virtual void GetPosition(unsigned long * line, unsigned long * column,
>                              unsigned long * byte_index);
91a96
>     void SetPosition(XML_Size line, XML_Size column, XML_Index byte_index);
96a102,104
>     XML_Size line_number_;
>     XML_Size column_number_;
>     XML_Index byte_index_;
diff -r libjingle-0.4.0/talk/xmllite/xmlprinter.cc libjingle/files/talk/xmllite/xmlprinter.cc
46a47
>   void PrintCDATAText(const std::string & text);
134,136c135,141
<       if (pchild->IsText())
<         PrintBodyText(pchild->AsText()->Text());
<       else
---
>       if (pchild->IsText()) {
>         if (element->IsCDATA()) {
>           PrintCDATAText(pchild->AsText()->Text());
>         } else {
>           PrintBodyText(pchild->AsText()->Text());
>         }
>       } else
188a194,197
> void
> XmlPrinterImpl::PrintCDATAText(const std::string & text) {
>   *pout_ << "<![CDATA[" << text << "]]>";
> }
Only in libjingle-0.4.0/talk/xmpp: Makefile.in
Only in libjingle-0.4.0/talk/xmpp: constants.cc
Only in libjingle-0.4.0/talk/xmpp: constants.h
diff -r libjingle-0.4.0/talk/xmpp/jid.cc libjingle/files/talk/xmpp/jid.cc
33c33
< #include "talk/xmpp/constants.h"
---
> #include "talk/xmpp/xmppconstants.h"
diff -r libjingle-0.4.0/talk/xmpp/plainsaslhandler.h libjingle/files/talk/xmpp/plainsaslhandler.h
31d30
< #include "talk/xmpp/saslhandler.h"
32a32,34
> #include <string>
> 
> #include "talk/xmpp/saslhandler.h"
68a71,76
> 
>   virtual bool GetTlsServerInfo(const talk_base::SocketAddress& server,
>                                 std::string* tls_server_hostname,
>                                 std::string* tls_server_domain) {
>     return false;
>   }
diff -r libjingle-0.4.0/talk/xmpp/prexmppauth.h libjingle/files/talk/xmpp/prexmppauth.h
33d32
< #include "talk/xmpp/saslhandler.h"
64c63
< class PreXmppAuth : public SaslHandler {
---
> class PreXmppAuth {
diff -r libjingle-0.4.0/talk/xmpp/saslcookiemechanism.h libjingle/files/talk/xmpp/saslcookiemechanism.h
33c33
< #include "talk/xmpp/constants.h"
---
> #include "talk/xmpp/xmppconstants.h"
40,41c40,55
<   SaslCookieMechanism(const std::string & mechanism, const std::string & username, const std::string & cookie) :
<     mechanism_(mechanism), username_(username), cookie_(cookie) {}
---
>   SaslCookieMechanism(const std::string & mechanism,
>                       const std::string & username,
>                       const std::string & cookie,
>                       const std::string & token_service)
>     : mechanism_(mechanism),
>       username_(username),
>       cookie_(cookie),
>       token_service_(token_service) {}
> 
>   SaslCookieMechanism(const std::string & mechanism,
>                       const std::string & username,
>                       const std::string & cookie)
>     : mechanism_(mechanism),
>       username_(username),
>       cookie_(cookie),
>       token_service_("") {}
48a63,67
>     if (!token_service_.empty()) {
>       el->AddAttr(
>           QName(true, "http://www.google.com/talk/protocol/auth", "service"),
>           token_service_);
>     }
62a82
>   std::string token_service_;
diff -r libjingle-0.4.0/talk/xmpp/saslhandler.h libjingle/files/talk/xmpp/saslhandler.h
31a32,34
> #include <vector>
> 
> #include "talk/base/socketaddress.h"
53a57,63
> 
>   // Fills in the tls server hostname/domain to use for the given
>   // server (and returns true).  Return false if you want the defaults
>   // to be used.
>   virtual bool GetTlsServerInfo(const talk_base::SocketAddress& server,
>                                 std::string* tls_server_hostname,
>                                 std::string* tls_server_domain) = 0;
diff -r libjingle-0.4.0/talk/xmpp/saslmechanism.cc libjingle/files/talk/xmpp/saslmechanism.cc
30c30
< #include "talk/xmpp/constants.h"
---
> #include "talk/xmpp/xmppconstants.h"
diff -r libjingle-0.4.0/talk/xmpp/xmppclient.cc libjingle/files/talk/xmpp/xmppclient.cc
30c30
< #include "talk/xmpp/constants.h"
---
> #include "talk/xmpp/xmppconstants.h"
32a33
> #include "talk/xmpp/saslhandler.h"
68a70
>   scoped_ptr<SaslHandler> sasl_handler_;
93c95,99
< XmppClient::Connect(const XmppClientSettings & settings, const std::string & lang, AsyncSocket * socket, PreXmppAuth * pre_auth) {
---
> XmppClient::Connect(const XmppClientSettings & settings,
>                     const std::string & lang,
>                     AsyncSocket * socket,
>                     PreXmppAuth * pre_auth,
>                     SaslHandler * sasl_handler) {
113,125c119,125
<   //
<   // The talk.google.com server expects you to use "gmail.com" in the
<   // stream, and expects the domain certificate to be "gmail.com" as well.
<   // For all other servers, we leave the strings empty, which causes
<   // the jid's domain to be used.  "foo@example.com" -> stream to="example.com"
<   // tls certificate for "example.com"
<   //
<   // This is only true when using Gaia auth, so let's say if there's no preauth,
<   // we should use the actual server name
<   if ((settings.server().IPAsString() == buzz::STR_TALK_GOOGLE_COM ||
<       settings.server().IPAsString() == buzz::STR_TALKX_L_GOOGLE_COM) && 
<       pre_auth != NULL) {
<     d_->engine_->SetTlsServer(buzz::STR_GMAIL_COM, buzz::STR_GMAIL_COM);
---
>   if (sasl_handler) {
>     std::string tls_server_hostname, tls_server_domain;
>     if (sasl_handler->GetTlsServerInfo(settings.server(),
>                                        &tls_server_hostname,
>                                        &tls_server_domain)) {
>       d_->engine_->SetTlsServer(tls_server_hostname, tls_server_domain);
>     }
139a140
>   d_->sasl_handler_.reset(sasl_handler);
200a202,209
>   if (d_->sasl_handler_.get()) {
>     d_->engine_->SetSaslHandler(d_->sasl_handler_.release());
>   }
>   else {
>     d_->engine_->SetSaslHandler(new PlainSaslHandler(
>         d_->engine_->GetUser(), d_->pass_, d_->allow_plain_));
>   }
> 
209,210d217
<     d_->engine_->SetSaslHandler(new PlainSaslHandler(
<               d_->engine_->GetUser(), d_->pass_, d_->allow_plain_));
253,254d259
<   // transfer ownership of pre_auth_ to engine
<   d_->engine_->SetSaslHandler(d_->pre_auth_.release());
261a267,268
>     d_->pre_engine_error_ = XmppEngine::ERROR_SOCKET;
>     d_->pre_engine_subcode_ = d_->socket_->GetError();
347c354
< //#ifdef _DEBUG
---
> //#if !defined(NDEBUG)
375c382
< //#ifdef _DEBUG
---
> //#if !defined(NDEBUG)
diff -r libjingle-0.4.0/talk/xmpp/xmppclient.h libjingle/files/talk/xmpp/xmppclient.h
42a43
> class SaslHandler;
80c81,82
<                            PreXmppAuth * preauth);
---
>                            PreXmppAuth * preauth,
>                            SaslHandler * sasl_handler);
141c143
<   std::string XmppClient::GetStateName(int state) const {
---
>   std::string GetStateName(int state) const {
diff -r libjingle-0.4.0/talk/xmpp/xmppclientsettings.h libjingle/files/talk/xmpp/xmppclientsettings.h
31d30
< #include "talk/p2p/base/port.h"
32a32,45
> #include "talk/base/proxyinfo.h"
> 
> namespace cricket {
> 
> // This enum was taken from talk/p2p/base/port.h, which is the only
> // thing we actually need from the p2p directory.
> enum ProtocolType {
>   PROTO_UDP,
>   PROTO_TCP,
>   PROTO_SSLTCP,
>   PROTO_LAST = PROTO_SSLTCP
> };
> 
> }  // namespace cricket
59a73,75
>   void set_token_service(const std::string & token_service) {
>     token_service_ = token_service;
>   }
75a92
>   const std::string & token_service() const { return token_service_; }
93a111
>   std::string token_service_;
Only in libjingle/files/talk/xmpp: xmppconstants.cc
Only in libjingle/files/talk/xmpp: xmppconstants.h
diff -r libjingle-0.4.0/talk/xmpp/xmppengineimpl.cc libjingle/files/talk/xmpp/xmppengineimpl.cc
37c37
< #include "talk/xmpp/constants.h"
---
> #include "talk/xmpp/xmppconstants.h"
diff -r libjingle-0.4.0/talk/xmpp/xmppengineimpl_iq.cc libjingle/files/talk/xmpp/xmppengineimpl_iq.cc
32c32
< #include "talk/xmpp/constants.h"
---
> #include "talk/xmpp/xmppconstants.h"
diff -r libjingle-0.4.0/talk/xmpp/xmpplogintask.cc libjingle/files/talk/xmpp/xmpplogintask.cc
34c34
< #include "talk/xmpp/constants.h"
---
> #include "talk/xmpp/xmppconstants.h"
44c44
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
59c59
< #endif  // _DEBUG
---
> #endif  // !defined(NDEBUG)
103c103
< #if _DEBUG
---
> #if !defined(NDEBUG)
106c106
< #endif  // _DEBUG
---
> #endif  // !defined(NDEBUG)
218a219,221
>         auth->SetAttr(QN_GOOGLE_ALLOW_GENERATED_JID_XMPP_LOGIN, "true");
>         auth->SetAttr(QN_GOOGLE_AUTH_CLIENT_USES_FULL_BIND_RESULT, "true");
> 
diff -r libjingle-0.4.0/talk/xmpp/xmpplogintask.h libjingle/files/talk/xmpp/xmpplogintask.h
93c93
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
95c95
< #endif  // _DEBUG
---
> #endif  // !defined(NDEBUG)
diff -r libjingle-0.4.0/talk/xmpp/xmppstanzaparser.cc libjingle/files/talk/xmpp/xmppstanzaparser.cc
32c32
< #include "talk/xmpp/constants.h"
---
> #include "talk/xmpp/xmppconstants.h"
diff -r libjingle-0.4.0/talk/xmpp/xmpptask.cc libjingle/files/talk/xmpp/xmpptask.cc
31c31
< #include "talk/xmpp/constants.h"
---
> #include "talk/xmpp/xmppconstants.h"
40c40
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
88c88
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
174c174
< }
\ No newline at end of file
---
> }
diff -r libjingle-0.4.0/talk/xmpp/xmpptask.h libjingle/files/talk/xmpp/xmpptask.h
80c80
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
106,107c106,107
<   XmlElement *MakeIqResult(const XmlElement* query);
<   XmlElement *MakeIq(const std::string& type,
---
>   static XmlElement *MakeIqResult(const XmlElement* query);
>   static XmlElement *MakeIq(const std::string& type,
123c123
< #ifdef _DEBUG
---
> #if !defined(NDEBUG)
diff -r libjingle-0.4.0/talk/base/common.cc libjingle/files/talk/base/common.cc
62c62
< } // namespace talk_base
\ No newline at end of file
---
> } // namespace talk_base
diff -r libjingle-0.4.0/talk/base/httpbase.cc libjingle/files/talk/base/httpbase.cc
154c154
<         if (sscanf(value, "%d", &data_size_) != 1) {
---
>         if (sscanf(value, "%zu", &data_size_) != 1) {
diff -r libjingle-0.4.0/talk/base/httpcommon.cc libjingle/files/talk/base/httpcommon.cc
339c339
<                   &tval.tm_hour, &tval.tm_min, &tval.tm_sec, &zone)) {
---
>                   &tval.tm_hour, &tval.tm_min, &tval.tm_sec, zone)) {
472c472
<   uint32 vmajor, vminor;
---
>   unsigned long vmajor, vminor;
549,550c549,550
<   uint32 vmajor, vminor;
<   if ((sscanf(line, "HTTP/%lu.%lu %lu%n", &vmajor, &vminor, &scode, &pos) != 3)
---
>   unsigned long vmajor, vminor;
>   if ((sscanf(line, "HTTP/%lu.%lu %lu%zu", &vmajor, &vminor, &scode, &pos) != 3)
693c693
<     sprintf(buffer, "%d", time(0));
---
>     sprintf(buffer, "%ld", time(0));
diff -r libjingle-0.4.0/talk/base/httpcommon.h libjingle/files/talk/base/httpcommon.h
329c329
<   uint32 scode;
---
>   unsigned long scode;
diff -r libjingle-0.4.0/talk/base/diskcache.cc libjingle/files/talk/base/diskcache.cc
300c300
<   if (1 != sscanf(pathname.extension().c_str(), ".%u", index))
---
>   if (1 != sscanf(pathname.extension().c_str(), ".%zu", index))
diff -r libjingle-0.4.0/talk/base/logging.cc libjingle/files/talk/base/logging.cc
69c69
<   snprintf(buffer, sizeof(buffer), "0x%08lx", err);  
---
>   snprintf(buffer, sizeof(buffer), "0x%08x", err);  
diff -r libjingle-0.4.0/talk/base/socketadapters.cc libjingle/files/talk/base/socketadapters.cc
360,361c360,361
<     uint32 code;
<     if (sscanf(data, "HTTP/%*lu.%*lu %lu", &code) != 1) {
---
>     unsigned long code;
>     if (sscanf(data, "HTTP/%*u.%*u %lu", &code) != 1) {
