mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-06-10 23:52:51 -04:00
- Restored compilation of most tests (The part using previously named p3ConnectMgr is still to be done).
- moved ftSearchDummy and ftDataSendPair in tests/ft since it is only used there. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@6009 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
6571279b70
commit
bc65dd40c2
48 changed files with 314 additions and 1797 deletions
|
@ -724,6 +724,14 @@ int FileIndex::cleanOldEntries(time_t old) /* removes entries older than old */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int FileIndex::printFileIndex(std::ostream &out)
|
||||||
|
{
|
||||||
|
std::string sout ;
|
||||||
|
printFileIndex(sout) ;
|
||||||
|
out << sout << std::endl;
|
||||||
|
|
||||||
|
return 1 ;
|
||||||
|
}
|
||||||
int FileIndex::printFileIndex(std::string &out)
|
int FileIndex::printFileIndex(std::string &out)
|
||||||
{
|
{
|
||||||
out += "FileIndex::printFileIndex()\n";
|
out += "FileIndex::printFileIndex()\n";
|
||||||
|
|
|
@ -227,6 +227,7 @@ class FileIndex
|
||||||
|
|
||||||
/* debug */
|
/* debug */
|
||||||
int printFileIndex(std::string &out);
|
int printFileIndex(std::string &out);
|
||||||
|
int printFileIndex(std::ostream &out);
|
||||||
|
|
||||||
/* load/save to file */
|
/* load/save to file */
|
||||||
int loadIndex(const std::string& filename, const std::string& expectedHash, uint64_t size);
|
int loadIndex(const std::string& filename, const std::string& expectedHash, uint64_t size);
|
||||||
|
|
|
@ -101,92 +101,4 @@ class ftDataRecv
|
||||||
virtual bool recvCRC32Map(const std::string& peer_id,const std::string& hash,const CRC32Map& crcmap) = 0;
|
virtual bool recvCRC32Map(const std::string& peer_id,const std::string& hash,const CRC32Map& crcmap) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**************** FOR TESTING ***********************/
|
|
||||||
|
|
||||||
/******* Pair of Send/Recv (Only need to handle Send side) ******/
|
|
||||||
class ftDataSendPair: public ftDataSend
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
ftDataSendPair(ftDataRecv *recv);
|
|
||||||
virtual ~ftDataSendPair() { return; }
|
|
||||||
|
|
||||||
/* Client Send */
|
|
||||||
virtual bool sendDataRequest(const std::string &peerId, const std::string &hash,
|
|
||||||
uint64_t size, uint64_t offset, uint32_t chunksize);
|
|
||||||
|
|
||||||
/* Server Send */
|
|
||||||
virtual bool sendData(const std::string &peerId, const std::string &hash, uint64_t size,
|
|
||||||
uint64_t offset, uint32_t chunksize, void *data);
|
|
||||||
|
|
||||||
/* Send a request for a chunk map */
|
|
||||||
virtual bool sendChunkMapRequest(const std::string& peer_id,const std::string& hash,bool is_client);
|
|
||||||
|
|
||||||
/* Send a chunk map */
|
|
||||||
virtual bool sendChunkMap(const std::string& peer_id,const std::string& hash, const CompressedChunkMap& cmap,bool is_client);
|
|
||||||
|
|
||||||
/* Send a request for a chunk map */
|
|
||||||
virtual bool sendCRC32MapRequest(const std::string& peer_id,const std::string& hash);
|
|
||||||
|
|
||||||
/* Send a chunk map */
|
|
||||||
virtual bool sendCRC32Map(const std::string& peer_id,const std::string& hash, const CRC32Map& cmap);
|
|
||||||
ftDataRecv *mDataRecv;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class ftDataSendDummy: public ftDataSend
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~ftDataSendDummy() { return; }
|
|
||||||
|
|
||||||
/* Client Send */
|
|
||||||
virtual bool sendDataRequest(const std::string &peerId, const std::string &hash,
|
|
||||||
uint64_t size, uint64_t offset, uint32_t chunksize);
|
|
||||||
|
|
||||||
/* Server Send */
|
|
||||||
virtual bool sendData(const std::string &peerId, const std::string &hash, uint64_t size,
|
|
||||||
uint64_t offset, uint32_t chunksize, void *data);
|
|
||||||
|
|
||||||
/* Send a request for a chunk map */
|
|
||||||
virtual bool sendChunkMapRequest(const std::string& peer_id,const std::string& hash,bool is_client);
|
|
||||||
|
|
||||||
/* Send a chunk map */
|
|
||||||
virtual bool sendChunkMap(const std::string& peer_id,const std::string& hash, const CompressedChunkMap& cmap,bool is_client);
|
|
||||||
|
|
||||||
/* Send a request for a chunk map */
|
|
||||||
virtual bool sendCRC32MapRequest(const std::string& peer_id,const std::string& hash);
|
|
||||||
|
|
||||||
/* Send a chunk map */
|
|
||||||
virtual bool sendCRC32Map(const std::string& peer_id,const std::string& hash, const CRC32Map& cmap);
|
|
||||||
};
|
|
||||||
|
|
||||||
class ftDataRecvDummy: public ftDataRecv
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
virtual ~ftDataRecvDummy() { return; }
|
|
||||||
|
|
||||||
/* Client Recv */
|
|
||||||
virtual bool recvData(const std::string& peerId, const std::string& hash,
|
|
||||||
uint64_t size, uint64_t offset, uint32_t chunksize, void *data);
|
|
||||||
|
|
||||||
/* Server Recv */
|
|
||||||
virtual bool recvDataRequest(const std::string& peerId, const std::string& hash,
|
|
||||||
uint64_t size, uint64_t offset, uint32_t chunksize);
|
|
||||||
|
|
||||||
/* Send a request for a chunk map */
|
|
||||||
virtual bool recvChunkMapRequest(const std::string& peer_id,const std::string& hash,
|
|
||||||
bool is_client);
|
|
||||||
|
|
||||||
/* Send a chunk map */
|
|
||||||
virtual bool recvChunkMap(const std::string& peer_id,const std::string& hash,
|
|
||||||
const CompressedChunkMap& cmap,bool is_client);
|
|
||||||
|
|
||||||
/* Send a request for a chunk map */
|
|
||||||
virtual bool sendCRC32MapRequest(const std::string& peer_id,const std::string& hash);
|
|
||||||
|
|
||||||
/* Send a chunk map */
|
|
||||||
virtual bool sendCRC32Map(const std::string& peer_id,const std::string& hash, const CompressedChunkMap& cmap);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -179,18 +179,3 @@ bool ftFileSearch::search(const std::string &hash, FileSearchFlags hintflags, Fi
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool ftSearchDummy::search(std::string /*hash*/, FileSearchFlags hintflags, FileInfo &/*info*/) const
|
|
||||||
{
|
|
||||||
/* remove unused parameter warnings */
|
|
||||||
(void) hintflags;
|
|
||||||
|
|
||||||
#ifdef DEBUG_SEARCH
|
|
||||||
std::cerr << "ftSearchDummy::search(" << hash ;
|
|
||||||
std::cerr << ", " << hintflags << ");";
|
|
||||||
std::cerr << std::endl;
|
|
||||||
#endif
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -51,14 +51,4 @@ class ftSearch
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class ftSearchDummy: public ftSearch
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
ftSearchDummy() { return; }
|
|
||||||
virtual ~ftSearchDummy() { return; }
|
|
||||||
virtual bool search(std::string hash, FileSearchFlags hintflags, FileInfo &info) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -455,7 +455,6 @@ SOURCES += dbase/cachestrapper.cc \
|
||||||
|
|
||||||
SOURCES += ft/ftchunkmap.cc \
|
SOURCES += ft/ftchunkmap.cc \
|
||||||
ft/ftcontroller.cc \
|
ft/ftcontroller.cc \
|
||||||
ft/ftdata.cc \
|
|
||||||
ft/ftdatamultiplex.cc \
|
ft/ftdatamultiplex.cc \
|
||||||
ft/ftdbase.cc \
|
ft/ftdbase.cc \
|
||||||
ft/ftextralist.cc \
|
ft/ftextralist.cc \
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
RS_TOP_DIR = ../..
|
RS_TOP_DIR = ../..
|
||||||
DHT_TOP_DIR = ../../../../libbitdht/src
|
DHT_TOP_DIR = ../../../../libbitdht/src
|
||||||
|
OPS_TOP_DIR = ../../../../openpgpsdk/src
|
||||||
##### Define any flags that are needed for this section #######
|
##### Define any flags that are needed for this section #######
|
||||||
###############################################################
|
###############################################################
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,7 @@ int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
SharedDirInfo dir;
|
SharedDirInfo dir;
|
||||||
dir.filename = argv[optind];
|
dir.filename = argv[optind];
|
||||||
dir.shareflags = RS_FILE_HINTS_NETWORK_WIDE | RS_FILE_HINTS_BROWSABLE;
|
dir.shareflags = DIR_FLAGS_PERMISSIONS_MASK ;
|
||||||
rootdirs.push_back(dir);
|
rootdirs.push_back(dir);
|
||||||
std::cerr << "Adding shared directory: " << argv[optind] << std::endl;
|
std::cerr << "Adding shared directory: " << argv[optind] << std::endl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,9 @@ int main()
|
||||||
FileIndex *fi1 = createBasicFileIndex(100);
|
FileIndex *fi1 = createBasicFileIndex(100);
|
||||||
FileIndex *fi2 = new FileIndex("A SILLY ID");
|
FileIndex *fi2 = new FileIndex("A SILLY ID");
|
||||||
|
|
||||||
fi1->printFileIndex(std::cout);
|
std::string out ;
|
||||||
|
fi1->printFileIndex(out);
|
||||||
|
std::cout << out <<std::endl;
|
||||||
std::string fhash;
|
std::string fhash;
|
||||||
uint64_t size;
|
uint64_t size;
|
||||||
std::set<std::string> forbiddenroots;
|
std::set<std::string> forbiddenroots;
|
||||||
|
@ -41,7 +43,9 @@ int main()
|
||||||
std::cout << " -- new file index -- " << std::endl;
|
std::cout << " -- new file index -- " << std::endl;
|
||||||
|
|
||||||
fi2->loadIndex("test.index", fhash, size);
|
fi2->loadIndex("test.index", fhash, size);
|
||||||
fi2->printFileIndex(std::cout);
|
out.clear() ;
|
||||||
|
fi2->printFileIndex(out);
|
||||||
|
std::cout << out << std::endl;
|
||||||
|
|
||||||
delete fi1;
|
delete fi1;
|
||||||
delete fi2;
|
delete fi2;
|
||||||
|
|
|
@ -75,10 +75,15 @@ int test1(FileIndex *fi)
|
||||||
|
|
||||||
/* clean up the dir (should have no effect) */
|
/* clean up the dir (should have no effect) */
|
||||||
fi -> removeOldDirectory(olddir->parent->path, olddir->name, stamp);
|
fi -> removeOldDirectory(olddir->parent->path, olddir->name, stamp);
|
||||||
fi -> printFileIndex(std::cout);
|
|
||||||
|
std::string out ;
|
||||||
|
fi -> printFileIndex(out);
|
||||||
|
std::cout << out << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
fi -> printFileIndex(std::cout);
|
std::string out ;
|
||||||
|
fi -> printFileIndex(out);
|
||||||
|
std::cout << out << std::endl;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -133,10 +138,14 @@ int test2(FileIndex *fi)
|
||||||
/* clean up the dir */
|
/* clean up the dir */
|
||||||
fi -> removeOldDirectory(olddir->parent->path, olddir->name, stamp);
|
fi -> removeOldDirectory(olddir->parent->path, olddir->name, stamp);
|
||||||
|
|
||||||
fi -> printFileIndex(std::cout);
|
std::string out ;
|
||||||
|
fi -> printFileIndex(out);
|
||||||
|
std::cout << out << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
fi -> printFileIndex(std::cout);
|
std::string out ;
|
||||||
|
fi -> printFileIndex(out);
|
||||||
|
std::cout << out << std::endl;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -152,7 +161,9 @@ FileIndex *createBasicFileIndex(time_t age)
|
||||||
FileEntry fe;
|
FileEntry fe;
|
||||||
|
|
||||||
/* print empty FileIndex */
|
/* print empty FileIndex */
|
||||||
fi -> printFileIndex(std::cout);
|
std::string out ;
|
||||||
|
fi -> printFileIndex(out);
|
||||||
|
std::cout << out << std::endl;
|
||||||
|
|
||||||
std::list<std::string> rootdirs;
|
std::list<std::string> rootdirs;
|
||||||
rootdirs.push_back("base1");
|
rootdirs.push_back("base1");
|
||||||
|
@ -206,7 +217,9 @@ FileIndex *createBasicFileIndex(time_t age)
|
||||||
fe.name = "file20";
|
fe.name = "file20";
|
||||||
fi -> updateFileEntry("/base3/",fe, age);
|
fi -> updateFileEntry("/base3/",fe, age);
|
||||||
|
|
||||||
fi -> printFileIndex(std::cout);
|
out.clear() ;
|
||||||
|
fi -> printFileIndex(out);
|
||||||
|
std::cout << out << std::endl;
|
||||||
|
|
||||||
return fi;
|
return fi;
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,9 @@ int main()
|
||||||
|
|
||||||
while(!hashresult.empty())
|
while(!hashresult.empty())
|
||||||
{
|
{
|
||||||
hashresult.back()->print(std::cout);
|
std::string out ;
|
||||||
|
hashresult.back()->print(out);
|
||||||
|
std::cout << out << std::endl;
|
||||||
hashresult.pop_back();
|
hashresult.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +67,9 @@ int main()
|
||||||
|
|
||||||
while(!termresult.empty())
|
while(!termresult.empty())
|
||||||
{
|
{
|
||||||
termresult.back()->print(std::cout);
|
std::string out ;
|
||||||
|
termresult.back()->print(out);
|
||||||
|
std::cout << out << std::endl;
|
||||||
termresult.pop_back();
|
termresult.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
|
|
||||||
RS_TOP_DIR = ../..
|
RS_TOP_DIR = ../..
|
||||||
DHT_TOP_DIR = ../../../../libbitdht/src
|
DHT_TOP_DIR = ../../../../libbitdht/src
|
||||||
|
OPS_TOP_DIR = ../../../../openpgpsdk/src
|
||||||
|
|
||||||
##### Define any flags that are needed for this section #######
|
##### Define any flags that are needed for this section #######
|
||||||
###############################################################
|
###############################################################
|
||||||
|
|
||||||
|
@ -8,9 +10,10 @@ DHT_TOP_DIR = ../../../../libbitdht/src
|
||||||
include $(RS_TOP_DIR)/tests/scripts/config.mk
|
include $(RS_TOP_DIR)/tests/scripts/config.mk
|
||||||
###############################################################
|
###############################################################
|
||||||
|
|
||||||
TESTOBJ = ftfilemappertest.o ftfileprovidertest.o ftfilecreatortest.o ftextralisttest.o ftdataplextest.o fttransfermoduletest.o ftcrc32test.o ftcrossprovidercreatortest.o ftcontrollertest.o ftserver1test.o ftserver2test.o ftserver3test.o
|
TESTOBJ = ftfilemappertest.o ftfileprovidertest.o ftfilecreatortest.o ftextralisttest.o ftdataplextest.o fttransfermoduletest.o ftcrc32test.o ftcrossprovidercreatortest.o ftcontrollertest.o ftserver1test.o ftserver2test.o ftserver3test.o ftdata_test.o
|
||||||
|
|
||||||
TESTS = ftfilemappertest ftfileprovidertest ftfilecreatortest ftextralisttest ftdataplextest fttransfermoduletest ftcrc32test ftcrossprovidercreatortest ftcontrollertest ftserver1test ftserver2test fttransfermoduletest ftserver3test
|
TESTS = ftfileprovidertest ftfilecreatortest ftextralisttest ftdataplextest fttransfermoduletest ftcrc32test ftcrossprovidercreatortest ftcontrollertest ftserver1test ftserver2test fttransfermoduletest ftserver3test
|
||||||
|
#ftfilemappertest
|
||||||
|
|
||||||
all: tests
|
all: tests
|
||||||
|
|
||||||
|
|
|
@ -28,14 +28,15 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "retroshare/rsfiles.h"
|
#include "retroshare/rsfiles.h"
|
||||||
|
#include "retroshare/rspeers.h"
|
||||||
#include "ft/ftserver.h"
|
#include "ft/ftserver.h"
|
||||||
|
|
||||||
#include "ft/ftextralist.h"
|
#include "ft/ftextralist.h"
|
||||||
#include "ft/ftdatamultiplex.h"
|
#include "ft/ftdatamultiplex.h"
|
||||||
#include "ft/ftfilesearch.h"
|
#include "ft/ftfilesearch.h"
|
||||||
|
|
||||||
#include "pqi/p3authmgr.h"
|
//#include "pqi/p3authmgr.h"
|
||||||
#include "pqi/p3connmgr.h"
|
//#include "pqi/p3connmgr.h"
|
||||||
|
|
||||||
#include "util/rsdebug.h"
|
#include "util/rsdebug.h"
|
||||||
|
|
||||||
|
@ -123,7 +124,7 @@ int main(int argc, char **argv)
|
||||||
std::cerr << "Adding: " << argv[optind] << std::endl;
|
std::cerr << "Adding: " << argv[optind] << std::endl;
|
||||||
|
|
||||||
SharedDirInfo info ;
|
SharedDirInfo info ;
|
||||||
info.shareflags = RS_FILE_HINTS_NETWORK_WIDE | RS_FILE_HINTS_BROWSABLE ;
|
info.shareflags = DIR_FLAGS_PERMISSIONS_MASK;
|
||||||
info.filename = std::string(argv[optind]);
|
info.filename = std::string(argv[optind]);
|
||||||
info.virtualname = info.filename ;
|
info.virtualname = info.filename ;
|
||||||
|
|
||||||
|
@ -140,8 +141,8 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
std::list<std::string>::const_iterator it, jit;
|
std::list<std::string>::const_iterator it, jit;
|
||||||
|
|
||||||
std::list<pqiAuthDetails> baseFriendList, friendList;
|
std::list<RsPeerDetails> baseFriendList, friendList;
|
||||||
std::list<pqiAuthDetails>::iterator fit;
|
std::list<RsPeerDetails>::iterator fit;
|
||||||
|
|
||||||
P3Hub *testHub = new P3Hub(0,NULL);
|
P3Hub *testHub = new P3Hub(0,NULL);
|
||||||
testHub->start();
|
testHub->start();
|
||||||
|
@ -149,12 +150,12 @@ int main(int argc, char **argv)
|
||||||
/* Setup Base Friend Info */
|
/* Setup Base Friend Info */
|
||||||
for(it = peerIds.begin(); it != peerIds.end(); it++)
|
for(it = peerIds.begin(); it != peerIds.end(); it++)
|
||||||
{
|
{
|
||||||
pqiAuthDetails pad;
|
RsPeerDetails pad;
|
||||||
pad.id = *it;
|
pad.id = *it;
|
||||||
pad.name = *it;
|
pad.name = *it;
|
||||||
pad.trustLvl = 5;
|
pad.trustLvl = 5;
|
||||||
pad.ownsign = true;
|
pad.ownsign = true;
|
||||||
pad.trusted = false;
|
//pad.trusted = false;
|
||||||
|
|
||||||
baseFriendList.push_back(pad);
|
baseFriendList.push_back(pad);
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "retroshare/rstypes.h"
|
#include "retroshare/rstypes.h"
|
||||||
#include <util/rsdir.h>
|
#include <util/rsdir.h>
|
||||||
|
@ -67,7 +68,9 @@ int main(int argc, char **argv)
|
||||||
std::cerr << "Hashing file :" << *it << std::endl ;
|
std::cerr << "Hashing file :" << *it << std::endl ;
|
||||||
|
|
||||||
std::string hash ;
|
std::string hash ;
|
||||||
RsDirUtil::hashFile( *it,hash) ;
|
uint64_t size ;
|
||||||
|
std::string name ;
|
||||||
|
RsDirUtil::hashFile( *it,name,hash,size) ;
|
||||||
|
|
||||||
std::cerr << "Hash = " << hash << std::endl;
|
std::cerr << "Hash = " << hash << std::endl;
|
||||||
|
|
||||||
|
@ -87,7 +90,7 @@ int main(int argc, char **argv)
|
||||||
return 0 ;
|
return 0 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t size = ftell(f) ;
|
size = ftell(f) ;
|
||||||
|
|
||||||
if(fseek(f,0,SEEK_SET))
|
if(fseek(f,0,SEEK_SET))
|
||||||
{
|
{
|
||||||
|
|
144
libretroshare/src/tests/ft/ftdata_test.h
Normal file
144
libretroshare/src/tests/ft/ftdata_test.h
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
/*
|
||||||
|
* libretroshare/src/ft: ftdata.h
|
||||||
|
*
|
||||||
|
* File Transfer for RetroShare.
|
||||||
|
*
|
||||||
|
* Copyright 2008 by Robert Fernie.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License Version 2 as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||||
|
* USA.
|
||||||
|
*
|
||||||
|
* Please report all bugs and problems to "retroshare@lunamutt.com".
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FT_DATA_TEST_INTERFACE_HEADER
|
||||||
|
#define FT_DATA_TEST_INTERFACE_HEADER
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ftData.
|
||||||
|
*
|
||||||
|
* Internal Interfaces for sending and receiving data.
|
||||||
|
* Most likely to be implemented by ftServer.
|
||||||
|
* Provided as an independent interface for testing purposes.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#include <retroshare/rstypes.h>
|
||||||
|
#include <ft/ftdata.h>
|
||||||
|
|
||||||
|
/*************** SEND INTERFACE *******************/
|
||||||
|
|
||||||
|
class CompressedChunkMap ;
|
||||||
|
class Sha1CheckSum ;
|
||||||
|
|
||||||
|
/**************** FOR TESTING ***********************/
|
||||||
|
|
||||||
|
/******* Pair of Send/Recv (Only need to handle Send side) ******/
|
||||||
|
class ftDataSendPair: public ftDataSend
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ftDataSendPair(ftDataRecv *recv);
|
||||||
|
virtual ~ftDataSendPair() { return; }
|
||||||
|
|
||||||
|
/* Client Send */
|
||||||
|
virtual bool sendDataRequest(const std::string &peerId, const std::string &hash,
|
||||||
|
uint64_t size, uint64_t offset, uint32_t chunksize);
|
||||||
|
|
||||||
|
/* Server Send */
|
||||||
|
virtual bool sendData(const std::string &peerId, const std::string &hash, uint64_t size,
|
||||||
|
uint64_t offset, uint32_t chunksize, void *data);
|
||||||
|
|
||||||
|
/* Send a request for a chunk map */
|
||||||
|
virtual bool sendChunkMapRequest(const std::string& peer_id,const std::string& hash,bool is_client);
|
||||||
|
|
||||||
|
/* Send a chunk map */
|
||||||
|
virtual bool sendChunkMap(const std::string& peer_id,const std::string& hash, const CompressedChunkMap& cmap,bool is_client);
|
||||||
|
|
||||||
|
/* Send a request for a chunk map */
|
||||||
|
virtual bool sendCRC32MapRequest(const std::string& peer_id,const std::string& hash);
|
||||||
|
|
||||||
|
/* Send a chunk map */
|
||||||
|
virtual bool sendCRC32Map(const std::string& peer_id,const std::string& hash, const CRC32Map& cmap);
|
||||||
|
ftDataRecv *mDataRecv;
|
||||||
|
|
||||||
|
virtual bool sendSingleChunkCRCRequest(const std::string&, const std::string&, uint32_t);
|
||||||
|
virtual bool sendSingleChunkCRC(const std::string&, const std::string&, uint32_t, const Sha1CheckSum&);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ftDataSendDummy: public ftDataSend
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~ftDataSendDummy() { return; }
|
||||||
|
|
||||||
|
/* Client Send */
|
||||||
|
virtual bool sendDataRequest(const std::string &peerId, const std::string &hash,
|
||||||
|
uint64_t size, uint64_t offset, uint32_t chunksize);
|
||||||
|
|
||||||
|
/* Server Send */
|
||||||
|
virtual bool sendData(const std::string &peerId, const std::string &hash, uint64_t size,
|
||||||
|
uint64_t offset, uint32_t chunksize, void *data);
|
||||||
|
|
||||||
|
/* Send a request for a chunk map */
|
||||||
|
virtual bool sendChunkMapRequest(const std::string& peer_id,const std::string& hash,bool is_client);
|
||||||
|
|
||||||
|
/* Send a chunk map */
|
||||||
|
virtual bool sendChunkMap(const std::string& peer_id,const std::string& hash, const CompressedChunkMap& cmap,bool is_client);
|
||||||
|
|
||||||
|
/* Send a request for a chunk map */
|
||||||
|
virtual bool sendCRC32MapRequest(const std::string& peer_id,const std::string& hash);
|
||||||
|
|
||||||
|
/* Send a chunk map */
|
||||||
|
virtual bool sendCRC32Map(const std::string& peer_id,const std::string& hash, const CRC32Map& cmap);
|
||||||
|
|
||||||
|
virtual bool sendSingleChunkCRCRequest(const std::string&, const std::string&, uint32_t);
|
||||||
|
virtual bool sendSingleChunkCRC(const std::string&, const std::string&, uint32_t, const Sha1CheckSum&);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class ftDataRecvDummy: public ftDataRecv
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual ~ftDataRecvDummy() { return; }
|
||||||
|
|
||||||
|
/* Client Recv */
|
||||||
|
virtual bool recvData(const std::string& peerId, const std::string& hash,
|
||||||
|
uint64_t size, uint64_t offset, uint32_t chunksize, void *data);
|
||||||
|
|
||||||
|
/* Server Recv */
|
||||||
|
virtual bool recvDataRequest(const std::string& peerId, const std::string& hash,
|
||||||
|
uint64_t size, uint64_t offset, uint32_t chunksize);
|
||||||
|
|
||||||
|
/* Send a request for a chunk map */
|
||||||
|
virtual bool recvChunkMapRequest(const std::string& peer_id,const std::string& hash,
|
||||||
|
bool is_client);
|
||||||
|
|
||||||
|
/* Send a chunk map */
|
||||||
|
virtual bool recvChunkMap(const std::string& peer_id,const std::string& hash,
|
||||||
|
const CompressedChunkMap& cmap,bool is_client);
|
||||||
|
|
||||||
|
/* Send a request for a chunk map */
|
||||||
|
virtual bool sendCRC32MapRequest(const std::string& peer_id,const std::string& hash);
|
||||||
|
|
||||||
|
/* Send a chunk map */
|
||||||
|
virtual bool sendCRC32Map(const std::string& peer_id,const std::string& hash, const CompressedChunkMap& cmap);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -40,6 +40,8 @@
|
||||||
#include "ft/ftdatamultiplex.h"
|
#include "ft/ftdatamultiplex.h"
|
||||||
#include "ft/ftfilesearch.h"
|
#include "ft/ftfilesearch.h"
|
||||||
|
|
||||||
|
#include "ftdata_test.h"
|
||||||
|
|
||||||
void do_random_server_test(ftDataMultiplex *mplex, ftExtraList *eList, std::list<std::string> &files);
|
void do_random_server_test(ftDataMultiplex *mplex, ftExtraList *eList, std::list<std::string> &files);
|
||||||
|
|
||||||
|
|
||||||
|
@ -107,7 +109,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
/* now work the thread */
|
/* now work the thread */
|
||||||
std::list<std::string>::iterator it;
|
std::list<std::string>::iterator it;
|
||||||
uint32_t flags = 0;
|
TransferRequestFlags flags(0);
|
||||||
for(it = fileList.begin(); it != fileList.end(); it++)
|
for(it = fileList.begin(); it != fileList.end(); it++)
|
||||||
{
|
{
|
||||||
eList->hashExtraFile(*it, dPeriod, flags);
|
eList->hashExtraFile(*it, dPeriod, flags);
|
||||||
|
|
|
@ -101,7 +101,7 @@ int main(int argc, char **argv)
|
||||||
std::list<std::string> hashed;
|
std::list<std::string> hashed;
|
||||||
std::list<std::string>::iterator it;
|
std::list<std::string>::iterator it;
|
||||||
|
|
||||||
uint32_t flags = 0;
|
TransferRequestFlags flags(0);
|
||||||
for(it = hashList.begin(); it != hashList.end(); it++)
|
for(it = hashList.begin(); it != hashList.end(); it++)
|
||||||
{
|
{
|
||||||
sleep(period);
|
sleep(period);
|
||||||
|
@ -148,7 +148,7 @@ void displayExtraListDetails(ftExtraList *eList, std::list<std::string> toHash,
|
||||||
for(it = hashed.begin(); it != hashed.end(); it++)
|
for(it = hashed.begin(); it != hashed.end(); it++)
|
||||||
{
|
{
|
||||||
FileInfo info;
|
FileInfo info;
|
||||||
if (eList->search(*it, 0, info))
|
if (eList->search(*it, FileSearchFlags(0), info))
|
||||||
{
|
{
|
||||||
std::cerr << "displayExtraListDetails() Found Hash: " << *it;
|
std::cerr << "displayExtraListDetails() Found Hash: " << *it;
|
||||||
std::cerr << std::endl;
|
std::cerr << std::endl;
|
||||||
|
|
16
libretroshare/src/tests/ft/ftsearch_test.cc
Normal file
16
libretroshare/src/tests/ft/ftsearch_test.cc
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#include "ftsearch_test.h"
|
||||||
|
|
||||||
|
bool ftSearchDummy::search(std::string /*hash*/, FileSearchFlags hintflags, FileInfo &/*info*/) const
|
||||||
|
{
|
||||||
|
/* remove unused parameter warnings */
|
||||||
|
(void) hintflags;
|
||||||
|
|
||||||
|
#ifdef DEBUG_SEARCH
|
||||||
|
std::cerr << "ftSearchDummy::search(" << hash ;
|
||||||
|
std::cerr << ", " << hintflags << ");";
|
||||||
|
std::cerr << std::endl;
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
38
libretroshare/src/tests/ft/ftsearch_test.h
Normal file
38
libretroshare/src/tests/ft/ftsearch_test.h
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* libretroshare/src/ft: ftsearch.h
|
||||||
|
*
|
||||||
|
* File Transfer for RetroShare.
|
||||||
|
*
|
||||||
|
* Copyright 2008 by Robert Fernie.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License Version 2 as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||||
|
* USA.
|
||||||
|
*
|
||||||
|
* Please report all bugs and problems to "retroshare@lunamutt.com".
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ft/ftsearch.h"
|
||||||
|
|
||||||
|
class ftSearchDummy: public ftSearch
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ftSearchDummy() { return; }
|
||||||
|
virtual ~ftSearchDummy() { return; }
|
||||||
|
virtual bool search(const std::string& hash, FileSearchFlags hintflags, FileInfo &info) const;
|
||||||
|
};
|
||||||
|
|
|
@ -40,8 +40,8 @@
|
||||||
#include "ft/ftdatamultiplex.h"
|
#include "ft/ftdatamultiplex.h"
|
||||||
#include "ft/ftfilesearch.h"
|
#include "ft/ftfilesearch.h"
|
||||||
|
|
||||||
#include "pqi/p3authmgr.h"
|
//#include "pqi/p3authmgr.h"
|
||||||
#include "pqi/p3connmgr.h"
|
//#include "pqi/p3connmgr.h"
|
||||||
|
|
||||||
#include "util/rsdebug.h"
|
#include "util/rsdebug.h"
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,10 @@
|
||||||
#include "util/rswin.h"
|
#include "util/rswin.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
#include "retroshare/rsexpr.h"
|
#include "retroshare/rsexpr.h"
|
||||||
|
#include "retroshare/rstypes.h"
|
||||||
|
#include "retroshare/rsfiles.h"
|
||||||
|
|
||||||
#include "ft/ftserver.h"
|
#include "ft/ftserver.h"
|
||||||
|
|
||||||
|
@ -45,8 +48,8 @@
|
||||||
#include "ft/ftdatamultiplex.h"
|
#include "ft/ftdatamultiplex.h"
|
||||||
#include "ft/ftfilesearch.h"
|
#include "ft/ftfilesearch.h"
|
||||||
|
|
||||||
#include "pqi/p3authmgr.h"
|
//#include "pqi/p3authmgr.h"
|
||||||
#include "pqi/p3connmgr.h"
|
//#include "pqi/p3connmgr.h"
|
||||||
|
|
||||||
#include "util/rsdebug.h"
|
#include "util/rsdebug.h"
|
||||||
|
|
||||||
|
@ -163,7 +166,7 @@ int main(int argc, char **argv)
|
||||||
SharedDirInfo info ;
|
SharedDirInfo info ;
|
||||||
info.filename = std::string(argv[optind]);
|
info.filename = std::string(argv[optind]);
|
||||||
info.virtualname = info.filename ;
|
info.virtualname = info.filename ;
|
||||||
info.shareflags = RS_FILE_HINTS_NETWORK_WIDE | RS_FILE_HINTS_BROWSABLE ;
|
info.shareflags = DIR_FLAGS_PERMISSIONS_MASK;
|
||||||
|
|
||||||
fileList.push_back(info) ;
|
fileList.push_back(info) ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
#include "ft/fttransfermodule.h"
|
#include "ft/fttransfermodule.h"
|
||||||
|
|
||||||
#include "util/utest.h"
|
#include "util/utest.h"
|
||||||
|
#include "ftdata_test.h"
|
||||||
|
|
||||||
INITTEST()
|
INITTEST()
|
||||||
|
|
||||||
|
@ -122,7 +123,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
/* now work the thread */
|
/* now work the thread */
|
||||||
std::list<std::string>::iterator it;
|
std::list<std::string>::iterator it;
|
||||||
uint32_t flags = 0;
|
TransferRequestFlags flags(0);
|
||||||
for(it = fileList.begin(); it != fileList.end(); it++)
|
for(it = fileList.begin(); it != fileList.end(); it++)
|
||||||
{
|
{
|
||||||
eList->hashExtraFile(*it, dPeriod, flags);
|
eList->hashExtraFile(*it, dPeriod, flags);
|
||||||
|
@ -150,7 +151,7 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string savename = "/tmp/" + info.fname;
|
std::string savename = "/tmp/" + info.fname;
|
||||||
ftFileCreator *creator = new ftFileCreator(savename, info.size, info.hash);
|
ftFileCreator *creator = new ftFileCreator(savename, info.size, info.hash,false);
|
||||||
ftController *controller = NULL;
|
ftController *controller = NULL;
|
||||||
|
|
||||||
ftTransferModule *transfer = new ftTransferModule(creator, ftmplex1, controller);
|
ftTransferModule *transfer = new ftTransferModule(creator, ftmplex1, controller);
|
||||||
|
|
|
@ -109,7 +109,7 @@ private:
|
||||||
class P3Pipe: public P3Interface
|
class P3Pipe: public P3Interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
P3Pipe() {return; }
|
P3Pipe() : pipeMtx(std::string("Pipe mutex")) {return; }
|
||||||
virtual ~P3Pipe() {return; }
|
virtual ~P3Pipe() {return; }
|
||||||
|
|
||||||
virtual int tick() { return 1; }
|
virtual int tick() { return 1; }
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
RS_TOP_DIR = ../..
|
RS_TOP_DIR = ../..
|
||||||
DHT_TOP_DIR = ../../../../libbitdht/src
|
DHT_TOP_DIR = ../../../../libbitdht/src
|
||||||
|
OPS_TOP_DIR = ../../../../openpgpsdk/src
|
||||||
##### Define any flags that are needed for this section #######
|
##### Define any flags that are needed for this section #######
|
||||||
###############################################################
|
###############################################################
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
#include "pqi/p3connmgr.h"
|
//#include "pqi/p3connmgr.h"
|
||||||
#include "pqi/p3authmgr.h"
|
//#include "pqi/p3authmgr.h"
|
||||||
#include "util/utest.h"
|
#include "util/utest.h"
|
||||||
|
|
||||||
#include "upnp/upnphandler.h"
|
#include "upnp/upnphandler.h"
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "util/utest.h"
|
#include "util/utest.h"
|
||||||
#include "util/pgpkey.h"
|
#include "pgp/pgpkeyutil.h"
|
||||||
|
|
||||||
INITTEST();
|
INITTEST();
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include "NetworkSimulatorGUI.h"
|
#include "NetworkSimulatorGUI.h"
|
||||||
#include "MonitoredRsPeers.h"
|
#include "MonitoredRsPeers.h"
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <argstream.h>
|
#include <common/argstream.h>
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@ TEMPLATE = app
|
||||||
CONFIG *= qt qglviewer
|
CONFIG *= qt qglviewer
|
||||||
QT *= xml opengl
|
QT *= xml opengl
|
||||||
|
|
||||||
INCLUDEPATH *= ../..
|
INCLUDEPATH *= ../.. ..
|
||||||
|
|
||||||
TARGET = NetworkSim
|
TARGET = NetworkSim
|
||||||
|
|
||||||
|
@ -16,4 +16,4 @@ HEADERS = Network.h MonitoredTurtle.h NetworkViewer.h NetworkSimulatorGUI.h \
|
||||||
|
|
||||||
FORMS = NetworkSimulatorGUI.ui TurtleRouterStatistics.ui
|
FORMS = NetworkSimulatorGUI.ui TurtleRouterStatistics.ui
|
||||||
|
|
||||||
LIBS *= ../../lib/libretroshare.a ../../../../libbitdht/src/lib/libbitdht.a ../../../../openpgpsdk/src/lib/libops.a -lgnome-keyring -lupnp -lssl -lcrypto -lbz2
|
LIBS *= ../../lib/libretroshare.a ../../../../libbitdht/src/lib/libbitdht.a ../../../../openpgpsdk/src/lib/libops.a -lgnome-keyring -lupnp -lssl -lcrypto -lbz2 -lixml
|
||||||
|
|
|
@ -1,814 +0,0 @@
|
||||||
/* Copyright (C) 2004 Xavier Décoret <Xavier.Decoret@imag.fr>
|
|
||||||
*
|
|
||||||
* argsteam is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Foobar is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with Foobar; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ARGSTREAM_H
|
|
||||||
#define ARGSTREAM_H
|
|
||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string>
|
|
||||||
#include <list>
|
|
||||||
#include <deque>
|
|
||||||
#include <map>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <sstream>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
class argstream;
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
class ValueHolder;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
argstream& operator>> (argstream&, const ValueHolder<T>&);
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// Interface of ValueHolder<T>
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
template<class T>
|
|
||||||
class ValueHolder
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ValueHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
T& b,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory);
|
|
||||||
ValueHolder(const char* l,
|
|
||||||
T& b,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory);
|
|
||||||
ValueHolder(char s,
|
|
||||||
T& b,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory);
|
|
||||||
friend argstream& operator>><>(argstream& s,const ValueHolder<T>& v);
|
|
||||||
std::string name() const;
|
|
||||||
std::string description() const;
|
|
||||||
private:
|
|
||||||
std::string shortName_;
|
|
||||||
std::string longName_;
|
|
||||||
T* value_;
|
|
||||||
T initialValue_;
|
|
||||||
std::string description_;
|
|
||||||
bool mandatory_;
|
|
||||||
};
|
|
||||||
template <class T>
|
|
||||||
inline ValueHolder<T>
|
|
||||||
parameter(char s,
|
|
||||||
const char* l,
|
|
||||||
T& b,
|
|
||||||
const char* desc="",
|
|
||||||
bool mandatory = true)
|
|
||||||
{
|
|
||||||
return ValueHolder<T>(s,l,b,desc,mandatory);
|
|
||||||
}
|
|
||||||
template <class T>
|
|
||||||
inline ValueHolder<T>
|
|
||||||
parameter(char s,
|
|
||||||
T& b,
|
|
||||||
const char* desc="",
|
|
||||||
bool mandatory = true)
|
|
||||||
{
|
|
||||||
return ValueHolder<T>(s,b,desc,mandatory);
|
|
||||||
}
|
|
||||||
template <class T>
|
|
||||||
inline ValueHolder<T>
|
|
||||||
parameter(const char* l,
|
|
||||||
T& b,
|
|
||||||
const char* desc="",
|
|
||||||
bool mandatory = true)
|
|
||||||
{
|
|
||||||
return ValueHolder<T>(l,b,desc,mandatory);
|
|
||||||
}
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// Interface of OptionHolder
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
class OptionHolder
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline OptionHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc);
|
|
||||||
inline OptionHolder(const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc);
|
|
||||||
inline OptionHolder(char s,
|
|
||||||
bool& b,
|
|
||||||
const char* desc);
|
|
||||||
friend argstream& operator>>(argstream& s,const OptionHolder& v);
|
|
||||||
inline std::string name() const;
|
|
||||||
inline std::string description() const;
|
|
||||||
protected:
|
|
||||||
inline OptionHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
const char* desc);
|
|
||||||
friend OptionHolder help(char s='h',
|
|
||||||
const char* l="help",
|
|
||||||
const char* desc="Display this help");
|
|
||||||
private:
|
|
||||||
std::string shortName_;
|
|
||||||
std::string longName_;
|
|
||||||
bool* value_;
|
|
||||||
std::string description_;
|
|
||||||
};
|
|
||||||
inline OptionHolder
|
|
||||||
option(char s,
|
|
||||||
const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc="")
|
|
||||||
{
|
|
||||||
return OptionHolder(s,l,b,desc);
|
|
||||||
}
|
|
||||||
inline OptionHolder
|
|
||||||
option(char s,
|
|
||||||
bool& b,
|
|
||||||
const char* desc="")
|
|
||||||
{
|
|
||||||
return OptionHolder(s,b,desc);
|
|
||||||
}
|
|
||||||
inline OptionHolder
|
|
||||||
option(const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc="")
|
|
||||||
{
|
|
||||||
return OptionHolder(l,b,desc);
|
|
||||||
}
|
|
||||||
inline OptionHolder
|
|
||||||
help(char s,
|
|
||||||
const char* l,
|
|
||||||
const char* desc)
|
|
||||||
{
|
|
||||||
return OptionHolder(s,l,desc);
|
|
||||||
}
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// Interface of ValuesHolder
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
template<class T,class O>
|
|
||||||
class ValuesHolder
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ValuesHolder(const O& o,
|
|
||||||
const char* desc,
|
|
||||||
int len);
|
|
||||||
template<class A,class B> friend argstream& operator>>(argstream& s,const ValuesHolder<A,B>& v);
|
|
||||||
std::string name() const;
|
|
||||||
std::string description() const;
|
|
||||||
typedef T value_type;
|
|
||||||
private:
|
|
||||||
mutable O value_;
|
|
||||||
std::string description_;
|
|
||||||
int len_;
|
|
||||||
char letter_;
|
|
||||||
};
|
|
||||||
template<class T,class O>
|
|
||||||
inline ValuesHolder<T,O>
|
|
||||||
values(const O& o,
|
|
||||||
const char* desc="",
|
|
||||||
int len=-1)
|
|
||||||
{
|
|
||||||
return ValuesHolder<T,O>(o,desc,len);
|
|
||||||
}
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// Interface of ValueParser
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
template <class T>
|
|
||||||
class ValueParser
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline T operator()(const std::string& s) const
|
|
||||||
{
|
|
||||||
std::istringstream is(s);
|
|
||||||
T t;
|
|
||||||
is>>t;
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
// We need to specialize for string otherwise parsing of a value that
|
|
||||||
// contains space (for example a string with space passed in quotes on the
|
|
||||||
// command line) would parse only the first element of the value!!!
|
|
||||||
template <>
|
|
||||||
class ValueParser<std::string>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline std::string operator()(const std::string& s) const
|
|
||||||
{
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// Interface of argstream
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
class argstream
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline argstream(int argc,char** argv);
|
|
||||||
inline argstream(const char* c);
|
|
||||||
template<class T>
|
|
||||||
friend argstream& operator>>(argstream& s,const ValueHolder<T>& v);
|
|
||||||
friend inline argstream& operator>>(argstream& s,const OptionHolder& v);
|
|
||||||
template<class T,class O>
|
|
||||||
friend argstream& operator>>(argstream& s,const ValuesHolder<T,O>& v);
|
|
||||||
|
|
||||||
inline bool helpRequested() const;
|
|
||||||
inline bool isOk() const;
|
|
||||||
inline std::string errorLog() const;
|
|
||||||
inline std::string usage() const;
|
|
||||||
inline void defaultErrorHandling(bool ignoreUnused=false) const;
|
|
||||||
static inline char uniqueLetter();
|
|
||||||
protected:
|
|
||||||
void parse(int argc,char** argv);
|
|
||||||
private:
|
|
||||||
typedef std::list<std::string>::iterator value_iterator;
|
|
||||||
typedef std::pair<std::string,std::string> help_entry;
|
|
||||||
std::string progName_;
|
|
||||||
std::map<std::string,value_iterator> options_;
|
|
||||||
std::list<std::string> values_;
|
|
||||||
bool minusActive_;
|
|
||||||
bool isOk_;
|
|
||||||
std::deque<help_entry> argHelps_;
|
|
||||||
std::string cmdLine_;
|
|
||||||
std::deque<std::string> errors_;
|
|
||||||
bool helpRequested_;
|
|
||||||
};
|
|
||||||
//************************************************************
|
|
||||||
// Implementation of ValueHolder<T>
|
|
||||||
//************************************************************
|
|
||||||
template<class T>
|
|
||||||
ValueHolder<T>::ValueHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
T& v,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory)
|
|
||||||
: shortName_(1,s),
|
|
||||||
longName_(l),
|
|
||||||
value_(&v),
|
|
||||||
initialValue_(v),
|
|
||||||
description_(desc),
|
|
||||||
mandatory_(mandatory)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
ValueHolder<T>::ValueHolder(const char* l,
|
|
||||||
T& v,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory)
|
|
||||||
: longName_(l),
|
|
||||||
value_(&v),
|
|
||||||
initialValue_(v),
|
|
||||||
description_(desc),
|
|
||||||
mandatory_(mandatory)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
ValueHolder<T>::ValueHolder(char s,
|
|
||||||
T& v,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory)
|
|
||||||
: shortName_(1,s),
|
|
||||||
value_(&v),
|
|
||||||
initialValue_(v),
|
|
||||||
description_(desc),
|
|
||||||
mandatory_(mandatory)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
std::string
|
|
||||||
ValueHolder<T>::name() const
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
if (!shortName_.empty()) os<<'-'<<shortName_;
|
|
||||||
if (!longName_.empty()) {
|
|
||||||
if (!shortName_.empty()) os<<'/';
|
|
||||||
os<<"--"<<longName_;
|
|
||||||
}
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
std::string
|
|
||||||
ValueHolder<T>::description() const
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<description_;
|
|
||||||
if (mandatory_)
|
|
||||||
{
|
|
||||||
os<<"(mandatory)";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
os<<"(default="<<initialValue_<<")";
|
|
||||||
}
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
//************************************************************
|
|
||||||
// Implementation of OptionHolder
|
|
||||||
//************************************************************
|
|
||||||
inline OptionHolder::OptionHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc)
|
|
||||||
: shortName_(1,s),
|
|
||||||
longName_(l),
|
|
||||||
value_(&b),
|
|
||||||
description_(desc)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
inline OptionHolder::OptionHolder(const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc)
|
|
||||||
: longName_(l),
|
|
||||||
value_(&b),
|
|
||||||
description_(desc)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
inline OptionHolder::OptionHolder(char s,
|
|
||||||
bool& b,
|
|
||||||
const char* desc)
|
|
||||||
: shortName_(1,s),
|
|
||||||
value_(&b),
|
|
||||||
description_(desc)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
inline OptionHolder::OptionHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
const char* desc)
|
|
||||||
: shortName_(1,s),
|
|
||||||
longName_(l),
|
|
||||||
value_(NULL),
|
|
||||||
description_(desc)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
inline std::string
|
|
||||||
OptionHolder::name() const
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
if (!shortName_.empty()) os<<'-'<<shortName_;
|
|
||||||
if (!longName_.empty())
|
|
||||||
{
|
|
||||||
if (!shortName_.empty()) os<<'/';
|
|
||||||
os<<"--"<<longName_;
|
|
||||||
}
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
inline std::string
|
|
||||||
OptionHolder::description() const
|
|
||||||
{
|
|
||||||
return description_;
|
|
||||||
}
|
|
||||||
//************************************************************
|
|
||||||
// Implementation of ValuesHolder<T,O>
|
|
||||||
//************************************************************
|
|
||||||
template<class T,class O>
|
|
||||||
ValuesHolder<T,O>::ValuesHolder(const O& o,
|
|
||||||
const char* desc,
|
|
||||||
int len)
|
|
||||||
: value_(o),
|
|
||||||
description_(desc),
|
|
||||||
len_(len)
|
|
||||||
{
|
|
||||||
letter_ = argstream::uniqueLetter();
|
|
||||||
}
|
|
||||||
template <class T,class O>
|
|
||||||
std::string
|
|
||||||
ValuesHolder<T,O>::name() const
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<letter_<<"i";
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
template <class T,class O>
|
|
||||||
std::string
|
|
||||||
ValuesHolder<T,O>::description() const
|
|
||||||
{
|
|
||||||
return description_;
|
|
||||||
}
|
|
||||||
//************************************************************
|
|
||||||
// Implementation of argstream
|
|
||||||
//************************************************************
|
|
||||||
inline
|
|
||||||
argstream::argstream(int argc,char** argv)
|
|
||||||
: progName_(argv[0]),
|
|
||||||
minusActive_(true),
|
|
||||||
isOk_(true)
|
|
||||||
{
|
|
||||||
parse(argc,argv);
|
|
||||||
}
|
|
||||||
inline
|
|
||||||
argstream::argstream(const char* c)
|
|
||||||
: progName_(""),
|
|
||||||
minusActive_(true),
|
|
||||||
isOk_(true)
|
|
||||||
{
|
|
||||||
std::string s(c);
|
|
||||||
// Build argc, argv from s. We must add a dummy first element for
|
|
||||||
// progName because parse() expects it!!
|
|
||||||
std::deque<std::string> args;
|
|
||||||
args.push_back("");
|
|
||||||
std::istringstream is(s);
|
|
||||||
while (is.good())
|
|
||||||
{
|
|
||||||
std::string t;
|
|
||||||
is>>t;
|
|
||||||
args.push_back(t);
|
|
||||||
}
|
|
||||||
char* pargs[args.size()];
|
|
||||||
char** p = pargs;
|
|
||||||
for (std::deque<std::string>::const_iterator
|
|
||||||
iter = args.begin();
|
|
||||||
iter != args.end();++iter)
|
|
||||||
{
|
|
||||||
*p++ = const_cast<char*>(iter->c_str());
|
|
||||||
}
|
|
||||||
parse(args.size(),pargs);
|
|
||||||
}
|
|
||||||
inline void
|
|
||||||
argstream::parse(int argc,char** argv)
|
|
||||||
{
|
|
||||||
// Run thru all arguments.
|
|
||||||
// * it has -- in front : it is a long name option, if remainder is empty,
|
|
||||||
// it is an error
|
|
||||||
// * it has - in front : it is a sequence of short name options, if
|
|
||||||
// remainder is empty, deactivates option (- will
|
|
||||||
// now be considered a char).
|
|
||||||
// * if any other char, or if option was deactivated
|
|
||||||
// : it is a value. Values are split in parameters
|
|
||||||
// (immediately follow an option) and pure values.
|
|
||||||
// Each time a value is parsed, if the previously parsed argument was an
|
|
||||||
// option, then the option is linked to the value in case of it is a
|
|
||||||
// option with parameter. The subtle point is that when several options
|
|
||||||
// are given with short names (ex: -abc equivalent to -a -b -c), the last
|
|
||||||
// parsed option is -c).
|
|
||||||
// Since we use map for option, any successive call overides the previous
|
|
||||||
// one: foo -a -b -a hello is equivalent to foo -b -a hello
|
|
||||||
// For values it is not true since we might have several times the same
|
|
||||||
// value.
|
|
||||||
value_iterator* lastOption = NULL;
|
|
||||||
for (char** a = argv,**astop=a+argc;++a!=astop;)
|
|
||||||
{
|
|
||||||
std::string s(*a);
|
|
||||||
if (minusActive_ && s[0] == '-')
|
|
||||||
{
|
|
||||||
if (s.size() > 1 && s[1] == '-')
|
|
||||||
{
|
|
||||||
if (s.size() == 2)
|
|
||||||
{
|
|
||||||
minusActive_ = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
lastOption = &(options_[s.substr(2)] = values_.end());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (s.size() > 1)
|
|
||||||
{
|
|
||||||
// Parse all chars, if it is a minus we have an error
|
|
||||||
for (std::string::const_iterator cter = s.begin();
|
|
||||||
++cter != s.end();)
|
|
||||||
{
|
|
||||||
if (*cter == '-')
|
|
||||||
{
|
|
||||||
isOk_ = false;
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<"- in the middle of a switch "<<a;
|
|
||||||
errors_.push_back(os.str());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
lastOption = &(options_[std::string(1,*cter)] = values_.end());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
isOk_ = false;
|
|
||||||
errors_.push_back("Invalid argument -");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
values_.push_back(s);
|
|
||||||
if (lastOption != NULL)
|
|
||||||
{
|
|
||||||
*lastOption = --values_.end();
|
|
||||||
}
|
|
||||||
lastOption = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef ARGSTREAM_DEBUG
|
|
||||||
for (std::map<std::string,value_iterator>::const_iterator
|
|
||||||
iter = options_.begin();iter != options_.end();++iter)
|
|
||||||
{
|
|
||||||
std::cout<<"DEBUG: option "<<iter->first;
|
|
||||||
if (iter->second != values_.end())
|
|
||||||
{
|
|
||||||
std::cout<<" -> "<<*(iter->second);
|
|
||||||
}
|
|
||||||
std::cout<<std::endl;
|
|
||||||
}
|
|
||||||
for (std::list<std::string>::const_iterator
|
|
||||||
iter = values_.begin();iter != values_.end();++iter)
|
|
||||||
{
|
|
||||||
std::cout<<"DEBUG: value "<<*iter<<std::endl;
|
|
||||||
}
|
|
||||||
#endif // ARGSTREAM_DEBUG
|
|
||||||
}
|
|
||||||
inline bool
|
|
||||||
argstream::isOk() const
|
|
||||||
{
|
|
||||||
return isOk_;
|
|
||||||
}
|
|
||||||
inline bool
|
|
||||||
argstream::helpRequested() const
|
|
||||||
{
|
|
||||||
return helpRequested_;
|
|
||||||
}
|
|
||||||
inline std::string
|
|
||||||
argstream::usage() const
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<"usage: "<<progName_<<cmdLine_<<'\n';
|
|
||||||
unsigned int lmax = 0;
|
|
||||||
for (std::deque<help_entry>::const_iterator
|
|
||||||
iter = argHelps_.begin();iter != argHelps_.end();++iter)
|
|
||||||
{
|
|
||||||
if (lmax<iter->first.size()) lmax = iter->first.size();
|
|
||||||
}
|
|
||||||
for (std::deque<help_entry>::const_iterator
|
|
||||||
iter = argHelps_.begin();iter != argHelps_.end();++iter)
|
|
||||||
{
|
|
||||||
os<<'\t'<<iter->first<<std::string(lmax-iter->first.size(),' ')
|
|
||||||
<<" : "<<iter->second<<'\n';
|
|
||||||
}
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
inline std::string
|
|
||||||
argstream::errorLog() const
|
|
||||||
{
|
|
||||||
std::string s;
|
|
||||||
for(std::deque<std::string>::const_iterator iter = errors_.begin();
|
|
||||||
iter != errors_.end();++iter)
|
|
||||||
{
|
|
||||||
s += *iter;
|
|
||||||
s += '\n';
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
inline char
|
|
||||||
argstream::uniqueLetter()
|
|
||||||
{
|
|
||||||
static unsigned int c = 'a';
|
|
||||||
return c++;
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
argstream&
|
|
||||||
operator>>(argstream& s,const ValueHolder<T>& v)
|
|
||||||
{
|
|
||||||
// Search in the options if there is any such option defined either with a
|
|
||||||
// short name or a long name. If both are found, only the last one is
|
|
||||||
// used.
|
|
||||||
#ifdef ARGSTREAM_DEBUG
|
|
||||||
std::cout<<"DEBUG: searching "<<v.shortName_<<" "<<v.longName_<<std::endl;
|
|
||||||
#endif
|
|
||||||
s.argHelps_.push_back(argstream::help_entry(v.name(),v.description()));
|
|
||||||
if (v.mandatory_)
|
|
||||||
{
|
|
||||||
if (!v.shortName_.empty())
|
|
||||||
{
|
|
||||||
s.cmdLine_ += " -";
|
|
||||||
s.cmdLine_ += v.shortName_;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s.cmdLine_ += " --";
|
|
||||||
s.cmdLine_ += v.longName_;
|
|
||||||
}
|
|
||||||
s.cmdLine_ += " value";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!v.shortName_.empty())
|
|
||||||
{
|
|
||||||
s.cmdLine_ += " [-";
|
|
||||||
s.cmdLine_ += v.shortName_;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s.cmdLine_ += " [--";
|
|
||||||
s.cmdLine_ += v.longName_;
|
|
||||||
}
|
|
||||||
s.cmdLine_ += " value]";
|
|
||||||
|
|
||||||
}
|
|
||||||
std::map<std::string,argstream::value_iterator>::iterator iter =
|
|
||||||
s.options_.find(v.shortName_);
|
|
||||||
if (iter == s.options_.end())
|
|
||||||
{
|
|
||||||
iter = s.options_.find(v.longName_);
|
|
||||||
}
|
|
||||||
if (iter != s.options_.end())
|
|
||||||
{
|
|
||||||
// If we find counterpart for value holder on command line, either it
|
|
||||||
// has an associated value in which case we assign it, or it has not, in
|
|
||||||
// which case we have an error.
|
|
||||||
if (iter->second != s.values_.end())
|
|
||||||
{
|
|
||||||
#ifdef ARGSTREAM_DEBUG
|
|
||||||
std::cout<<"DEBUG: found value "<<*(iter->second)<<std::endl;
|
|
||||||
#endif
|
|
||||||
ValueParser<T> p;
|
|
||||||
*(v.value_) = p(*(iter->second));
|
|
||||||
// The option and its associated value are removed, the subtle thing
|
|
||||||
// is that someother options might have this associated value too,
|
|
||||||
// which we must invalidate.
|
|
||||||
s.values_.erase(iter->second);
|
|
||||||
for (std::map<std::string,argstream::value_iterator>::iterator
|
|
||||||
jter = s.options_.begin();jter != s.options_.end();++jter)
|
|
||||||
{
|
|
||||||
if (jter->second == iter->second)
|
|
||||||
{
|
|
||||||
jter->second = s.values_.end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s.options_.erase(iter);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s.isOk_ = false;
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<"No value following switch "<<iter->first
|
|
||||||
<<" on command line";
|
|
||||||
s.errors_.push_back(os.str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (v.mandatory_)
|
|
||||||
{
|
|
||||||
s.isOk_ = false;
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<"Mandatory parameter ";
|
|
||||||
if (!v.shortName_.empty()) os<<'-'<<v.shortName_;
|
|
||||||
if (!v.longName_.empty())
|
|
||||||
{
|
|
||||||
if (!v.shortName_.empty()) os<<'/';
|
|
||||||
os<<"--"<<v.longName_;
|
|
||||||
}
|
|
||||||
os<<" missing";
|
|
||||||
s.errors_.push_back(os.str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
inline argstream&
|
|
||||||
operator>>(argstream& s,const OptionHolder& v)
|
|
||||||
{
|
|
||||||
// Search in the options if there is any such option defined either with a
|
|
||||||
// short name or a long name. If both are found, only the last one is
|
|
||||||
// used.
|
|
||||||
#ifdef ARGSTREAM_DEBUG
|
|
||||||
std::cout<<"DEBUG: searching "<<v.shortName_<<" "<<v.longName_<<std::endl;
|
|
||||||
#endif
|
|
||||||
s.argHelps_.push_back(argstream::help_entry(v.name(),v.description()));
|
|
||||||
{
|
|
||||||
std::string c;
|
|
||||||
if (!v.shortName_.empty())
|
|
||||||
{
|
|
||||||
c += " [-";
|
|
||||||
c += v.shortName_;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
c += " [--";
|
|
||||||
c += v.longName_;
|
|
||||||
}
|
|
||||||
c += "]";
|
|
||||||
s.cmdLine_ = c+s.cmdLine_;
|
|
||||||
}
|
|
||||||
std::map<std::string,argstream::value_iterator>::iterator iter =
|
|
||||||
s.options_.find(v.shortName_);
|
|
||||||
if (iter == s.options_.end())
|
|
||||||
{
|
|
||||||
iter = s.options_.find(v.longName_);
|
|
||||||
}
|
|
||||||
if (iter != s.options_.end())
|
|
||||||
{
|
|
||||||
// If we find counterpart for value holder on command line then the
|
|
||||||
// option is true and if an associated value was found, it is ignored
|
|
||||||
if (v.value_ != NULL)
|
|
||||||
{
|
|
||||||
*(v.value_) = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s.helpRequested_ = true;
|
|
||||||
}
|
|
||||||
// The option only is removed
|
|
||||||
s.options_.erase(iter);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (v.value_ != NULL)
|
|
||||||
{
|
|
||||||
*(v.value_) = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s.helpRequested_ = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
template<class T,class O>
|
|
||||||
argstream&
|
|
||||||
operator>>(argstream& s,const ValuesHolder<T,O>& v)
|
|
||||||
{
|
|
||||||
s.argHelps_.push_back(argstream::help_entry(v.name(),v.description()));
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<' '<<v.letter_<<'1';
|
|
||||||
switch (v.len_)
|
|
||||||
{
|
|
||||||
case -1:
|
|
||||||
os<<"...";
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
os<<"..."<<v.letter_<<v.len_;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
s.cmdLine_ += os.str();
|
|
||||||
}
|
|
||||||
std::list<std::string>::iterator first = s.values_.begin();
|
|
||||||
// We add to the iterator as much values as we can, limited to the length
|
|
||||||
// specified (if different of -1)
|
|
||||||
int n = v.len_ != -1?v.len_:s.values_.size();
|
|
||||||
while (first != s.values_.end() && n-->0)
|
|
||||||
{
|
|
||||||
// Read the value from the string *first
|
|
||||||
ValueParser<T> p;
|
|
||||||
*(v.value_++) = p(*first );
|
|
||||||
s.argHelps_.push_back(argstream::help_entry(v.name(),v.description()));
|
|
||||||
// The value we just removed was maybe "remembered" by an option so we
|
|
||||||
// remove it now.
|
|
||||||
for (std::map<std::string,argstream::value_iterator>::iterator
|
|
||||||
jter = s.options_.begin();jter != s.options_.end();++jter)
|
|
||||||
{
|
|
||||||
if (jter->second == first)
|
|
||||||
{
|
|
||||||
jter->second = s.values_.end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++first;
|
|
||||||
}
|
|
||||||
// Check if we have enough values
|
|
||||||
if (n != 0)
|
|
||||||
{
|
|
||||||
s.isOk_ = false;
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<"Expecting "<<v.len_<<" values";
|
|
||||||
s.errors_.push_back(os.str());
|
|
||||||
}
|
|
||||||
// Erase the values parsed
|
|
||||||
s.values_.erase(s.values_.begin(),first);
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
inline void
|
|
||||||
argstream::defaultErrorHandling(bool ignoreUnused) const
|
|
||||||
{
|
|
||||||
if (helpRequested_)
|
|
||||||
{
|
|
||||||
std::cout<<usage();
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (!isOk_)
|
|
||||||
{
|
|
||||||
std::cerr<<errorLog();
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (!ignoreUnused &&
|
|
||||||
(!values_.empty() || !options_.empty()))
|
|
||||||
{
|
|
||||||
std::cerr<<"Unused arguments"<<std::endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#endif // ARGSTREAM_H
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "argstream.h"
|
#include <common/argstream.h>
|
||||||
//#include <pqi/cleanupxpgp.h>
|
//#include <pqi/cleanupxpgp.h>
|
||||||
#include <retroshare/rspeers.h>
|
#include <retroshare/rspeers.h>
|
||||||
#include <pgp/rscertificate.h>
|
#include <pgp/rscertificate.h>
|
||||||
|
|
|
@ -10,7 +10,7 @@ extern "C"
|
||||||
#include <openpgpsdk/util.h>
|
#include <openpgpsdk/util.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "argstream.h"
|
#include <common/argstream.h>
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
int main(int argc,char *argv[])
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
// COMPILE_LINE: g++ -o test_pgp_handler test_pgp_handler.cc -I../../../openpgpsdk/include -I../ -L../lib -lretroshare ../../../libbitdht/src/lib/libbitdht.a ../../../openpgpsdk/lib/libops.a -lgnome-keyring -lupnp -lssl -lcrypto -lbz2
|
// COMPILE_LINE: g++ -o test_pgp_handler test_pgp_handler.cc -I../../../openpgpsdk/include -I../ -L../lib -lretroshare ../../../libbitdht/src/lib/libbitdht.a ../../../openpgpsdk/lib/libops.a -lgnome-keyring -lupnp -lssl -lcrypto -lbz2
|
||||||
//
|
//
|
||||||
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <pgp/pgphandler.h>
|
#include <pgp/pgphandler.h>
|
||||||
#include "argstream.h"
|
#include <common/argstream.h>
|
||||||
|
|
||||||
static std::string passphrase_callback(void *data,const char *uid_info,const char *what,int prev_was_bad)
|
static std::string passphrase_callback(void *data,const char *uid_info,const char *what,int prev_was_bad)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// COMPILE_LINE: g++ -o test_pgp_signature_parsing test_pgp_signature_parsing.cc -g -I../../../openpgpsdk/include -I../ -L../lib -lretroshare ../../../libbitdht/src/lib/libbitdht.a ../../../openpgpsdk/lib/libops.a -lgnome-keyring -lupnp -lssl -lcrypto -lbz2
|
// COMPILE_LINE: g++ -o test_pgp_signature_parsing test_pgp_signature_parsing.cc -g -I../../../openpgpsdk/include -I../ -L../lib -lretroshare ../../../libbitdht/src/lib/libbitdht.a ../../../openpgpsdk/lib/libops.a -lgnome-keyring -lupnp -lssl -lcrypto -lbz2
|
||||||
//
|
//
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <pgp/pgphandler.h>
|
#include <pgp/pgphandler.h>
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
RS_TOP_DIR = ../..
|
RS_TOP_DIR = ../..
|
||||||
DHT_TOP_DIR = ../../../../libbitdht/src/
|
DHT_TOP_DIR = ../../../../libbitdht/src/
|
||||||
|
OPS_TOP_DIR = ../../../../openpgpsdk/src/
|
||||||
|
|
||||||
##### Define any flags that are needed for this section #######
|
##### Define any flags that are needed for this section #######
|
||||||
###############################################################
|
###############################################################
|
||||||
|
|
|
@ -1,814 +0,0 @@
|
||||||
/* Copyright (C) 2004 Xavier Décoret <Xavier.Decoret@imag.fr>
|
|
||||||
*
|
|
||||||
* argsteam is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Foobar is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with Foobar; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef ARGSTREAM_H
|
|
||||||
#define ARGSTREAM_H
|
|
||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string>
|
|
||||||
#include <list>
|
|
||||||
#include <deque>
|
|
||||||
#include <map>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <sstream>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
class argstream;
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
class ValueHolder;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
argstream& operator>> (argstream&, const ValueHolder<T>&);
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// Interface of ValueHolder<T>
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
template<class T>
|
|
||||||
class ValueHolder
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ValueHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
T& b,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory);
|
|
||||||
ValueHolder(const char* l,
|
|
||||||
T& b,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory);
|
|
||||||
ValueHolder(char s,
|
|
||||||
T& b,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory);
|
|
||||||
friend argstream& operator>><>(argstream& s,const ValueHolder<T>& v);
|
|
||||||
std::string name() const;
|
|
||||||
std::string description() const;
|
|
||||||
private:
|
|
||||||
std::string shortName_;
|
|
||||||
std::string longName_;
|
|
||||||
T* value_;
|
|
||||||
T initialValue_;
|
|
||||||
std::string description_;
|
|
||||||
bool mandatory_;
|
|
||||||
};
|
|
||||||
template <class T>
|
|
||||||
inline ValueHolder<T>
|
|
||||||
parameter(char s,
|
|
||||||
const char* l,
|
|
||||||
T& b,
|
|
||||||
const char* desc="",
|
|
||||||
bool mandatory = true)
|
|
||||||
{
|
|
||||||
return ValueHolder<T>(s,l,b,desc,mandatory);
|
|
||||||
}
|
|
||||||
template <class T>
|
|
||||||
inline ValueHolder<T>
|
|
||||||
parameter(char s,
|
|
||||||
T& b,
|
|
||||||
const char* desc="",
|
|
||||||
bool mandatory = true)
|
|
||||||
{
|
|
||||||
return ValueHolder<T>(s,b,desc,mandatory);
|
|
||||||
}
|
|
||||||
template <class T>
|
|
||||||
inline ValueHolder<T>
|
|
||||||
parameter(const char* l,
|
|
||||||
T& b,
|
|
||||||
const char* desc="",
|
|
||||||
bool mandatory = true)
|
|
||||||
{
|
|
||||||
return ValueHolder<T>(l,b,desc,mandatory);
|
|
||||||
}
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// Interface of OptionHolder
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
class OptionHolder
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline OptionHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc);
|
|
||||||
inline OptionHolder(const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc);
|
|
||||||
inline OptionHolder(char s,
|
|
||||||
bool& b,
|
|
||||||
const char* desc);
|
|
||||||
friend argstream& operator>>(argstream& s,const OptionHolder& v);
|
|
||||||
inline std::string name() const;
|
|
||||||
inline std::string description() const;
|
|
||||||
protected:
|
|
||||||
inline OptionHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
const char* desc);
|
|
||||||
friend OptionHolder help(char s='h',
|
|
||||||
const char* l="help",
|
|
||||||
const char* desc="Display this help");
|
|
||||||
private:
|
|
||||||
std::string shortName_;
|
|
||||||
std::string longName_;
|
|
||||||
bool* value_;
|
|
||||||
std::string description_;
|
|
||||||
};
|
|
||||||
inline OptionHolder
|
|
||||||
option(char s,
|
|
||||||
const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc="")
|
|
||||||
{
|
|
||||||
return OptionHolder(s,l,b,desc);
|
|
||||||
}
|
|
||||||
inline OptionHolder
|
|
||||||
option(char s,
|
|
||||||
bool& b,
|
|
||||||
const char* desc="")
|
|
||||||
{
|
|
||||||
return OptionHolder(s,b,desc);
|
|
||||||
}
|
|
||||||
inline OptionHolder
|
|
||||||
option(const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc="")
|
|
||||||
{
|
|
||||||
return OptionHolder(l,b,desc);
|
|
||||||
}
|
|
||||||
inline OptionHolder
|
|
||||||
help(char s,
|
|
||||||
const char* l,
|
|
||||||
const char* desc)
|
|
||||||
{
|
|
||||||
return OptionHolder(s,l,desc);
|
|
||||||
}
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// Interface of ValuesHolder
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
template<class T,class O>
|
|
||||||
class ValuesHolder
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ValuesHolder(const O& o,
|
|
||||||
const char* desc,
|
|
||||||
int len);
|
|
||||||
template<class A,class B> friend argstream& operator>>(argstream& s,const ValuesHolder<A,B>& v);
|
|
||||||
std::string name() const;
|
|
||||||
std::string description() const;
|
|
||||||
typedef T value_type;
|
|
||||||
private:
|
|
||||||
mutable O value_;
|
|
||||||
std::string description_;
|
|
||||||
int len_;
|
|
||||||
char letter_;
|
|
||||||
};
|
|
||||||
template<class T,class O>
|
|
||||||
inline ValuesHolder<T,O>
|
|
||||||
values(const O& o,
|
|
||||||
const char* desc="",
|
|
||||||
int len=-1)
|
|
||||||
{
|
|
||||||
return ValuesHolder<T,O>(o,desc,len);
|
|
||||||
}
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// Interface of ValueParser
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
template <class T>
|
|
||||||
class ValueParser
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline T operator()(const std::string& s) const
|
|
||||||
{
|
|
||||||
std::istringstream is(s);
|
|
||||||
T t;
|
|
||||||
is>>t;
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
// We need to specialize for string otherwise parsing of a value that
|
|
||||||
// contains space (for example a string with space passed in quotes on the
|
|
||||||
// command line) would parse only the first element of the value!!!
|
|
||||||
template <>
|
|
||||||
class ValueParser<std::string>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline std::string operator()(const std::string& s) const
|
|
||||||
{
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
// Interface of argstream
|
|
||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
class argstream
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
inline argstream(int argc,char** argv);
|
|
||||||
inline argstream(const char* c);
|
|
||||||
template<class T>
|
|
||||||
friend argstream& operator>>(argstream& s,const ValueHolder<T>& v);
|
|
||||||
friend inline argstream& operator>>(argstream& s,const OptionHolder& v);
|
|
||||||
template<class T,class O>
|
|
||||||
friend argstream& operator>>(argstream& s,const ValuesHolder<T,O>& v);
|
|
||||||
|
|
||||||
inline bool helpRequested() const;
|
|
||||||
inline bool isOk() const;
|
|
||||||
inline std::string errorLog() const;
|
|
||||||
inline std::string usage() const;
|
|
||||||
inline void defaultErrorHandling(bool ignoreUnused=false) const;
|
|
||||||
static inline char uniqueLetter();
|
|
||||||
protected:
|
|
||||||
void parse(int argc,char** argv);
|
|
||||||
private:
|
|
||||||
typedef std::list<std::string>::iterator value_iterator;
|
|
||||||
typedef std::pair<std::string,std::string> help_entry;
|
|
||||||
std::string progName_;
|
|
||||||
std::map<std::string,value_iterator> options_;
|
|
||||||
std::list<std::string> values_;
|
|
||||||
bool minusActive_;
|
|
||||||
bool isOk_;
|
|
||||||
std::deque<help_entry> argHelps_;
|
|
||||||
std::string cmdLine_;
|
|
||||||
std::deque<std::string> errors_;
|
|
||||||
bool helpRequested_;
|
|
||||||
};
|
|
||||||
//************************************************************
|
|
||||||
// Implementation of ValueHolder<T>
|
|
||||||
//************************************************************
|
|
||||||
template<class T>
|
|
||||||
ValueHolder<T>::ValueHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
T& v,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory)
|
|
||||||
: shortName_(1,s),
|
|
||||||
longName_(l),
|
|
||||||
value_(&v),
|
|
||||||
initialValue_(v),
|
|
||||||
description_(desc),
|
|
||||||
mandatory_(mandatory)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
ValueHolder<T>::ValueHolder(const char* l,
|
|
||||||
T& v,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory)
|
|
||||||
: longName_(l),
|
|
||||||
value_(&v),
|
|
||||||
initialValue_(v),
|
|
||||||
description_(desc),
|
|
||||||
mandatory_(mandatory)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
ValueHolder<T>::ValueHolder(char s,
|
|
||||||
T& v,
|
|
||||||
const char* desc,
|
|
||||||
bool mandatory)
|
|
||||||
: shortName_(1,s),
|
|
||||||
value_(&v),
|
|
||||||
initialValue_(v),
|
|
||||||
description_(desc),
|
|
||||||
mandatory_(mandatory)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
std::string
|
|
||||||
ValueHolder<T>::name() const
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
if (!shortName_.empty()) os<<'-'<<shortName_;
|
|
||||||
if (!longName_.empty()) {
|
|
||||||
if (!shortName_.empty()) os<<'/';
|
|
||||||
os<<"--"<<longName_;
|
|
||||||
}
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
std::string
|
|
||||||
ValueHolder<T>::description() const
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<description_;
|
|
||||||
if (mandatory_)
|
|
||||||
{
|
|
||||||
os<<"(mandatory)";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
os<<"(default="<<initialValue_<<")";
|
|
||||||
}
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
//************************************************************
|
|
||||||
// Implementation of OptionHolder
|
|
||||||
//************************************************************
|
|
||||||
inline OptionHolder::OptionHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc)
|
|
||||||
: shortName_(1,s),
|
|
||||||
longName_(l),
|
|
||||||
value_(&b),
|
|
||||||
description_(desc)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
inline OptionHolder::OptionHolder(const char* l,
|
|
||||||
bool& b,
|
|
||||||
const char* desc)
|
|
||||||
: longName_(l),
|
|
||||||
value_(&b),
|
|
||||||
description_(desc)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
inline OptionHolder::OptionHolder(char s,
|
|
||||||
bool& b,
|
|
||||||
const char* desc)
|
|
||||||
: shortName_(1,s),
|
|
||||||
value_(&b),
|
|
||||||
description_(desc)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
inline OptionHolder::OptionHolder(char s,
|
|
||||||
const char* l,
|
|
||||||
const char* desc)
|
|
||||||
: shortName_(1,s),
|
|
||||||
longName_(l),
|
|
||||||
value_(NULL),
|
|
||||||
description_(desc)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
inline std::string
|
|
||||||
OptionHolder::name() const
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
if (!shortName_.empty()) os<<'-'<<shortName_;
|
|
||||||
if (!longName_.empty())
|
|
||||||
{
|
|
||||||
if (!shortName_.empty()) os<<'/';
|
|
||||||
os<<"--"<<longName_;
|
|
||||||
}
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
inline std::string
|
|
||||||
OptionHolder::description() const
|
|
||||||
{
|
|
||||||
return description_;
|
|
||||||
}
|
|
||||||
//************************************************************
|
|
||||||
// Implementation of ValuesHolder<T,O>
|
|
||||||
//************************************************************
|
|
||||||
template<class T,class O>
|
|
||||||
ValuesHolder<T,O>::ValuesHolder(const O& o,
|
|
||||||
const char* desc,
|
|
||||||
int len)
|
|
||||||
: value_(o),
|
|
||||||
description_(desc),
|
|
||||||
len_(len)
|
|
||||||
{
|
|
||||||
letter_ = argstream::uniqueLetter();
|
|
||||||
}
|
|
||||||
template <class T,class O>
|
|
||||||
std::string
|
|
||||||
ValuesHolder<T,O>::name() const
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<letter_<<"i";
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
template <class T,class O>
|
|
||||||
std::string
|
|
||||||
ValuesHolder<T,O>::description() const
|
|
||||||
{
|
|
||||||
return description_;
|
|
||||||
}
|
|
||||||
//************************************************************
|
|
||||||
// Implementation of argstream
|
|
||||||
//************************************************************
|
|
||||||
inline
|
|
||||||
argstream::argstream(int argc,char** argv)
|
|
||||||
: progName_(argv[0]),
|
|
||||||
minusActive_(true),
|
|
||||||
isOk_(true)
|
|
||||||
{
|
|
||||||
parse(argc,argv);
|
|
||||||
}
|
|
||||||
inline
|
|
||||||
argstream::argstream(const char* c)
|
|
||||||
: progName_(""),
|
|
||||||
minusActive_(true),
|
|
||||||
isOk_(true)
|
|
||||||
{
|
|
||||||
std::string s(c);
|
|
||||||
// Build argc, argv from s. We must add a dummy first element for
|
|
||||||
// progName because parse() expects it!!
|
|
||||||
std::deque<std::string> args;
|
|
||||||
args.push_back("");
|
|
||||||
std::istringstream is(s);
|
|
||||||
while (is.good())
|
|
||||||
{
|
|
||||||
std::string t;
|
|
||||||
is>>t;
|
|
||||||
args.push_back(t);
|
|
||||||
}
|
|
||||||
char* pargs[args.size()];
|
|
||||||
char** p = pargs;
|
|
||||||
for (std::deque<std::string>::const_iterator
|
|
||||||
iter = args.begin();
|
|
||||||
iter != args.end();++iter)
|
|
||||||
{
|
|
||||||
*p++ = const_cast<char*>(iter->c_str());
|
|
||||||
}
|
|
||||||
parse(args.size(),pargs);
|
|
||||||
}
|
|
||||||
inline void
|
|
||||||
argstream::parse(int argc,char** argv)
|
|
||||||
{
|
|
||||||
// Run thru all arguments.
|
|
||||||
// * it has -- in front : it is a long name option, if remainder is empty,
|
|
||||||
// it is an error
|
|
||||||
// * it has - in front : it is a sequence of short name options, if
|
|
||||||
// remainder is empty, deactivates option (- will
|
|
||||||
// now be considered a char).
|
|
||||||
// * if any other char, or if option was deactivated
|
|
||||||
// : it is a value. Values are split in parameters
|
|
||||||
// (immediately follow an option) and pure values.
|
|
||||||
// Each time a value is parsed, if the previously parsed argument was an
|
|
||||||
// option, then the option is linked to the value in case of it is a
|
|
||||||
// option with parameter. The subtle point is that when several options
|
|
||||||
// are given with short names (ex: -abc equivalent to -a -b -c), the last
|
|
||||||
// parsed option is -c).
|
|
||||||
// Since we use map for option, any successive call overides the previous
|
|
||||||
// one: foo -a -b -a hello is equivalent to foo -b -a hello
|
|
||||||
// For values it is not true since we might have several times the same
|
|
||||||
// value.
|
|
||||||
value_iterator* lastOption = NULL;
|
|
||||||
for (char** a = argv,**astop=a+argc;++a!=astop;)
|
|
||||||
{
|
|
||||||
std::string s(*a);
|
|
||||||
if (minusActive_ && s[0] == '-')
|
|
||||||
{
|
|
||||||
if (s.size() > 1 && s[1] == '-')
|
|
||||||
{
|
|
||||||
if (s.size() == 2)
|
|
||||||
{
|
|
||||||
minusActive_ = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
lastOption = &(options_[s.substr(2)] = values_.end());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (s.size() > 1)
|
|
||||||
{
|
|
||||||
// Parse all chars, if it is a minus we have an error
|
|
||||||
for (std::string::const_iterator cter = s.begin();
|
|
||||||
++cter != s.end();)
|
|
||||||
{
|
|
||||||
if (*cter == '-')
|
|
||||||
{
|
|
||||||
isOk_ = false;
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<"- in the middle of a switch "<<a;
|
|
||||||
errors_.push_back(os.str());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
lastOption = &(options_[std::string(1,*cter)] = values_.end());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
isOk_ = false;
|
|
||||||
errors_.push_back("Invalid argument -");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
values_.push_back(s);
|
|
||||||
if (lastOption != NULL)
|
|
||||||
{
|
|
||||||
*lastOption = --values_.end();
|
|
||||||
}
|
|
||||||
lastOption = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef ARGSTREAM_DEBUG
|
|
||||||
for (std::map<std::string,value_iterator>::const_iterator
|
|
||||||
iter = options_.begin();iter != options_.end();++iter)
|
|
||||||
{
|
|
||||||
std::cout<<"DEBUG: option "<<iter->first;
|
|
||||||
if (iter->second != values_.end())
|
|
||||||
{
|
|
||||||
std::cout<<" -> "<<*(iter->second);
|
|
||||||
}
|
|
||||||
std::cout<<std::endl;
|
|
||||||
}
|
|
||||||
for (std::list<std::string>::const_iterator
|
|
||||||
iter = values_.begin();iter != values_.end();++iter)
|
|
||||||
{
|
|
||||||
std::cout<<"DEBUG: value "<<*iter<<std::endl;
|
|
||||||
}
|
|
||||||
#endif // ARGSTREAM_DEBUG
|
|
||||||
}
|
|
||||||
inline bool
|
|
||||||
argstream::isOk() const
|
|
||||||
{
|
|
||||||
return isOk_;
|
|
||||||
}
|
|
||||||
inline bool
|
|
||||||
argstream::helpRequested() const
|
|
||||||
{
|
|
||||||
return helpRequested_;
|
|
||||||
}
|
|
||||||
inline std::string
|
|
||||||
argstream::usage() const
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<"usage: "<<progName_<<cmdLine_<<'\n';
|
|
||||||
unsigned int lmax = 0;
|
|
||||||
for (std::deque<help_entry>::const_iterator
|
|
||||||
iter = argHelps_.begin();iter != argHelps_.end();++iter)
|
|
||||||
{
|
|
||||||
if (lmax<iter->first.size()) lmax = iter->first.size();
|
|
||||||
}
|
|
||||||
for (std::deque<help_entry>::const_iterator
|
|
||||||
iter = argHelps_.begin();iter != argHelps_.end();++iter)
|
|
||||||
{
|
|
||||||
os<<'\t'<<iter->first<<std::string(lmax-iter->first.size(),' ')
|
|
||||||
<<" : "<<iter->second<<'\n';
|
|
||||||
}
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
inline std::string
|
|
||||||
argstream::errorLog() const
|
|
||||||
{
|
|
||||||
std::string s;
|
|
||||||
for(std::deque<std::string>::const_iterator iter = errors_.begin();
|
|
||||||
iter != errors_.end();++iter)
|
|
||||||
{
|
|
||||||
s += *iter;
|
|
||||||
s += '\n';
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
inline char
|
|
||||||
argstream::uniqueLetter()
|
|
||||||
{
|
|
||||||
static unsigned int c = 'a';
|
|
||||||
return c++;
|
|
||||||
}
|
|
||||||
template<class T>
|
|
||||||
argstream&
|
|
||||||
operator>>(argstream& s,const ValueHolder<T>& v)
|
|
||||||
{
|
|
||||||
// Search in the options if there is any such option defined either with a
|
|
||||||
// short name or a long name. If both are found, only the last one is
|
|
||||||
// used.
|
|
||||||
#ifdef ARGSTREAM_DEBUG
|
|
||||||
std::cout<<"DEBUG: searching "<<v.shortName_<<" "<<v.longName_<<std::endl;
|
|
||||||
#endif
|
|
||||||
s.argHelps_.push_back(argstream::help_entry(v.name(),v.description()));
|
|
||||||
if (v.mandatory_)
|
|
||||||
{
|
|
||||||
if (!v.shortName_.empty())
|
|
||||||
{
|
|
||||||
s.cmdLine_ += " -";
|
|
||||||
s.cmdLine_ += v.shortName_;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s.cmdLine_ += " --";
|
|
||||||
s.cmdLine_ += v.longName_;
|
|
||||||
}
|
|
||||||
s.cmdLine_ += " value";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!v.shortName_.empty())
|
|
||||||
{
|
|
||||||
s.cmdLine_ += " [-";
|
|
||||||
s.cmdLine_ += v.shortName_;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s.cmdLine_ += " [--";
|
|
||||||
s.cmdLine_ += v.longName_;
|
|
||||||
}
|
|
||||||
s.cmdLine_ += " value]";
|
|
||||||
|
|
||||||
}
|
|
||||||
std::map<std::string,argstream::value_iterator>::iterator iter =
|
|
||||||
s.options_.find(v.shortName_);
|
|
||||||
if (iter == s.options_.end())
|
|
||||||
{
|
|
||||||
iter = s.options_.find(v.longName_);
|
|
||||||
}
|
|
||||||
if (iter != s.options_.end())
|
|
||||||
{
|
|
||||||
// If we find counterpart for value holder on command line, either it
|
|
||||||
// has an associated value in which case we assign it, or it has not, in
|
|
||||||
// which case we have an error.
|
|
||||||
if (iter->second != s.values_.end())
|
|
||||||
{
|
|
||||||
#ifdef ARGSTREAM_DEBUG
|
|
||||||
std::cout<<"DEBUG: found value "<<*(iter->second)<<std::endl;
|
|
||||||
#endif
|
|
||||||
ValueParser<T> p;
|
|
||||||
*(v.value_) = p(*(iter->second));
|
|
||||||
// The option and its associated value are removed, the subtle thing
|
|
||||||
// is that someother options might have this associated value too,
|
|
||||||
// which we must invalidate.
|
|
||||||
s.values_.erase(iter->second);
|
|
||||||
for (std::map<std::string,argstream::value_iterator>::iterator
|
|
||||||
jter = s.options_.begin();jter != s.options_.end();++jter)
|
|
||||||
{
|
|
||||||
if (jter->second == iter->second)
|
|
||||||
{
|
|
||||||
jter->second = s.values_.end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s.options_.erase(iter);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s.isOk_ = false;
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<"No value following switch "<<iter->first
|
|
||||||
<<" on command line";
|
|
||||||
s.errors_.push_back(os.str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (v.mandatory_)
|
|
||||||
{
|
|
||||||
s.isOk_ = false;
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<"Mandatory parameter ";
|
|
||||||
if (!v.shortName_.empty()) os<<'-'<<v.shortName_;
|
|
||||||
if (!v.longName_.empty())
|
|
||||||
{
|
|
||||||
if (!v.shortName_.empty()) os<<'/';
|
|
||||||
os<<"--"<<v.longName_;
|
|
||||||
}
|
|
||||||
os<<" missing";
|
|
||||||
s.errors_.push_back(os.str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
inline argstream&
|
|
||||||
operator>>(argstream& s,const OptionHolder& v)
|
|
||||||
{
|
|
||||||
// Search in the options if there is any such option defined either with a
|
|
||||||
// short name or a long name. If both are found, only the last one is
|
|
||||||
// used.
|
|
||||||
#ifdef ARGSTREAM_DEBUG
|
|
||||||
std::cout<<"DEBUG: searching "<<v.shortName_<<" "<<v.longName_<<std::endl;
|
|
||||||
#endif
|
|
||||||
s.argHelps_.push_back(argstream::help_entry(v.name(),v.description()));
|
|
||||||
{
|
|
||||||
std::string c;
|
|
||||||
if (!v.shortName_.empty())
|
|
||||||
{
|
|
||||||
c += " [-";
|
|
||||||
c += v.shortName_;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
c += " [--";
|
|
||||||
c += v.longName_;
|
|
||||||
}
|
|
||||||
c += "]";
|
|
||||||
s.cmdLine_ = c+s.cmdLine_;
|
|
||||||
}
|
|
||||||
std::map<std::string,argstream::value_iterator>::iterator iter =
|
|
||||||
s.options_.find(v.shortName_);
|
|
||||||
if (iter == s.options_.end())
|
|
||||||
{
|
|
||||||
iter = s.options_.find(v.longName_);
|
|
||||||
}
|
|
||||||
if (iter != s.options_.end())
|
|
||||||
{
|
|
||||||
// If we find counterpart for value holder on command line then the
|
|
||||||
// option is true and if an associated value was found, it is ignored
|
|
||||||
if (v.value_ != NULL)
|
|
||||||
{
|
|
||||||
*(v.value_) = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s.helpRequested_ = true;
|
|
||||||
}
|
|
||||||
// The option only is removed
|
|
||||||
s.options_.erase(iter);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (v.value_ != NULL)
|
|
||||||
{
|
|
||||||
*(v.value_) = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
s.helpRequested_ = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
template<class T,class O>
|
|
||||||
argstream&
|
|
||||||
operator>>(argstream& s,const ValuesHolder<T,O>& v)
|
|
||||||
{
|
|
||||||
s.argHelps_.push_back(argstream::help_entry(v.name(),v.description()));
|
|
||||||
{
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<' '<<v.letter_<<'1';
|
|
||||||
switch (v.len_)
|
|
||||||
{
|
|
||||||
case -1:
|
|
||||||
os<<"...";
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
os<<"..."<<v.letter_<<v.len_;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
s.cmdLine_ += os.str();
|
|
||||||
}
|
|
||||||
std::list<std::string>::iterator first = s.values_.begin();
|
|
||||||
// We add to the iterator as much values as we can, limited to the length
|
|
||||||
// specified (if different of -1)
|
|
||||||
int n = v.len_ != -1?v.len_:s.values_.size();
|
|
||||||
while (first != s.values_.end() && n-->0)
|
|
||||||
{
|
|
||||||
// Read the value from the string *first
|
|
||||||
ValueParser<T> p;
|
|
||||||
*(v.value_++) = p(*first );
|
|
||||||
s.argHelps_.push_back(argstream::help_entry(v.name(),v.description()));
|
|
||||||
// The value we just removed was maybe "remembered" by an option so we
|
|
||||||
// remove it now.
|
|
||||||
for (std::map<std::string,argstream::value_iterator>::iterator
|
|
||||||
jter = s.options_.begin();jter != s.options_.end();++jter)
|
|
||||||
{
|
|
||||||
if (jter->second == first)
|
|
||||||
{
|
|
||||||
jter->second = s.values_.end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++first;
|
|
||||||
}
|
|
||||||
// Check if we have enough values
|
|
||||||
if (n != 0)
|
|
||||||
{
|
|
||||||
s.isOk_ = false;
|
|
||||||
std::ostringstream os;
|
|
||||||
os<<"Expecting "<<v.len_<<" values";
|
|
||||||
s.errors_.push_back(os.str());
|
|
||||||
}
|
|
||||||
// Erase the values parsed
|
|
||||||
s.values_.erase(s.values_.begin(),first);
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
inline void
|
|
||||||
argstream::defaultErrorHandling(bool ignoreUnused) const
|
|
||||||
{
|
|
||||||
if (helpRequested_)
|
|
||||||
{
|
|
||||||
std::cout<<usage();
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (!isOk_)
|
|
||||||
{
|
|
||||||
std::cerr<<errorLog();
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (!ignoreUnused &&
|
|
||||||
(!values_.empty() || !options_.empty()))
|
|
||||||
{
|
|
||||||
std::cerr<<"Unused arguments"<<std::endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#endif // ARGSTREAM_H
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "argstream.h"
|
#include <common/argstream.h>
|
||||||
#include "pqi/pqistreamer.h"
|
#include "pqi/pqistreamer.h"
|
||||||
#include "pqi/pqibin.h"
|
#include "pqi/pqibin.h"
|
||||||
#include "serialiser/rsdistribitems.h"
|
#include "serialiser/rsdistribitems.h"
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "argstream.h"
|
#include <common/argstream.h>
|
||||||
#include "pqi/pqistreamer.h"
|
#include "pqi/pqistreamer.h"
|
||||||
#include "pqi/pqibin.h"
|
#include "pqi/pqibin.h"
|
||||||
#include "serialiser/rsdistribitems.h"
|
#include "serialiser/rsdistribitems.h"
|
||||||
|
|
|
@ -4,11 +4,12 @@ CONFIG = debug
|
||||||
#SOURCES = main.cpp
|
#SOURCES = main.cpp
|
||||||
SOURCES = main_extended.cpp
|
SOURCES = main_extended.cpp
|
||||||
|
|
||||||
INCLUDEPATH *= ../..
|
LIBS += ../../lib/libretroshare.a ../../../../libbitdht/src/lib/libbitdht.a ../../../../openpgpsdk/src/lib/libops.a
|
||||||
|
LIBS += -lssl -lcrypto -lupnp -lgnome-keyring -lixml -lbz2
|
||||||
|
|
||||||
|
INCLUDEPATH *= ../.. ..
|
||||||
linux {
|
linux {
|
||||||
#LIBS = -lstdc++ -lm
|
#LIBS = -lstdc++ -lm
|
||||||
LIBS += ../../lib/libretroshare.a ../../../../libbitdht/src/lib/libbitdht.a
|
|
||||||
LIBS += -lssl -lcrypto -lgpgme -lupnp -lgnome-keyring
|
|
||||||
}
|
}
|
||||||
macx {
|
macx {
|
||||||
# ENABLE THIS OPTION FOR Univeral Binary BUILD.
|
# ENABLE THIS OPTION FOR Univeral Binary BUILD.
|
||||||
|
|
|
@ -22,11 +22,12 @@ RM = /bin/rm
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
LIBDIR = $(RS_TOP_DIR)/lib
|
LIBDIR = $(RS_TOP_DIR)/lib
|
||||||
BITDIR = $(DHT_TOP_DIR)/lib
|
BITDIR = $(DHT_TOP_DIR)/lib
|
||||||
|
OPSDIR = $(OPS_TOP_DIR)/lib
|
||||||
LIBRS = $(LIBDIR)/libretroshare.a
|
LIBRS = $(LIBDIR)/libretroshare.a
|
||||||
BITDHT = $(BITDIR)/libbitdht.a
|
BITDHT = $(BITDIR)/libbitdht.a
|
||||||
# Unix: Linux/Cygwin
|
# Unix: Linux/Cygwin
|
||||||
INCLUDE = -I $(RS_TOP_DIR) -I$(OPENPGP_INCLUDE_DIR)
|
INCLUDE = -I $(RS_TOP_DIR) -I$(OPENPGP_INCLUDE_DIR)
|
||||||
CFLAGS = -Wall -g $(INCLUDE)
|
CFLAGS = -Wall -g $(INCLUDE) -I..
|
||||||
#CFLAGS += -fprofile-arcs -ftest-coverage
|
#CFLAGS += -fprofile-arcs -ftest-coverage
|
||||||
CFLAGS += ${DEFINES}
|
CFLAGS += ${DEFINES}
|
||||||
|
|
||||||
|
@ -58,8 +59,11 @@ BIOCFLAGS = -I $(SSL_DIR)/include ${DEFINES} -DOPENSSL_THREADS -D_REENTRANT -DD
|
||||||
# OS specific Linking.
|
# OS specific Linking.
|
||||||
#########################################################################
|
#########################################################################
|
||||||
|
|
||||||
LIBS = -lgpgme -L$(LIBDIR) -lretroshare
|
LIBS = -L$(LIBDIR) -lretroshare
|
||||||
LIBS += -L$(BITDIR) -lbitdht -lgnome-keyring
|
LIBS += -L$(BITDIR) -lbitdht -lgnome-keyring
|
||||||
|
LIBS += -L$(OPSDIR) -lops
|
||||||
|
LIBS += -lixml -lbz2
|
||||||
|
|
||||||
ifdef PQI_USE_XPGP
|
ifdef PQI_USE_XPGP
|
||||||
LIBS += -L$(SSL_DIR)
|
LIBS += -L$(SSL_DIR)
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -40,6 +40,7 @@ RANLIB = ranlib
|
||||||
# Dummy ranlib -> can't do it until afterwards with universal binaries.
|
# Dummy ranlib -> can't do it until afterwards with universal binaries.
|
||||||
# RANLIB = ls -l
|
# RANLIB = ls -l
|
||||||
|
|
||||||
|
OPSDIR = $(OPS_TOP_DIR)/lib
|
||||||
BITDIR = $(DHT_TOP_DIR)/lib
|
BITDIR = $(DHT_TOP_DIR)/lib
|
||||||
LIBDIR = $(RS_TOP_DIR)/lib
|
LIBDIR = $(RS_TOP_DIR)/lib
|
||||||
LIBRS = $(LIBDIR)/libretroshare.a
|
LIBRS = $(LIBDIR)/libretroshare.a
|
||||||
|
@ -83,8 +84,9 @@ LIBS = -Wl,-search_paths_first
|
||||||
# LIBS += -arch ppc -arch i386
|
# LIBS += -arch ppc -arch i386
|
||||||
#LIBS += -Wl,-syslibroot,/Developer/SDKs/MacOSX10.5u.sdk
|
#LIBS += -Wl,-syslibroot,/Developer/SDKs/MacOSX10.5u.sdk
|
||||||
|
|
||||||
LIBS = -lgpgme -L$(LIBDIR) -lretroshare
|
LIBS = -L$(LIBDIR) -lretroshare
|
||||||
LIBS += -L$(BITDIR) -lbitdht
|
LIBS += -L$(BITDIR) -lbitdht
|
||||||
|
LIBS += -L$(OPSDIR) -lops
|
||||||
ifdef PQI_USE_XPGP
|
ifdef PQI_USE_XPGP
|
||||||
LIBS += -L$(SSL_DIR)
|
LIBS += -L$(SSL_DIR)
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
RS_TOP_DIR = ../..
|
RS_TOP_DIR = ../..
|
||||||
DHT_TOP_DIR = ../../../../libbitdht/src
|
DHT_TOP_DIR = ../../../../libbitdht/src
|
||||||
|
OPS_TOP_DIR = ../../../../openpgpsdk/src
|
||||||
|
|
||||||
##### Define any flags that are needed for this section #######
|
##### Define any flags that are needed for this section #######
|
||||||
###############################################################
|
###############################################################
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
|
|
||||||
RS_TOP_DIR = ../..
|
RS_TOP_DIR = ../..
|
||||||
DHT_TOP_DIR = ../../../../libbitdht/src
|
DHT_TOP_DIR = ../../../../libbitdht/src
|
||||||
|
OPS_TOP_DIR = ../../../../openpgpsdk/src
|
||||||
|
|
||||||
##### Define any flags that are needed for this section #######
|
##### Define any flags that are needed for this section #######
|
||||||
###############################################################
|
###############################################################
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
RS_TOP_DIR = ../..
|
RS_TOP_DIR = ../..
|
||||||
DHT_TOP_DIR = ../../../../libbitdht/src
|
DHT_TOP_DIR = ../../../../libbitdht/src
|
||||||
|
OPS_TOP_DIR = ../../../../openpgpsdk/src
|
||||||
##### Define any flags that are needed for this section #######
|
##### Define any flags that are needed for this section #######
|
||||||
###############################################################
|
###############################################################
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
RS_TOP_DIR = ../..
|
RS_TOP_DIR = ../..
|
||||||
DHT_TOP_DIR = ../../../../libbitdht/src
|
DHT_TOP_DIR = ../../../../libbitdht/src
|
||||||
|
OPS_TOP_DIR = ../../../../openpgpsdk/src
|
||||||
##### Define any flags that are needed for this section #######
|
##### Define any flags that are needed for this section #######
|
||||||
###############################################################
|
###############################################################
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,8 @@ bool testRsDirUtils(std::string path)
|
||||||
std::string root = RsDirUtil::getRootDir(path);
|
std::string root = RsDirUtil::getRootDir(path);
|
||||||
std::string topdirs = RsDirUtil::removeRootDir(path);
|
std::string topdirs = RsDirUtil::removeRootDir(path);
|
||||||
std::string topdirs2 = RsDirUtil::removeRootDirs(path, root);
|
std::string topdirs2 = RsDirUtil::removeRootDirs(path, root);
|
||||||
std::string restdirs = RsDirUtil::removeTopDir(path);
|
std::string restdirs ;
|
||||||
|
RsDirUtil::removeTopDir(path,restdirs);
|
||||||
std::list<std::string> split;
|
std::list<std::string> split;
|
||||||
std::list<std::string>::iterator it;
|
std::list<std::string>::iterator it;
|
||||||
RsDirUtil::breakupDirList(path, split);
|
RsDirUtil::breakupDirList(path, split);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue