View previous topic :: View next topic |
Author |
Message |
gyll
Joined: 29 Oct 2014 Posts: 2
|
Posted: Wed Oct 29, 2014 11:58 am Post subject: Simple Source Files Package for Qt Creator |
|
|
Can somebody create a simple source files package containing all the miniupnpc {cpp/h} files which i can just add to a Qt Creator project, PLUS a wrapper function over the whole thing with EXACTLY the interface which is provided by the command line executable? This would be of an IMMENSE HELP for people (like me) who don't have the time/knowledge to figure out how to compile miniupnpc and use all the detailed interfaces that miniupnpc provides.
Just to make it as clear as i can: i'd like to just grab the miniupnpc files, add them to my project in Qt Creator, and then have a unique function that i can use e.g. "int miniupnpc_cmdline(char *command_string, char *stdout_buffer, char* stderr_buffer)" which will provide me with the miniupnpc command line set of commands (or, why not, with an extended set), and which would return the command's result.
PS
I tried to make such a function myself but didn't make it (apparently i'm not as smart as i thought i was), so i eventually wound up creating an object which simply invokes the windows executable, but the problem with this approach, apart from its lack in implementation elegance, is that it also lacks elegance at execution, i.e. it pops up that console window at every miniupnpc operation, which obviously looks pretty nasty and totally unprofessional... |
|
Back to top |
|
 |
miniupnp Site Admin
Joined: 14 Apr 2007 Posts: 1594
|
Posted: Thu Oct 30, 2014 8:46 am Post subject: |
|
|
you should have a look at functions in upnpcommands.h and miniupnpc.h
Code: |
int error = 0;
struct UPNPDev * devlist = 0;
struct UPNPDev * device;
struct UPNPUrls urls;
struct IGDdatas data;
int r;
devlist = upnpDiscover(2000, NULL/*multicastif*/, NULL/*minissdpdpath*/,
0/*sameport*/, 0/*ipv6*/, &error)
if(devlist) {
r = UPNP_GetValidIGD(devlist, &urls, &data, NULL, 0);
if(r == 1) {
// valid IGD !
// run commands from upnpcommands.h
//example:
r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, 12345, 12345, "192.168.1.123", "my port mapping", "TCP", 0, 0);
if(r != UPNPCOMMAND_SUCCESS) {
// error calling AddPortMapping
}
} else {
// not valid IGD
}
FreeUPNPUrls(&urls);
freeUPNPDevlist(devlist);
} else {
// no device found
}
|
_________________ Main miniUPnP author.
https://miniupnp.tuxfamily.org/ |
|
Back to top |
|
 |
gyll
Joined: 29 Oct 2014 Posts: 2
|
Posted: Thu Oct 30, 2014 2:25 pm Post subject: |
|
|
First of all, thanks a lot for the reply, you have been very kind to take your time and actually show me a piece of sample code that i can use.
However, when i untarred the tarball, added all the c and h files to a Qt Creator project on windows, and hit "build", it did not build, it came up with various errors.
In any case, I now realize that i will most likely never use miniupnpc (except for testing purposes) because it is obviously not intended to be easily portable with proper encapsulation of the low-level functions so that i can re-implement them for multiple platforms (e.g. i was expecting to find in the source code a "miniupnpc::TcpClientSocket" object with a minimalistic API that i can re-implement easily on any platform that supports TCP connections, etc), so i will probably have to start writing my own upnp client.
For example, i am now writing a cross-platform library with networking, multi-threading, and file system modules, which provides objects for each task, and it allows users to easily re-implement the interfaces for their target platforms. I am using the low-level functionality provided by the Qt framework in my implementation (which by itself makes it portable on win/osx/lin/android/ios/winphone), but users can write their own implementations if they wish to.
E.g. my filesystem module declares a "Sandbox" class with a minimalistic API like this:
Code: |
namespace POSIF_Lib_Implementation {class Sandbox;}
namespace POSIF_Lib {
std::string getUserDataDirPath();
std::string getUserTempDirPath();
std::string getWorkingDirPath();
class Sandbox { // operations are allowed only inside the Sanbox' path
POSIF_Lib_Implementation::Sandbox* sandbox;
public:
Sandbox() = delete;
Sandbox(std::string absolutePath);
~Sandbox();
std::string path();
bool MakeDir(std::string dirName);
bool isDir(std::string dirName);
bool RenameDir(std::string oldFileName, std::string newFileName);
bool DeleteDir(std::string dirName, int forceDelete=0); // must pass DELNONEMPTYDIR in order to [recursively] delete a non-empty directory
bool ReadDir(std::string dirName, std::set<std::string>& files);
bool isFile(std::string fileName);
bool ReadFile(std::string fileName, std::string& data, int* errc=nullptr);
bool ReadFileRecord(std::string fileName, std::string& data, int recordOffset, int recordSize, int* errc=nullptr);
bool WriteFile(std::string fileName, const std::string& data, int* errc=nullptr);
bool WriteFileRecord(std::string fileName, const std::string& data, int recordOffset, int recordSize, int* errc=nullptr);
bool WriteFileAppend(std::string fileName, const std::string& data, int* errc=nullptr);
bool RenameFile(std::string oldFileName, std::string newFileName);
bool DeleteFile(std::string fileName);
};
}
|
Again, thank you very much for your prompt reply!
PS
A wild idea: since you have become an expert in upnp, maybe you can write a upnp client on top of Qt (i.e. using Qt's sockets etc, such that is is natively cross-platform on all platforms supported by Qt)? This would be really something. |
|
Back to top |
|
 |
miniupnp Site Admin
Joined: 14 Apr 2007 Posts: 1594
|
Posted: Thu Oct 30, 2014 7:07 pm Post subject: |
|
|
Quote: | However, when i untarred the tarball, added all the c and h files to a Qt Creator project on windows, and hit "build", it did not build, it came up with various errors. |
It should build under linux. Maybe you included too much .c files, like the ones for test executables or Python module.
Files for miniupnpc library are :
LIBOBJS = miniwget.o minixml.o igd_desc_parse.o minisoap.o \
miniupnpc.o upnpreplyparse.o upnpcommands.o upnperrors.o \
connecthostport.o portlistingparse.o receivedata.o
However it may be easier to use the compiled library. see http://mayaposch.wordpress.com/2011/09/18/setting-up-miniupnpc-with-qt/
Quote: | In any case, I now realize that i will most likely never use miniupnpc (except for testing purposes) because it is obviously not intended to be easily portable with proper encapsulation of the low-level functions so that i can re-implement them for multiple platforms (e.g. i was expecting to find in the source code a "miniupnpc::TcpClientSocket" object with a minimalistic API that i can re-implement easily on any platform that supports TCP connections, etc), so i will probably have to start writing my own upnp client. |
miniupnpc is ANSI C, not C++ !
However, it is always possible to call C function from C++
You can do a C++ object to wrap call to the C functions.
I have no time to reimplement miniupnpc for Qt (using Qt sockets, etc.)
I had the project to do an "asynchronous" version using libevent, but never had time to complete this... _________________ Main miniUPnP author.
https://miniupnp.tuxfamily.org/ |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
© 2007 Thomas Bernard, author of MiniUPNP.
|