mirror of https://github.com/aria2/aria2
				
				
				
			2010-03-25 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added vbegin() and vend() for fixed sized array. * src/DownloadHandlerConstants.cc * src/FeatureConfig.cc * src/OptionHandlerFactory.cc * src/ServerStat.cc * src/TimeA2.cc * src/XmlRpcMethod.cc * src/array_fun.h * src/download_helper.cc * src/messageDigest.cc * src/util.cc * test/BittorrentHelperTest.cc * test/DHTRoutingTableDeserializerTest.cc * test/DHTRoutingTableSerializerTest.cc * test/DefaultBtAnnounceTest.cc * test/DefaultBtProgressInfoFileTest.cc * test/DownloadContextTest.cc * test/DownloadHelperTest.cc * test/FeatureConfigTest.cc * test/FeedbackURISelectorTest.cc * test/HttpRequestTest.cc * test/InOrderURISelectorTest.cc * test/MSEHandshakeTest.cc * test/MultiDiskAdaptorTest.cc * test/MultiFileAllocationIteratorTest.cc * test/PriorityPieceSelectorTest.cc * test/RequestGroupManTest.cc * test/UtilTest.cc * test/XmlRpcMethodTest.cc * test/a2algoTest.cc * test/array_funTest.ccpull/1/head
							parent
							
								
									8477e463e9
								
							
						
					
					
						commit
						f15d22b619
					
				
							
								
								
									
										34
									
								
								ChangeLog
								
								
								
								
							
							
						
						
									
										34
									
								
								ChangeLog
								
								
								
								
							| 
						 | 
				
			
			@ -1,3 +1,37 @@
 | 
			
		|||
2010-03-25  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
			
		||||
 | 
			
		||||
	Added vbegin() and vend() for fixed sized array.
 | 
			
		||||
	* src/DownloadHandlerConstants.cc
 | 
			
		||||
	* src/FeatureConfig.cc
 | 
			
		||||
	* src/OptionHandlerFactory.cc
 | 
			
		||||
	* src/ServerStat.cc
 | 
			
		||||
	* src/TimeA2.cc
 | 
			
		||||
	* src/XmlRpcMethod.cc
 | 
			
		||||
	* src/array_fun.h
 | 
			
		||||
	* src/download_helper.cc
 | 
			
		||||
	* src/messageDigest.cc
 | 
			
		||||
	* src/util.cc
 | 
			
		||||
	* test/BittorrentHelperTest.cc
 | 
			
		||||
	* test/DHTRoutingTableDeserializerTest.cc
 | 
			
		||||
	* test/DHTRoutingTableSerializerTest.cc
 | 
			
		||||
	* test/DefaultBtAnnounceTest.cc
 | 
			
		||||
	* test/DefaultBtProgressInfoFileTest.cc
 | 
			
		||||
	* test/DownloadContextTest.cc
 | 
			
		||||
	* test/DownloadHelperTest.cc
 | 
			
		||||
	* test/FeatureConfigTest.cc
 | 
			
		||||
	* test/FeedbackURISelectorTest.cc
 | 
			
		||||
	* test/HttpRequestTest.cc
 | 
			
		||||
	* test/InOrderURISelectorTest.cc
 | 
			
		||||
	* test/MSEHandshakeTest.cc
 | 
			
		||||
	* test/MultiDiskAdaptorTest.cc
 | 
			
		||||
	* test/MultiFileAllocationIteratorTest.cc
 | 
			
		||||
	* test/PriorityPieceSelectorTest.cc
 | 
			
		||||
	* test/RequestGroupManTest.cc
 | 
			
		||||
	* test/UtilTest.cc
 | 
			
		||||
	* test/XmlRpcMethodTest.cc
 | 
			
		||||
	* test/a2algoTest.cc
 | 
			
		||||
	* test/array_funTest.cc
 | 
			
		||||
 | 
			
		||||
2010-03-24  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 | 
			
		||||
 | 
			
		||||
	Simplified code using lastByteMask
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,8 +57,7 @@ const std::vector<std::string>&
 | 
			
		|||
DownloadHandlerConstants::getMetalinkExtensions()
 | 
			
		||||
{
 | 
			
		||||
  static const std::vector<std::string> l
 | 
			
		||||
    (&METALINK_EXTENSIONS[0],
 | 
			
		||||
     &METALINK_EXTENSIONS[arrayLength(METALINK_EXTENSIONS)]);
 | 
			
		||||
    (vbegin(METALINK_EXTENSIONS), vend(METALINK_EXTENSIONS));
 | 
			
		||||
  return l;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -66,24 +65,21 @@ const std::vector<std::string>&
 | 
			
		|||
DownloadHandlerConstants::getMetalinkContentTypes()
 | 
			
		||||
{
 | 
			
		||||
  static const std::vector<std::string> l
 | 
			
		||||
    (&METALINK_CONTENT_TYPES[0],
 | 
			
		||||
     &METALINK_CONTENT_TYPES[arrayLength(METALINK_CONTENT_TYPES)]);
 | 
			
		||||
    (vbegin(METALINK_CONTENT_TYPES), vend(METALINK_CONTENT_TYPES));
 | 
			
		||||
  return l;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const std::vector<std::string>& DownloadHandlerConstants::getBtExtensions()
 | 
			
		||||
{
 | 
			
		||||
  static const std::vector<std::string> l
 | 
			
		||||
    (&BT_EXTENSIONS[0],
 | 
			
		||||
     &BT_EXTENSIONS[arrayLength(BT_EXTENSIONS)]);
 | 
			
		||||
    (vbegin(BT_EXTENSIONS), vend(BT_EXTENSIONS));
 | 
			
		||||
  return l;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const std::vector<std::string>& DownloadHandlerConstants::getBtContentTypes()
 | 
			
		||||
{
 | 
			
		||||
  static const std::vector<std::string> l
 | 
			
		||||
    (&BT_CONTENT_TYPES[0],
 | 
			
		||||
     &BT_CONTENT_TYPES[arrayLength(BT_CONTENT_TYPES)]);
 | 
			
		||||
    (vbegin(BT_CONTENT_TYPES), vend(BT_CONTENT_TYPES));
 | 
			
		||||
  return l;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -117,7 +117,7 @@ FeatureConfig::FeatureConfig() {
 | 
			
		|||
    FeatureMap::value_type(FEATURE_FIREFOX3_COOKIE, FIREFOX3_COOKIE_ENABLED),
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  _features.insert(&featureArray[0], &featureArray[arrayLength(featureArray)]);
 | 
			
		||||
  _features.insert(vbegin(featureArray), vend(featureArray));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SharedHandle<FeatureConfig> FeatureConfig::getInstance()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -210,7 +210,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
 | 
			
		|||
                                    V_SELECT,
 | 
			
		||||
#endif // !HAVE_EPOLL
 | 
			
		||||
                                    std::vector<std::string>
 | 
			
		||||
                                    (¶ms[0],¶ms[arrayLength(params)])));
 | 
			
		||||
                                    (vbegin(params), vend(params))));
 | 
			
		||||
    op->addTag(TAG_ADVANCED);
 | 
			
		||||
    handlers.push_back(op);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -286,8 +286,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
 | 
			
		|||
                                    TEXT_LOG_LEVEL,
 | 
			
		||||
                                    V_DEBUG,
 | 
			
		||||
                                    std::vector<std::string>
 | 
			
		||||
                                    (¶ms[0],
 | 
			
		||||
                                     ¶ms[arrayLength(params)])));
 | 
			
		||||
                                    (vbegin(params), vend(params))));
 | 
			
		||||
    op->addTag(TAG_ADVANCED);
 | 
			
		||||
    handlers.push_back(op);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +648,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
 | 
			
		|||
                                    TEXT_URI_SELECTOR,
 | 
			
		||||
                                    V_FEEDBACK,
 | 
			
		||||
                                    std::vector<std::string>
 | 
			
		||||
                                    (¶ms[0], ¶ms[arrayLength(params)])));
 | 
			
		||||
                                    (vbegin(params), vend(params))));
 | 
			
		||||
    op->addTag(TAG_FTP);
 | 
			
		||||
    op->addTag(TAG_HTTP);
 | 
			
		||||
    handlers.push_back(op);
 | 
			
		||||
| 
						 | 
				
			
			@ -1379,7 +1378,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
 | 
			
		|||
                                    TEXT_METALINK_PREFERRED_PROTOCOL,
 | 
			
		||||
                                    V_NONE,
 | 
			
		||||
                                    std::vector<std::string>
 | 
			
		||||
                                    (¶ms[0], ¶ms[arrayLength(params)])));
 | 
			
		||||
                                    (vbegin(params), vend(params))));
 | 
			
		||||
    op->addTag(TAG_METALINK);
 | 
			
		||||
    handlers.push_back(op);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -167,13 +167,11 @@ void ServerStat::setStatus(STATUS status)
 | 
			
		|||
 | 
			
		||||
void ServerStat::setStatus(const std::string& status)
 | 
			
		||||
{
 | 
			
		||||
  size_t len = arrayLength(STATUS_STRING);
 | 
			
		||||
  const std::string* p = std::find(&STATUS_STRING[0],
 | 
			
		||||
                                   &STATUS_STRING[len],
 | 
			
		||||
  const std::string* p = std::find(vbegin(STATUS_STRING), vend(STATUS_STRING),
 | 
			
		||||
                                   status);
 | 
			
		||||
  if(p != &STATUS_STRING[len]) {
 | 
			
		||||
  if(p != vend(STATUS_STRING)) {
 | 
			
		||||
    _status = static_cast<STATUS>(ServerStat::OK+
 | 
			
		||||
                                  std::distance(&STATUS_STRING[0], p));
 | 
			
		||||
                                  std::distance(vbegin(STATUS_STRING), p));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -212,7 +212,7 @@ Time Time::parseHTTPDate(const std::string& datetime)
 | 
			
		|||
    &parseRFC850Ext,
 | 
			
		||||
  };
 | 
			
		||||
  for(Time (**funcsp)(const std::string&) = &funcs[0];
 | 
			
		||||
      funcsp != &funcs[arrayLength(funcs)]; ++funcsp) {
 | 
			
		||||
      funcsp != vend(funcs); ++funcsp) {
 | 
			
		||||
    Time t = (*funcsp)(datetime);
 | 
			
		||||
    if(t.good()) {
 | 
			
		||||
      return t;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -147,8 +147,7 @@ const std::set<std::string>& listChangeableOptions()
 | 
			
		|||
    PREF_MAX_DOWNLOAD_LIMIT,
 | 
			
		||||
    PREF_MAX_UPLOAD_LIMIT
 | 
			
		||||
  };
 | 
			
		||||
  static std::set<std::string> options
 | 
			
		||||
    (&OPTIONS[0], &OPTIONS[arrayLength(OPTIONS)]);
 | 
			
		||||
  static std::set<std::string> options(vbegin(OPTIONS), vend(OPTIONS));
 | 
			
		||||
  return options;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -173,8 +172,7 @@ const std::set<std::string>& listChangeableGlobalOptions()
 | 
			
		|||
    PREF_MAX_OVERALL_DOWNLOAD_LIMIT,
 | 
			
		||||
    PREF_MAX_CONCURRENT_DOWNLOADS,
 | 
			
		||||
  };
 | 
			
		||||
  static std::set<std::string> options
 | 
			
		||||
    (&OPTIONS[0], &OPTIONS[arrayLength(OPTIONS)]);
 | 
			
		||||
  static std::set<std::string> options(vbegin(OPTIONS), vend(OPTIONS));
 | 
			
		||||
  return options;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,6 +57,18 @@ size_t arrayLength(T (&a)[0u])
 | 
			
		|||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T, size_t N>
 | 
			
		||||
T* vbegin(T (&a)[N])
 | 
			
		||||
{
 | 
			
		||||
  return a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T, size_t N>
 | 
			
		||||
T* vend(T (&a)[N])
 | 
			
		||||
{
 | 
			
		||||
  return a+arrayLength(a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
class array_ptr {
 | 
			
		||||
private:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -155,9 +155,7 @@ const std::set<std::string>& listRequestOptions()
 | 
			
		|||
    PREF_REALTIME_CHUNK_CHECKSUM
 | 
			
		||||
  };
 | 
			
		||||
  static std::set<std::string> requestOptions
 | 
			
		||||
    (&REQUEST_OPTIONS[0],
 | 
			
		||||
     &REQUEST_OPTIONS[arrayLength(REQUEST_OPTIONS)]);;
 | 
			
		||||
 | 
			
		||||
    (vbegin(REQUEST_OPTIONS), vend(REQUEST_OPTIONS));
 | 
			
		||||
  return requestOptions;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,8 +89,7 @@ static const DigestAlgoMap& getDigestAlgos()
 | 
			
		|||
    ("sha256", DigestAlgoEntry(GCRY_MD_SHA256, STRENGTH_SHA_256)),
 | 
			
		||||
#endif // HAVE_LIBGCRYPT
 | 
			
		||||
  };
 | 
			
		||||
  static const DigestAlgoMap algomap
 | 
			
		||||
    (&digests[0], &digests[arrayLength(digests)]);  
 | 
			
		||||
  static const DigestAlgoMap algomap(vbegin(digests), vend(digests));
 | 
			
		||||
  return algomap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										18
									
								
								src/util.cc
								
								
								
								
							
							
						
						
									
										18
									
								
								src/util.cc
								
								
								
								
							| 
						 | 
				
			
			@ -256,16 +256,14 @@ bool inRFC3986ReservedChars(const char c)
 | 
			
		|||
    ':' , '/' , '?' , '#' , '[' , ']' , '@',
 | 
			
		||||
    '!' , '$' , '&' , '\'' , '(' , ')',
 | 
			
		||||
    '*' , '+' , ',' , ';' , '=' };
 | 
			
		||||
  return std::find(&reserved[0], &reserved[arrayLength(reserved)], c) !=
 | 
			
		||||
    &reserved[arrayLength(reserved)];
 | 
			
		||||
  return std::find(vbegin(reserved), vend(reserved), c) != vend(reserved);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool inRFC3986UnreservedChars(const char c)
 | 
			
		||||
{
 | 
			
		||||
  static const char unreserved[] = { '-', '.', '_', '~' };
 | 
			
		||||
  return isAlpha(c) || isDigit(c) ||
 | 
			
		||||
    std::find(&unreserved[0], &unreserved[arrayLength(unreserved)], c) !=
 | 
			
		||||
    &unreserved[arrayLength(unreserved)];
 | 
			
		||||
    std::find(vbegin(unreserved), vend(unreserved), c) != vend(unreserved);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool inRFC2978MIMECharset(const char c)
 | 
			
		||||
| 
						 | 
				
			
			@ -276,8 +274,7 @@ bool inRFC2978MIMECharset(const char c)
 | 
			
		|||
    '`', '{', '}', '~'
 | 
			
		||||
  };
 | 
			
		||||
  return isAlpha(c) || isDigit(c) ||
 | 
			
		||||
    std::find(&chars[0], &chars[arrayLength(chars)], c) !=
 | 
			
		||||
    &chars[arrayLength(chars)];
 | 
			
		||||
    std::find(vbegin(chars), vend(chars), c) != vend(chars);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool inRFC2616HttpToken(const char c)
 | 
			
		||||
| 
						 | 
				
			
			@ -287,8 +284,7 @@ bool inRFC2616HttpToken(const char c)
 | 
			
		|||
    '^', '_', '`', '|', '~'
 | 
			
		||||
  };
 | 
			
		||||
  return isAlpha(c) || isDigit(c) ||
 | 
			
		||||
    std::find(&chars[0], &chars[arrayLength(chars)], c) !=
 | 
			
		||||
    &chars[arrayLength(chars)];
 | 
			
		||||
    std::find(vbegin(chars), vend(chars), c) != vend(chars);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string percentEncode(const unsigned char* target, size_t len) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1245,10 +1241,8 @@ public:
 | 
			
		|||
    // We don't escape '/' because we use it as a path separator.
 | 
			
		||||
    static const char WIN_INVALID_PATH_CHARS[] =
 | 
			
		||||
      { '"', '*', ':', '<', '>', '?', '\\', '|' };
 | 
			
		||||
    if(std::find(&WIN_INVALID_PATH_CHARS[0],
 | 
			
		||||
                 &WIN_INVALID_PATH_CHARS[arrayLength(WIN_INVALID_PATH_CHARS)],
 | 
			
		||||
                 c) !=
 | 
			
		||||
       &WIN_INVALID_PATH_CHARS[arrayLength(WIN_INVALID_PATH_CHARS)]) {
 | 
			
		||||
    if(std::find(vbegin(WIN_INVALID_PATH_CHARS), vend(WIN_INVALID_PATH_CHARS),
 | 
			
		||||
                 c) != vend(WIN_INVALID_PATH_CHARS)) {
 | 
			
		||||
      return _repChar;
 | 
			
		||||
    }
 | 
			
		||||
#endif // __MINGW32__
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -317,7 +317,7 @@ void BittorrentHelperTest::testComputeFastSet()
 | 
			
		|||
    std::vector<size_t> fastSet;
 | 
			
		||||
    computeFastSet(fastSet, ipaddr, numPieces, infoHash, fastSetSize);
 | 
			
		||||
    size_t ans[] = { 686, 459, 278, 200, 404, 834, 64, 203, 760, 950 };
 | 
			
		||||
    std::vector<size_t> ansSet(&ans[0], &ans[arrayLength(ans)]);
 | 
			
		||||
    std::vector<size_t> ansSet(vbegin(ans), vend(ans));
 | 
			
		||||
    CPPUNIT_ASSERT(std::equal(fastSet.begin(), fastSet.end(), ansSet.begin()));
 | 
			
		||||
  }
 | 
			
		||||
  ipaddr = "10.0.0.1";
 | 
			
		||||
| 
						 | 
				
			
			@ -325,7 +325,7 @@ void BittorrentHelperTest::testComputeFastSet()
 | 
			
		|||
    std::vector<size_t> fastSet;
 | 
			
		||||
    computeFastSet(fastSet, ipaddr, numPieces, infoHash, fastSetSize);
 | 
			
		||||
    size_t ans[] = { 568, 188, 466, 452, 550, 662, 109, 226, 398, 11 };
 | 
			
		||||
    std::vector<size_t> ansSet(&ans[0], &ans[arrayLength(ans)]);
 | 
			
		||||
    std::vector<size_t> ansSet(vbegin(ans), vend(ans));
 | 
			
		||||
    CPPUNIT_ASSERT(std::equal(fastSet.begin(), fastSet.end(), ansSet.begin()));
 | 
			
		||||
  }
 | 
			
		||||
  // See when pieces < fastSetSize
 | 
			
		||||
| 
						 | 
				
			
			@ -334,7 +334,7 @@ void BittorrentHelperTest::testComputeFastSet()
 | 
			
		|||
    std::vector<size_t> fastSet;
 | 
			
		||||
    computeFastSet(fastSet, ipaddr, numPieces, infoHash, fastSetSize);
 | 
			
		||||
    size_t ans[] = { 8, 6, 7, 5, 1, 4, 0, 2, 3 };
 | 
			
		||||
    std::vector<size_t> ansSet(&ans[0], &ans[arrayLength(ans)]);
 | 
			
		||||
    std::vector<size_t> ansSet(vbegin(ans), vend(ans));
 | 
			
		||||
    CPPUNIT_ASSERT(std::equal(fastSet.begin(), fastSet.end(), ansSet.begin()));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,8 +43,7 @@ void DHTRoutingTableDeserializerTest::testDeserialize()
 | 
			
		|||
    nodesSrc[i]->setPort(6881+i);
 | 
			
		||||
  }
 | 
			
		||||
  nodesSrc[1]->setIPAddress("non-numerical-name");
 | 
			
		||||
  std::vector<SharedHandle<DHTNode> > nodes
 | 
			
		||||
    (&nodesSrc[0], &nodesSrc[arrayLength(nodesSrc)]);
 | 
			
		||||
  std::vector<SharedHandle<DHTNode> > nodes(vbegin(nodesSrc), vend(nodesSrc));
 | 
			
		||||
  
 | 
			
		||||
  DHTRoutingTableSerializer s;
 | 
			
		||||
  s.setLocalNode(localNode);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,11 @@
 | 
			
		|||
#include "DHTRoutingTableSerializer.h"
 | 
			
		||||
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
 | 
			
		||||
#include "Exception.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "DHTNode.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -6,10 +13,6 @@
 | 
			
		|||
#include "DHTConstants.h"
 | 
			
		||||
#include "bittorrent_helper.h"
 | 
			
		||||
#include "a2netcompat.h"
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <cppunit/extensions/HelperMacros.h>
 | 
			
		||||
 | 
			
		||||
namespace aria2 {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -40,8 +43,7 @@ void DHTRoutingTableSerializerTest::testSerialize()
 | 
			
		|||
    nodesSrc[i]->setPort(6881+i);
 | 
			
		||||
  }
 | 
			
		||||
  nodesSrc[1]->setIPAddress("non-numerical-name");
 | 
			
		||||
  std::vector<SharedHandle<DHTNode> > nodes
 | 
			
		||||
    (&nodesSrc[0], &nodesSrc[arrayLength(nodesSrc)]);
 | 
			
		||||
  std::vector<SharedHandle<DHTNode> > nodes(vbegin(nodesSrc), vend(nodesSrc));
 | 
			
		||||
  
 | 
			
		||||
  DHTRoutingTableSerializer s;
 | 
			
		||||
  s.setLocalNode(localNode);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,7 +58,7 @@ public:
 | 
			
		|||
    _dctx.reset(new DownloadContext(pieceLength, totalLength));
 | 
			
		||||
    BDE torrentAttrs = BDE::dict();
 | 
			
		||||
    torrentAttrs[bittorrent::INFO_HASH] =
 | 
			
		||||
      std::string(&infoHash[0], &infoHash[arrayLength(infoHash)]);
 | 
			
		||||
      std::string(vbegin(infoHash), vend(infoHash));
 | 
			
		||||
    _dctx->setAttribute(bittorrent::BITTORRENT, torrentAttrs);
 | 
			
		||||
    bittorrent::setStaticPeerId(peerId);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -282,7 +282,7 @@ void DefaultBtAnnounceTest::testURLOrderInStoppedEvent()
 | 
			
		|||
                         "http://localhost2/announce" };
 | 
			
		||||
 | 
			
		||||
  BDE announceList = BDE::list();
 | 
			
		||||
  announceList << createAnnounceTier(&urls[0], &urls[arrayLength(urls)]);
 | 
			
		||||
  announceList << createAnnounceTier(vbegin(urls), vend(urls));
 | 
			
		||||
  setAnnounceList(_dctx, announceList);
 | 
			
		||||
 | 
			
		||||
  DefaultBtAnnounce btAnnounce(_dctx, _option);
 | 
			
		||||
| 
						 | 
				
			
			@ -312,7 +312,7 @@ void DefaultBtAnnounceTest::testURLOrderInCompletedEvent()
 | 
			
		|||
                         "http://localhost2/announce" };
 | 
			
		||||
 | 
			
		||||
  BDE announceList = BDE::list();
 | 
			
		||||
  announceList << createAnnounceTier(&urls[0], &urls[arrayLength(urls)]);
 | 
			
		||||
  announceList << createAnnounceTier(vbegin(urls), vend(urls));
 | 
			
		||||
  setAnnounceList(_dctx, announceList);
 | 
			
		||||
 | 
			
		||||
  DefaultBtAnnounce btAnnounce(_dctx, _option);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,14 +72,13 @@ public:
 | 
			
		|||
    _dctx.reset(new DownloadContext());
 | 
			
		||||
    BDE torrentAttrs = BDE::dict();
 | 
			
		||||
    torrentAttrs[bittorrent::INFO_HASH] =
 | 
			
		||||
      std::string(&infoHash[0], &infoHash[arrayLength(infoHash)]);
 | 
			
		||||
      std::string(vbegin(infoHash), vend(infoHash));
 | 
			
		||||
    _dctx->setAttribute(bittorrent::BITTORRENT, torrentAttrs);
 | 
			
		||||
    _dctx->setDir(_option->get(PREF_DIR));
 | 
			
		||||
    const SharedHandle<FileEntry> fileEntries[] = {
 | 
			
		||||
      SharedHandle<FileEntry>(new FileEntry("/path/to/file",totalLength,0))
 | 
			
		||||
    };
 | 
			
		||||
    _dctx->setFileEntries(&fileEntries[0],
 | 
			
		||||
                          &fileEntries[arrayLength(fileEntries)]);
 | 
			
		||||
    _dctx->setFileEntries(vbegin(fileEntries), vend(fileEntries));
 | 
			
		||||
    _dctx->setPieceLength(pieceLength);
 | 
			
		||||
    _peerStorage.reset(new MockPeerStorage());
 | 
			
		||||
    _btRuntime.reset(new BtRuntime());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,8 +39,7 @@ void DownloadContextTest::testFindFileEntryByOffset()
 | 
			
		|||
      SharedHandle<FileEntry>(new FileEntry("file5",3000,3000)),
 | 
			
		||||
      SharedHandle<FileEntry>(new FileEntry("file6",0,6000))
 | 
			
		||||
    };
 | 
			
		||||
  ctx.setFileEntries(&fileEntries[0],
 | 
			
		||||
                     &fileEntries[arrayLength(fileEntries)]);
 | 
			
		||||
  ctx.setFileEntries(vbegin(fileEntries), vend(fileEntries));
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("file1"),
 | 
			
		||||
                       ctx.findFileEntryByOffset(0)->getPath());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -69,7 +69,7 @@ void DownloadHelperTest::testCreateRequestGroupForUri()
 | 
			
		|||
    "http://bravo/file",
 | 
			
		||||
    "http://charlie/file"
 | 
			
		||||
  };
 | 
			
		||||
  std::vector<std::string> uris(&array[0], &array[arrayLength(array)]);
 | 
			
		||||
  std::vector<std::string> uris(vbegin(array), vend(array));
 | 
			
		||||
  _option->put(PREF_SPLIT, "3");
 | 
			
		||||
  _option->put(PREF_DIR, "/tmp");
 | 
			
		||||
  _option->put(PREF_OUT, "file.out");
 | 
			
		||||
| 
						 | 
				
			
			@ -157,7 +157,7 @@ void DownloadHelperTest::testCreateRequestGroupForUri_parameterized()
 | 
			
		|||
    "http://{alpha, bravo}/file",
 | 
			
		||||
    "http://charlie/file"
 | 
			
		||||
  };
 | 
			
		||||
  std::vector<std::string> uris(&array[0], &array[arrayLength(array)]);
 | 
			
		||||
  std::vector<std::string> uris(vbegin(array), vend(array));
 | 
			
		||||
  _option->put(PREF_SPLIT, "3");
 | 
			
		||||
  _option->put(PREF_DIR, "/tmp");
 | 
			
		||||
  _option->put(PREF_OUT, "file.out");
 | 
			
		||||
| 
						 | 
				
			
			@ -193,7 +193,7 @@ void DownloadHelperTest::testCreateRequestGroupForUri_BitTorrent()
 | 
			
		|||
    "http://bravo/file",
 | 
			
		||||
    "http://charlie/file"
 | 
			
		||||
  };
 | 
			
		||||
  std::vector<std::string> uris(&array[0], &array[arrayLength(array)]);
 | 
			
		||||
  std::vector<std::string> uris(vbegin(array), vend(array));
 | 
			
		||||
  _option->put(PREF_SPLIT, "3");
 | 
			
		||||
  _option->put(PREF_DIR, "/tmp");
 | 
			
		||||
  _option->put(PREF_OUT, "file.out");
 | 
			
		||||
| 
						 | 
				
			
			@ -241,7 +241,7 @@ void DownloadHelperTest::testCreateRequestGroupForUri_Metalink()
 | 
			
		|||
    "http://charlie/file",
 | 
			
		||||
    "test.xml"
 | 
			
		||||
  };
 | 
			
		||||
  std::vector<std::string> uris(&array[0], &array[arrayLength(array)]);
 | 
			
		||||
  std::vector<std::string> uris(vbegin(array), vend(array));
 | 
			
		||||
  _option->put(PREF_SPLIT, "3");
 | 
			
		||||
  _option->put(PREF_METALINK_SERVERS, "2");
 | 
			
		||||
  _option->put(PREF_DIR, "/tmp");
 | 
			
		||||
| 
						 | 
				
			
			@ -329,7 +329,7 @@ void DownloadHelperTest::testCreateRequestGroupForBitTorrent()
 | 
			
		|||
    "http://charlie/file"
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  std::vector<std::string> auxURIs(&array[0], &array[arrayLength(array)]);
 | 
			
		||||
  std::vector<std::string> auxURIs(vbegin(array), vend(array));
 | 
			
		||||
  _option->put(PREF_SPLIT, "5");
 | 
			
		||||
  _option->put(PREF_TORRENT_FILE, "test.torrent");
 | 
			
		||||
  _option->put(PREF_DIR, "/tmp");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,7 +89,7 @@ void FeatureConfigTest::testFeatureSummary() {
 | 
			
		|||
 | 
			
		||||
  std::string featuresString;
 | 
			
		||||
  const std::string delim(", ");
 | 
			
		||||
  std::for_each(&features[0], &features[arrayLength(features)],
 | 
			
		||||
  std::for_each(vbegin(features), vend(features),
 | 
			
		||||
                StringAppend(featuresString, delim));
 | 
			
		||||
  // USE util::trimSelf(featureString);
 | 
			
		||||
  featuresString = util::trim(featuresString, delim);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,7 +34,7 @@ public:
 | 
			
		|||
      "http://bravo/file"
 | 
			
		||||
    };
 | 
			
		||||
    std::vector<std::string> uris;
 | 
			
		||||
    uris.assign(&urisSrc[0], &urisSrc[arrayLength(urisSrc)]);
 | 
			
		||||
    uris.assign(vbegin(urisSrc), vend(urisSrc));
 | 
			
		||||
    
 | 
			
		||||
    _fileEntry.setUris(uris);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -690,8 +690,7 @@ void HttpRequestTest::testAddAcceptType()
 | 
			
		|||
  httpRequest.disableContentEncoding();
 | 
			
		||||
  httpRequest.setRequest(request);
 | 
			
		||||
  httpRequest.setAuthConfigFactory(_authConfigFactory, _option.get());
 | 
			
		||||
  httpRequest.addAcceptType(&acceptTypes[0],
 | 
			
		||||
                            &acceptTypes[arrayLength(acceptTypes)]);
 | 
			
		||||
  httpRequest.addAcceptType(vbegin(acceptTypes), vend(acceptTypes));
 | 
			
		||||
 | 
			
		||||
  std::string expectedText =
 | 
			
		||||
    "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,7 @@ public:
 | 
			
		|||
      "http://bravo/file"
 | 
			
		||||
    };
 | 
			
		||||
    std::vector<std::string> uris;
 | 
			
		||||
    uris.assign(&urisSrc[0], &urisSrc[arrayLength(urisSrc)]);
 | 
			
		||||
    uris.assign(vbegin(urisSrc), vend(urisSrc));
 | 
			
		||||
    
 | 
			
		||||
    _fileEntry.setUris(uris);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,7 @@ public:
 | 
			
		|||
    memset(infoHash, 0, sizeof(infoHash));
 | 
			
		||||
    BDE torrentAttrs = BDE::dict();
 | 
			
		||||
    torrentAttrs[bittorrent::INFO_HASH] =
 | 
			
		||||
      std::string(&infoHash[0], &infoHash[arrayLength(infoHash)]);
 | 
			
		||||
      std::string(vbegin(infoHash), vend(infoHash));
 | 
			
		||||
    _dctx->setAttribute(bittorrent::BITTORRENT, torrentAttrs);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,8 +68,7 @@ std::vector<SharedHandle<FileEntry> > createEntries() {
 | 
			
		|||
  //                         *** file6
 | 
			
		||||
  //                            |file7
 | 
			
		||||
  //                            ** file8
 | 
			
		||||
  std::vector<SharedHandle<FileEntry> > entries(&array[0],
 | 
			
		||||
                                                &array[arrayLength(array)]);
 | 
			
		||||
  std::vector<SharedHandle<FileEntry> > entries(vbegin(array), vend(array));
 | 
			
		||||
  for(std::vector<SharedHandle<FileEntry> >::const_iterator i = entries.begin();
 | 
			
		||||
      i != entries.end(); ++i) {
 | 
			
		||||
    File((*i)->getPath()).remove();
 | 
			
		||||
| 
						 | 
				
			
			@ -376,7 +375,7 @@ void MultiDiskAdaptorTest::testCutTrailingGarbage()
 | 
			
		|||
    createFile(entries[i]->getPath(), entries[i]->getLength()+100);
 | 
			
		||||
  }
 | 
			
		||||
  std::vector<SharedHandle<FileEntry> > fileEntries
 | 
			
		||||
    (&entries[0], &entries[arrayLength(entries)]);
 | 
			
		||||
    (vbegin(entries), vend(entries));
 | 
			
		||||
  
 | 
			
		||||
  MultiDiskAdaptor adaptor;
 | 
			
		||||
  adaptor.setFileEntries(fileEntries.begin(), fileEntries.end());
 | 
			
		||||
| 
						 | 
				
			
			@ -405,7 +404,7 @@ void MultiDiskAdaptorTest::testSize()
 | 
			
		|||
    createFile(entries[i]->getPath(), entries[i]->getLength());
 | 
			
		||||
  }
 | 
			
		||||
  std::vector<SharedHandle<FileEntry> > fileEntries
 | 
			
		||||
    (&entries[0], &entries[arrayLength(entries)]);
 | 
			
		||||
    (vbegin(entries), vend(entries));
 | 
			
		||||
  
 | 
			
		||||
  MultiDiskAdaptor adaptor;
 | 
			
		||||
  adaptor.setFileEntries(fileEntries.begin(), fileEntries.end());
 | 
			
		||||
| 
						 | 
				
			
			@ -435,7 +434,7 @@ void MultiDiskAdaptorTest::testUtime()
 | 
			
		|||
  entries[2]->setRequested(false);
 | 
			
		||||
 | 
			
		||||
  std::vector<SharedHandle<FileEntry> > fileEntries
 | 
			
		||||
    (&entries[0], &entries[arrayLength(entries)]);
 | 
			
		||||
    (vbegin(entries), vend(entries));
 | 
			
		||||
  MultiDiskAdaptor adaptor;
 | 
			
		||||
  adaptor.setFileEntries(fileEntries.begin(), fileEntries.end());
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,7 +64,7 @@ void MultiFileAllocationIteratorTest::testMakeDiskWriterEntries()
 | 
			
		|||
  createFile(storeDir+std::string("/file4"), 0);
 | 
			
		||||
  
 | 
			
		||||
  SharedHandle<MultiDiskAdaptor> diskAdaptor(new MultiDiskAdaptor());
 | 
			
		||||
  diskAdaptor->setFileEntries(&fs[0], &fs[arrayLength(fs)]);
 | 
			
		||||
  diskAdaptor->setFileEntries(vbegin(fs), vend(fs));
 | 
			
		||||
  diskAdaptor->setPieceLength(1024);
 | 
			
		||||
  diskAdaptor->openFile();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,7 @@ void PriorityPieceSelectorTest::testSelect()
 | 
			
		|||
  }
 | 
			
		||||
  PriorityPieceSelector selector
 | 
			
		||||
    (SharedHandle<PieceSelector>(new MockPieceSelector()));
 | 
			
		||||
  selector.setPriorityPiece(&A[0], &A[arrayLength(A)]);
 | 
			
		||||
  selector.setPriorityPiece(vbegin(A), vend(A));
 | 
			
		||||
 | 
			
		||||
  size_t index;
 | 
			
		||||
  CPPUNIT_ASSERT(selector.select(index, bf.getBitfield(), bf.countBlock()));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -121,7 +121,7 @@ void RequestGroupManTest::testChangeReservedGroupPosition()
 | 
			
		|||
    SharedHandle<RequestGroup>(new RequestGroup(_option)),
 | 
			
		||||
    SharedHandle<RequestGroup>(new RequestGroup(_option))
 | 
			
		||||
  };
 | 
			
		||||
  std::vector<SharedHandle<RequestGroup> > groups(&gs[0], &gs[arrayLength(gs)]);
 | 
			
		||||
  std::vector<SharedHandle<RequestGroup> > groups(vbegin(gs), vend(gs));
 | 
			
		||||
  RequestGroupMan rm(groups, 0, _option.get());
 | 
			
		||||
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -846,33 +846,28 @@ void UtilTest::testJoinPath()
 | 
			
		|||
  const std::string dir1dir2file[] = { "dir1", "dir2", "file" };
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL
 | 
			
		||||
    (std::string("dir1/dir2/file"),
 | 
			
		||||
     util::joinPath(&dir1dir2file[0],
 | 
			
		||||
                    &dir1dir2file[arrayLength(dir1dir2file)]));
 | 
			
		||||
     util::joinPath(vbegin(dir1dir2file), vend(dir1dir2file)));
 | 
			
		||||
 | 
			
		||||
  const std::string dirparentfile[] = { "dir", "..", "file" };
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL
 | 
			
		||||
    (std::string("file"),
 | 
			
		||||
     util::joinPath(&dirparentfile[0],
 | 
			
		||||
                    &dirparentfile[arrayLength(dirparentfile)]));
 | 
			
		||||
     util::joinPath(vbegin(dirparentfile), vend(dirparentfile)));
 | 
			
		||||
 | 
			
		||||
  const std::string dirparentparentfile[] = { "dir", "..", "..", "file" };
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL
 | 
			
		||||
    (std::string("file"),
 | 
			
		||||
     util::joinPath(&dirparentparentfile[0],
 | 
			
		||||
                    &dirparentparentfile[arrayLength(dirparentparentfile)]));
 | 
			
		||||
     util::joinPath(vbegin(dirparentparentfile), vend(dirparentparentfile)));
 | 
			
		||||
 | 
			
		||||
  const std::string dirdotfile[] = { "dir", ".", "file" };
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string("dir/file"),
 | 
			
		||||
                       util::joinPath(&dirdotfile[0],
 | 
			
		||||
                                      &dirdotfile[arrayLength(dirdotfile)]));
 | 
			
		||||
                       util::joinPath(vbegin(dirdotfile), vend(dirdotfile)));
 | 
			
		||||
 | 
			
		||||
  const std::string empty[] = {};
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string(""), util::joinPath(&empty[0], &empty[0]));
 | 
			
		||||
 | 
			
		||||
  const std::string parentdot[] = { "..", "." };
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(std::string(""),
 | 
			
		||||
                       util::joinPath(&parentdot[0],
 | 
			
		||||
                                      &parentdot[arrayLength(parentdot)]));
 | 
			
		||||
                       util::joinPath(vbegin(parentdot), vend(parentdot)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void UtilTest::testParseIndexPath()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -692,7 +692,7 @@ void XmlRpcMethodTest::testGatherProgressCommon()
 | 
			
		|||
{
 | 
			
		||||
  SharedHandle<DownloadContext> dctx(new DownloadContext(0, 0,"aria2.tar.bz2"));
 | 
			
		||||
  std::string uris[] = { "http://localhost/aria2.tar.bz2" };
 | 
			
		||||
  dctx->getFirstFileEntry()->addUris(&uris[0], &uris[arrayLength(uris)]);
 | 
			
		||||
  dctx->getFirstFileEntry()->addUris(vbegin(uris), vend(uris));
 | 
			
		||||
 | 
			
		||||
  SharedHandle<RequestGroup> group(new RequestGroup(_option));
 | 
			
		||||
  group->setDownloadContext(dctx);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ void a2algoTest::testSelect()
 | 
			
		|||
{
 | 
			
		||||
  size_t A[] = { 1,2,3,4,7,10,11,12,13,14,15,100,112,113,114 };
 | 
			
		||||
 | 
			
		||||
  std::pair<size_t*, size_t> p = max_sequence(&A[0], &A[arrayLength(A)]);
 | 
			
		||||
  std::pair<size_t*, size_t> p = max_sequence(vbegin(A), vend(A));
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(&A[5], p.first);
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL((size_t)6, p.second);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@ class array_funTest:public CppUnit::TestFixture {
 | 
			
		|||
  CPPUNIT_TEST(testArrayLength);
 | 
			
		||||
  CPPUNIT_TEST(testArrayPtr);
 | 
			
		||||
  CPPUNIT_TEST(testArrayWrapper);
 | 
			
		||||
  CPPUNIT_TEST(testVbeginVend);
 | 
			
		||||
  CPPUNIT_TEST_SUITE_END();
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
| 
						 | 
				
			
			@ -23,6 +24,7 @@ public:
 | 
			
		|||
  void testArrayLength();
 | 
			
		||||
  void testArrayPtr();
 | 
			
		||||
  void testArrayWrapper();
 | 
			
		||||
  void testVbeginVend();
 | 
			
		||||
 | 
			
		||||
  struct X{
 | 
			
		||||
    int m;
 | 
			
		||||
| 
						 | 
				
			
			@ -116,4 +118,11 @@ void array_funTest::testArrayWrapper()
 | 
			
		|||
  arrayPtrConstCast(x1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void array_funTest::testVbeginVend()
 | 
			
		||||
{
 | 
			
		||||
  int a[] = {1,2,3};
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(&a[0], vbegin(a));
 | 
			
		||||
  CPPUNIT_ASSERT_EQUAL(a+3, vend(a));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace aria2
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue