⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sbinetchannel.cpp

📁 sloedgy open sip stack source code
💻 CPP
📖 第 1 页 / 共 3 页
字号:
 
 
 VXIinetResult
 SBinetChannel::staticWrite(/* [IN]  */ VXIinetInterface*      pThis,
                            /* [OUT] */ const VXIbyte*   pBuffer,
                            /* [IN]  */ VXIulong         nBuflen,
                            /* [OUT] */ VXIulong*        pnWritten,
                            /* [IN]  */ VXIinetStream*   pStream      )
 {
   SBinetChannel* chan = static_cast<SBinetChannel*>(pThis);
   if (!chan)
   {
     return (VXIinet_RESULT_INVALID_ARGUMENT);
   }
 
   VXIinetResult rc = VXIinet_RESULT_SUCCESS;
   SBinetLogFunc apiTrace(chan->GetLog(),
                          chan->GetDiagBase() + MODULE_SBINET_API_TAGID,
                          L"SBinetChannel::Write", (int *) &rc,
                          L"entering: 0x%p, 0x%p, %lu, 0x%p, 0x%p",
                          pThis, pBuffer, nBuflen, pnWritten, pStream);
 
   if (pStream == NULL)
   {
     chan->Error(200, L"%s%s", L"Operation", L"Write");
     return (rc = VXIinet_RESULT_INVALID_ARGUMENT);
   }
 
   rc = (pStream->Write)(pBuffer, nBuflen, pnWritten);
 
   if ((rc != VXIinet_RESULT_SUCCESS) &&
       (rc != VXIinet_RESULT_WOULD_BLOCK))
   {
     chan->Error(207,L"%s%d",L"rc",rc);
   }
 
   return rc;
 }
 
 /*
  * Call Channel method
  */
 VXIinetResult
 SBinetChannel::staticSetCookieJar( /* [IN]  */ VXIinetInterface*      pThis,
                                    /* [IN]  */ const VXIVector*       pJar )
 {
   SBinetChannel* chan = static_cast<SBinetChannel*>(pThis);
   if (!chan)
   {
     return (VXIinet_RESULT_INVALID_ARGUMENT);
   }
 
   VXIinetResult rc = VXIinet_RESULT_SUCCESS;
   SBinetLogFunc apiTrace (chan->GetLog(), chan->GetDiagBase() +
 			  MODULE_SBINET_API_TAGID,
 			  L"SBinetChannel::SetCookieJar", (int *) &rc,
 			  L"entering: 0x%p, 0x%p", pThis, pJar);
 
   rc = chan->setCookieJar(pJar);
   if (rc != VXIinet_RESULT_SUCCESS) {
     chan->Error(208,L"%s%d",L"rc",rc);
   }
   return (rc);
 }
 
 /*
  * Call Channel method
  */
 VXIinetResult
 SBinetChannel::staticGetCookieJar( /* [IN]  */ VXIinetInterface*      pThis,
                                    /* [OUT] */ VXIVector**            ppJar,
                                    /* [OUT] */ VXIbool*               pfChanged   )
 {
   SBinetChannel* chan = static_cast<SBinetChannel*>(pThis);
   if (!chan)
   {
     return (VXIinet_RESULT_INVALID_ARGUMENT);
   }
 
   VXIinetResult rc = VXIinet_RESULT_SUCCESS;
   SBinetLogFunc apiTrace (chan->GetLog(), chan->GetDiagBase() +
 			  MODULE_SBINET_API_TAGID,
 			  L"SBinetChannel::GetCookieJar", (int *) &rc,
 			  L"entering: 0x%p, 0x%p, 0x%p", pThis, ppJar,
 			  pfChanged);
 
   rc = chan->getCookieJar(ppJar,pfChanged);
   if (rc != VXIinet_RESULT_SUCCESS)
   {
     chan->Error(209, L"%s%d", L"rc", rc);
   }
   return (rc);
 }
 
 
 // Init class at startup
 VXIinetResult SBinetChannel::init(const VXIMap *configParams, const SWIutilLogger *logger)
 {
   // User agent
   const VXIchar *userAgent = SBinetUtils::getString(configParams, SBINET_USER_AGENT_NAME);
 
   if (!userAgent || !*userAgent)
   {
     // Have to parse the user agent name
 #ifdef OPENVXI
      userAgent = OSBINET_USER_AGENT_NAME_DEFAULT;
 #else
      userAgent = SBINET_USER_AGENT_NAME_DEFAULT;
 #endif
   }
   if (!_userAgent)
     _userAgent = new SBinetNString(userAgent);
   else
     _userAgent->operator=(userAgent);
 
   // Proxy rules.
   const VXIValue * tmp = VXIMapGetProperty(configParams, SBINET_PROXY_RULES);
   if (tmp != NULL && VXIValueGetType(tmp) == VALUE_VECTOR)
   {
     const VXIVector *proxyRules = (const VXIVector *) tmp;
     VXIunsigned n = VXIVectorLength(proxyRules);
     for (VXIunsigned i = 0; i < n; i++)
     {
       tmp = VXIVectorGetElement(proxyRules, i);
       if (tmp != NULL && VXIValueGetType(tmp) == VALUE_STRING)
       {
         SBinetNString rule = VXIStringCStr((const VXIString *) tmp);
         SBinetProxyMatcher *p = SBinetProxyMatcher::createMatcher(rule.c_str(), logger);
         if (p != NULL)
         {
           _proxyMatcherList.addLast(p);
         }
       }
     }
   }
 
   // Extension rules
   if (! _extensionRulesMutex)
     VXItrdMutexCreate(&_extensionRulesMutex);
 
   if (VXItrdMutexLock(_extensionRulesMutex) == VXItrd_RESULT_SUCCESS)
   {
     if (_extensionRules)
       VXIMapDestroy(&_extensionRules);
 
     const VXIValue *tmp = VXIMapGetProperty(configParams, SBINET_EXTENSION_RULES);
     const VXIMap *extensionRules = NULL;
     if (tmp != NULL && VXIValueGetType(tmp) == VALUE_MAP)
       extensionRules = (const VXIMap *) tmp;
 
     if (extensionRules)
       _extensionRules = VXIMapClone(extensionRules);
     else
       _extensionRules = NULL;
 
     VXItrdMutexUnlock(_extensionRulesMutex);
   }
 
   VXIint32 itmp;
 
   // page load time out.
   itmp = SBINET_PAGE_LOADING_TIMEOUT_DEFAULT;
   SBinetUtils::getInteger(configParams, SBINET_PAGE_LOADING_TIMEOUT, itmp);
   setPageLoadTimeout(itmp);
 
   // freshness fraction
   VXIflt32 ftmp = (VXIflt32) SBINET_FRESHNESS_FRACTION_DEFAULT;
   SBinetUtils::getFloat(configParams, SBINET_FRESHNESS_FRACTION, ftmp);
   setFreshnessFraction(ftmp);
 
   // freshness lifetime
   itmp = SBINET_FRESHNESS_LIFETIME_DEFAULT;
   SBinetUtils::getInteger(configParams, SBINET_FRESHNESS_LIFETIME, itmp);
   setFreshnessLifetime((time_t) itmp);
 
   // max lifetime
   itmp = SBINET_MAX_LIFETIME_DEFAULT;
   SBinetUtils::getInteger(configParams, SBINET_MAX_LIFETIME, itmp);
   setMaxLifetime((time_t) itmp);
 
   // post continue timeout.
   itmp = SBINET_POST_CONTINUE_TIMEOUT_DEFAULT;
   SBinetUtils::getInteger(configParams, SBINET_POST_CONTINUE_TIMEOUT, itmp);
   setPostContinueTimeout(itmp);
 
   const VXIchar* defaultMimeType = SBinetUtils::getString(configParams, SBINET_DEFAULT_MIME_TYPE);
   if (!defaultMimeType)
     defaultMimeType = L"application/octet-stream";
 
   if (!_defaultMimeType)
     _defaultMimeType = new SBinetString(defaultMimeType);
   else
     _defaultMimeType->operator=(defaultMimeType);
 
   itmp = 1;
   SBinetUtils::getInteger(configParams, SBINET_PERSISTENT_CONNECTIONS, itmp);
   setUsePersistentConnections(itmp != 0);
 
   if (SBinetSSLsocket::initialize() == 0)
     return VXIinet_RESULT_SUCCESS;
   else
     return VXIinet_RESULT_PLATFORM_ERROR;
 }
 
 
 // Shutdown class
 void SBinetChannel::shutdown()
 {
   delete _userAgent;
   _userAgent = NULL;
 
   if (VXItrdMutexLock(_extensionRulesMutex) == VXItrd_RESULT_SUCCESS)
   {
     if (_extensionRules)
       VXIMapDestroy(&_extensionRules);
 
     VXItrdMutexUnlock(_extensionRulesMutex);
     VXItrdMutexDestroy(&_extensionRulesMutex);
   }
 
   SBinetSSLsocket::shutdown();
 }
 
 
 void SBinetChannel::addExtensionRule(const VXIchar* ext,
 				     const VXIchar* mimeType)
 {
   if (! mimeType) return;
 
   if (VXItrdMutexLock(_extensionRulesMutex) == VXItrd_RESULT_SUCCESS) {
     if (! _extensionRules)
       _extensionRules = VXIMapCreate();
 
     if (_extensionRules)
       VXIMapSetProperty(_extensionRules, ext,
 			(VXIValue *) VXIStringCreate(mimeType));
     VXItrdMutexUnlock(_extensionRulesMutex);
   }
 }
 
 
 const VXIchar *SBinetChannel::mapExtension(const VXIchar* ext)
 {
   if (ext == NULL) return NULL;
 
   const VXIchar *ret = NULL;
   if (VXItrdMutexLock(_extensionRulesMutex) == VXItrd_RESULT_SUCCESS) {
     if (_extensionRules)
       ret = SBinetUtils::getString(_extensionRules, ext);
     VXItrdMutexUnlock(_extensionRulesMutex);
   }
 
   return ret;
 }
 
 const char *SBinetChannel::getUserAgent()
 {
   return _userAgent ? _userAgent->c_str() : "";
 }
 
 const VXIchar *SBinetChannel::getDefaultMimeType()
 {
   return _defaultMimeType ? _defaultMimeType->c_str() : L"";
 }
 
 VXIlogResult SBinetChannel::echoStreamWrite(const void *buffer, size_t buflen)
 {
   VXIlogResult rc = VXIlog_RESULT_SUCCESS;
 
   VXIulong totWritten = 0;
   while ((rc == VXIlog_RESULT_SUCCESS) && (totWritten < buflen)) {
     VXIulong nWritten = 0;
     rc = _pVXILog->ContentWrite(_pVXILog,
                                 reinterpret_cast<const VXIbyte *>(buffer) + totWritten,
                                 buflen - totWritten, &nWritten, _echoStream);
     totWritten += nWritten;
   }
 
   return rc;
 }
 
 // void SBinetChannel::eraseCookie(SBinetChannel::CookieList::iterator &vi)
 // {
 // #if defined(__GNUC__) && ((__GNUC__ <= 2) || (__GLIBCPP__ <= 20011023)) || (_decunix_)
 //   // Old STL has erase return void
 //   CookieList::iterator vi2 = vi;
 //   vi2++;
 //   _cookieList.erase (vi);
 //   vi = vi2;
 // #else
 //   // ISO C++ standard has erase return an iterator to the next
 //   // item
 //   vi = _cookieList.erase (vi);
 // #endif
 // }
 
 void SBinetChannel::setUsePersistentConnections(bool flag)
 {
   _usePersistentConnections = flag;
 }
 
 bool SBinetChannel::getUsePersistentConnections()
 {
   return _usePersistentConnections;
 }
 
 bool SBinetChannel::setPageLoadTimeout(VXIint32 timeout)
 {
   if (timeout <= 0)
     return false;
 
   _pageLoadTimeout = timeout;
   return true;
 }
 
 
 VXIint32 SBinetChannel::getPageLoadTimeout()
 {
   return _pageLoadTimeout;
 }
 
 bool SBinetChannel::setPostContinueTimeout(VXIint32 timeout)
 {
   if (timeout <= 0)
     return false;
 
   _postContinueTimeout = timeout;
   return true;
 }
 
 
 VXIint32 SBinetChannel::getPostContinueTimeout()
 {
   return _postContinueTimeout;
 }
 
 time_t SBinetChannel::getFreshnessLifetime()
 {
   return _freshnessLifetime;
 }
 
 bool SBinetChannel::setFreshnessLifetime(time_t freshnessLifetime)
 {
   if (freshnessLifetime >= (time_t) 0)
   {
     _freshnessLifetime = freshnessLifetime;
     return true;
   }
   return false;
 }
 
 double SBinetChannel::getFreshnessFraction()
 {
   return _freshnessFraction;
 }
 
 bool SBinetChannel::setFreshnessFraction(double freshnessFraction)
 {
   if (freshnessFraction >= 0.0 && freshnessFraction <= 1.0)
   {
     _freshnessFraction = freshnessFraction;
     return true;
   }
   return false;
 }
 
 time_t SBinetChannel::getMaxLifetime()
 {
   return _maxLifetime;
 }
 
 bool SBinetChannel::setMaxLifetime(time_t maxLifetime)
 {
   if (maxLifetime >= (time_t) 0)
   {
     _maxLifetime = maxLifetime;
     return true;
   }
   return false;
 }
 
 SBinetProxyMatcher *SBinetChannel::getProxyMatcher(const char *domain,
                                                    const char *path)
 {
   SWIList::Iterator iter(_proxyMatcherList);
 
   while (iter.hasNext())
   {
     SBinetProxyMatcher *p = static_cast<SBinetProxyMatcher *>(iter.next());
     if (p->matches(domain, path))
     {
       return p;
     }
   }
 
   return NULL;
 }
 
 SBinetHttpConnection *SBinetChannel::getHttpConnection(const SBinetURL *url,
                                                        const VXIMap *properties)
 {
   VXIint32 newConnection = !getUsePersistentConnections();
 
   const char *hostname = url->getNHost();
   const char *path = url->getNPath();
 
   int port = url->getPort();
 
   SBinetUtils::getInteger(properties, INET_NEW_CONNECTION, newConnection);
 
   const SBinetProxyMatcher *proxyMatcher = getProxyMatcher(hostname, path);
 
   const char *proxyServer = NULL;
   if (proxyMatcher != NULL)
     proxyServer = proxyMatcher->getProxyServer();
 
   // Ignore empty proxy server.
   if (proxyServer && !*proxyServer)
     proxyServer = NULL;
 
   bool usesProxy;
   if (proxyServer)
   {
     hostname = proxyServer;
     port = proxyMatcher->getProxyPort();
     usesProxy = true;
   }
   else
     usesProxy = false;
 
   SWIipAddress remoteAddress(hostname, port, this);
 
   // FIXME: This code should be protected by a Mutex once we have the cleaning
   // thread
   SBinetHttpConnection *conn = (SBinetHttpConnection *) _connectionMap.remove(remoteAddress);
 
   if (newConnection && conn)
   {
     delete conn;
     conn = NULL;
   }
   // FIXME: End of code section that should be protected.
 
   if (!conn)
   {
     char buf[10];
     sprintf(buf, "%d", _connectionCount++);
     conn = new SBinetHttpConnection(url->getProtocol(), remoteAddress,
                                     usesProxy, this, buf);
   }
 
   return conn;
 }
 
 void SBinetChannel::putHttpConnection(SBinetHttpConnection *connection)
 {
   // Ideally, we should check whether we own the connection.
 
   // FIXME: This code should be protected by a Mutex once we have the cleaning  thread
   const SWIipAddress *addr = connection->getRemoteAddress();
 
   SBinetHttpConnection *oldconn = (SBinetHttpConnection *)
     _connectionMap.putValue(*addr, connection);
   // FIXME: End of code section that should be protected.
 
   delete oldconn;
 }
 
 void SBinetChannel::closeHttpConnections()
 {
   // Iterate saved connections and dispose of them all
   SWIHashMap::Iterator it(_connectionMap);
   while (it.hasNext()) {
     const SBinetHttpConnection *conn = static_cast<const SBinetHttpConnection*>(it.next()->getValue());
     delete conn;
   }
 }


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -