-////////////////////////////////////////////////////////\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
-HRESULT WINAPI URLDownloadToFileA( \r
- LPUNKNOWN pCaller,\r
- LPCSTR szURL,\r
- LPCSTR szFileName,\r
- DWORD dwReserved,\r
- LPBINDSTATUSCALLBACK lpfnCB\r
-);\r
-\r
-int FindCount (string What, string Where, int start = 0, int end = -1);\r
-\r
-\r
-// Download a file \r
-char* PML_Download (pTree tree, const char* url, const char* server = "tree", const char* filename = "packmgr.xml") \r
-{\r
- UINT i;\r
- static char downl [MAX_PATH]; // the full url\r
- static char path [MAX_PATH]; // the full resulting Path\r
-\r
- // It goes to the temp folder when no other path is entered (or even compleatly no filename)\r
- // If server == "tree" it will be downloaded from the server speficied in option.xml\r
- // File:// links are possible too\r
-\r
- // get temp dir\r
- if(!filename)\r
- GetTempPathA (200, path);\r
-\r
- else if(!strstr(filename, "\\"))\r
- GetTempPathA (200, path);\r
-\r
- else\r
- strcpy(path, "");\r
-\r
- \r
- // create the local file name\r
- if(filename)\r
- {\r
- strcat(path, filename);\r
- DeleteFileA (path);\r
- }\r
- else\r
- GetTempFileNameA (path, "pml", 1, path); \r
-\r
- // get the url\r
- if (!server)\r
- strcpy(downl, "");\r
-\r
- else if(!strcmp(server, "tree")) \r
- {\r
- char* ret;\r
- for (i=0; i<tree->sources.size(); i++)\r
- {\r
- ret = PML_Download(tree, url, tree->sources[i], filename);\r
- if(ret)\r
- return ret;\r
- }\r
- return NULL;\r
- }\r
-\r
- else \r
- strcpy(downl, server);\r
-\r
- strcat(downl, url);\r
-\r
- // is this a file link ?\r
- if (strstr(downl, "file://") || strstr(downl, "File://"))\r
- {\r
- if(!filename)\r
- {\r
- return &downl[7];\r
- }\r
-\r
- else\r
- {\r
- CopyFileA(filename, &downl[7], FALSE);\r
- return (char*)filename;\r
- }\r
- }\r
-\r
-\r
- // download the file\r
- if(URLDownloadToFileA (NULL, downl, path, 0, NULL) != S_OK)\r
- {\r
- Log("! ERROR: Unable to download ");\r
- LogAdd(downl);\r
-\r
- return NULL;\r
- }\r
-\r
- return path;\r
-}\r
-\r
-// Download and prozess a xml file\r
-int PML_XmlDownload (pTree tree, const char* url, void* usrdata,\r
- XML_StartElementHandler start, XML_EndElementHandler end, XML_CharacterDataHandler text) \r
-{\r
- int done = 0;\r
- char buffer[255];\r
- char* filename = 0;\r
-\r
- // logging\r
- Log("* prozess the xml file: ");\r
- LogAdd(url);\r
-\r
- // download the file\r
- if(strstr(url, "file://"))\r
- filename = PML_Download(tree, url, NULL, NULL);\r
-\r
- else\r
- filename = PML_Download(tree, url);\r
-\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
- LogAdd(filename);\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
+////////////////////////////////////////////////////////
+//
+// download.cpp
+//
+// Stuff related to downloading
+//
+//
+// Maarten Bosma, 09.01.2004
+// maarten.paul@bosma.de
+//
+////////////////////////////////////////////////////////
+
+#include "package.hpp"
+#include "expat.h"
+#include "log.h"
+#include <urlmon.h>
+
+HRESULT WINAPI URLDownloadToFileA(
+ LPUNKNOWN pCaller,
+ LPCSTR szURL,
+ LPCSTR szFileName,
+ DWORD dwReserved,
+ LPBINDSTATUSCALLBACK lpfnCB
+);
+
+int FindCount (string What, string Where, int start = 0, int end = -1);
+
+
+// Download a file
+char* PML_Download (pTree tree, const char* url, const char* server = "tree", const char* filename = "packmgr.xml")
+{
+ UINT i;
+ static char downl [MAX_PATH]; // the full url
+ static char path [MAX_PATH]; // the full resulting Path
+
+ // It goes to the temp folder when no other path is entered (or even compleatly no filename)
+ // If server == "tree" it will be downloaded from the server speficied in option.xml
+ // File:// links are possible too
+
+ // get temp dir
+ if(!filename)
+ GetTempPathA (200, path);
+
+ else if(!strstr(filename, "\\"))
+ GetTempPathA (200, path);
+
+ else
+ strcpy(path, "");
+
+
+ // create the local file name
+ if(filename)
+ {
+ strcat(path, filename);
+ DeleteFileA (path);
+ }
+ else
+ GetTempFileNameA (path, "pml", 1, path);
+
+ // get the url
+ if (!server)
+ strcpy(downl, "");
+
+ else if(!strcmp(server, "tree"))
+ {
+ char* ret;
+ for (i=0; i<tree->sources.size(); i++)
+ {
+ ret = PML_Download(tree, url, tree->sources[i], filename);
+ if(ret)
+ return ret;
+ }
+ return NULL;
+ }
+
+ else
+ strcpy(downl, server);
+
+ strcat(downl, url);
+
+ // is this a file link ?
+ if (strstr(downl, "file://") || strstr(downl, "File://"))
+ {
+ if(!filename)
+ {
+ return &downl[7];
+ }
+
+ else
+ {
+ CopyFileA(filename, &downl[7], FALSE);
+ return (char*)filename;
+ }
+ }
+
+
+ // download the file
+ if(URLDownloadToFileA (NULL, downl, path, 0, NULL) != S_OK)
+ {
+ Log("! ERROR: Unable to download ");
+ LogAdd(downl);
+
+ return NULL;
+ }
+
+ return path;
+}
+
+// Download and prozess a xml file
+int PML_XmlDownload (pTree tree, const char* url, void* usrdata,
+ XML_StartElementHandler start, XML_EndElementHandler end, XML_CharacterDataHandler text)
+{
+ int done = 0;
+ char buffer[255];
+ char* filename = 0;
+
+ // logging
+ Log("* prozess the xml file: ");
+ LogAdd(url);
+
+ // download the file
+ if(strstr(url, "file://"))
+ filename = PML_Download(tree, url, NULL, NULL);
+
+ else
+ filename = PML_Download(tree, url);
+
+
+ if(!filename)
+ {
+ Log("! ERROR: Could not download the xml file");
+ return ERR_DOWNL;
+ }
+
+ // open the file
+ FILE* file = fopen(filename, "r");
+ if(!file)
+ {
+ Log("! ERROR: Could not open the xml file ");
+ LogAdd(filename);
+ return ERR_GENERIC;
+ }
+
+ // parse the xml file
+ XML_Parser parser = XML_ParserCreate(NULL);
+ XML_SetUserData (parser, usrdata);
+ XML_SetElementHandler(parser, start, end);
+ XML_SetCharacterDataHandler(parser, text);
+
+ while (!done)
+ {
+ size_t len = fread (buffer, 1, sizeof(buffer), file);
+ done = len < sizeof(buffer);
+
+ buffer[len] = 0;
+ if(!XML_Parse(parser, buffer, len, done))
+ {
+ Log("! ERROR: Could not parse the xml file");
+ return ERR_GENERIC;
+ }
+ }
+
+ XML_ParserFree(parser);
+ fclose(file);
+
+ return ERR_OK;
+}
+