ReactOS Package Manager
[reactos.git] / rosapps / packmgr / lib / download.cpp
diff --git a/rosapps/packmgr/lib/download.cpp b/rosapps/packmgr/lib/download.cpp
new file mode 100644 (file)
index 0000000..6528ae5
--- /dev/null
@@ -0,0 +1,117 @@
+////////////////////////////////////////////////////////\r
+//\r
+// download.cpp\r
+// \r
+// Stuff related to downloading\r
+//\r
+//\r
+// Maarten Bosma, 09.01.2004\r
+// maarten.paul@bosma.de\r
+//\r
+////////////////////////////////////////////////////////\r
+\r
+#include "package.hpp"\r
+#include "expat.h"\r
+#include "log.h"\r
+#include <wine/urlmon.h>\r
+\r
+// Server there all the files lie\r
+const char* tree_server = "http://svn.reactos.com/viewcvs/*checkout*/trunk/rosapps/packmgr/tree/"; \r
+\r
+HRESULT WINAPI URLDownloadToFileA(      \r
+    LPUNKNOWN pCaller,\r
+    LPCSTR szURL,\r
+    LPCSTR szFileName,\r
+    DWORD dwReserved,\r
+    LPBINDSTATUSCALLBACK lpfnCB\r
+);\r
+\r
+\r
+// Download a file\r
+char* PML_Download (const char* name, const char* local_name = "packmgr.txt", const char* server = tree_server, BOOL totemp = TRUE) \r
+{\r
+       char url [MAX_PATH];\r
+       static char path [MAX_PATH]; \r
+\r
+       // get temp dir\r
+       if(totemp)\r
+               GetTempPathA (200, path);\r
+       \r
+       // create the local file name\r
+       if(local_name)\r
+               strcat(path, local_name);\r
+       else\r
+               strcat(path, "tmp.tmp"); \r
+\r
+       // get the url\r
+       if(server) strcpy(url, server);\r
+       strcat(url, name);\r
+       \r
+       // make sure there is no old file\r
+       DeleteFileA (path);     \r
+\r
+       // download the file\r
+       if(URLDownloadToFileA (NULL, url, path, 0, NULL) != S_OK)\r
+       {\r
+               Log("!  ERROR: Unable to download ");\r
+               LogAdd(url);\r
+\r
+               return NULL;\r
+       }\r
+\r
+       return path;\r
+}\r
+\r
+// Download and prozess a xml file\r
+int PML_XmlDownload (const char* url, void* usrdata, XML_StartElementHandler start, \r
+                                                XML_EndElementHandler end, XML_CharacterDataHandler text) \r
+{\r
+       char buffer[255];\r
+       int done = 0;\r
+\r
+       // logging\r
+       Log("*  prozess the xml file: ");\r
+       LogAdd(url);\r
+\r
+       // download the file\r
+       char* filename = PML_Download(url);\r
+\r
+       if(!filename) \r
+       {\r
+               Log("!  ERROR: Could not download the xml file");\r
+               return ERR_DOWNL;\r
+       }\r
+\r
+       // open the file\r
+       FILE* file = fopen(filename, "r");\r
+       if(!file) \r
+       {\r
+               Log("!  ERROR: Could not open the xml file");\r
+               return ERR_GENERIC;\r
+       }\r
+\r
+       // parse the xml file\r
+       XML_Parser parser = XML_ParserCreate(NULL);\r
+       XML_SetUserData (parser, usrdata);\r
+       XML_SetElementHandler(parser, start, end);\r
+       XML_SetCharacterDataHandler(parser, text);\r
+\r
+       while (!done)\r
+       {\r
+               size_t len = fread (buffer, 1, sizeof(buffer), file);\r
+               done = len < sizeof(buffer);\r
+\r
+               buffer[len] = 0;\r
+               if(!XML_Parse(parser, buffer, len, done)) \r
+               {\r
+                       Log("!  ERROR: Could not parse the xml file");\r
+                       return ERR_GENERIC;\r
+               }\r
+       }\r
+\r
+       XML_ParserFree(parser);\r
+       fclose(file);\r
+\r
+       return ERR_OK;\r
+}\r
+\r