PackageManager: Depencies
authorMaarten Bosma <maarten@bosma.de>
Sun, 10 Apr 2005 15:34:15 +0000 (15:34 +0000)
committerMaarten Bosma <maarten@bosma.de>
Sun, 10 Apr 2005 15:34:15 +0000 (15:34 +0000)
svn path=/trunk/; revision=14576

rosapps/packmgr/gui/main.cpp
rosapps/packmgr/gui/main.h
rosapps/packmgr/lib/download.cpp
rosapps/packmgr/lib/en.rc
rosapps/packmgr/lib/error.h
rosapps/packmgr/lib/main.cpp
rosapps/packmgr/lib/package.cpp
rosapps/packmgr/lib/package.hpp

index 0fd151a..eb06779 100644 (file)
@@ -174,6 +174,17 @@ int SetIcon (int id, int icon)
     return 1;\r
 }\r
 \r
+// Set the Icons\r
+int Ask (const WCHAR* message) \r
+{      \r
+       int ans = MessageBox (0,message,0,MB_YESNO);\r
+\r
+       if(ans == IDYES)\r
+               return 1;\r
+\r
+    return 0;\r
+}\r
+\r
 // En- or Disable a Button inside of the toolbar and the Context Menu\r
 int SetButton (DWORD id, BOOL state) \r
 {\r
@@ -182,7 +193,12 @@ int SetButton (DWORD id, BOOL state)
 \r
     ti.cbSize = sizeof (ti);\r
     ti.dwMask = TBIF_STATE;\r
-\r
+/*\r
+       if(state&&id==1)\r
+               MessageBox(0,L"on",0,0);\r
+       else if(!state&&id==1)\r
+               MessageBox(0,L"off",0,0);\r
+*/\r
        if(state)\r
                ti.fsState = TBSTATE_ENABLED;\r
        else\r
@@ -294,7 +310,7 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                        if(LOWORD(wParam) <= 5 && LOWORD(wParam) >= 1)\r
                        {\r
                                if(selected)\r
-                                       if(PML_SetAction(tree, selected, LOWORD(wParam)-1, SetIcon) == ERR_OK)\r
+                                       if(PML_SetAction(tree, selected, LOWORD(wParam)-1, SetIcon, Ask) == ERR_OK)\r
                                                break;\r
 \r
                                MessageBeep(MB_ICONHAND);\r
@@ -303,7 +319,7 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                        // DoIt\r
                        else if(LOWORD(wParam)==6)\r
                        {\r
-                               if(PML_DoIt(tree, SetStatus) == ERR_OK)\r
+                               if(PML_DoIt(tree, SetStatus, Ask) == ERR_OK)\r
                                        DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DOIT), hwnd, StatusProc);\r
                                else\r
                                        MessageBeep(MB_ICONHAND);\r
@@ -325,7 +341,7 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                // prozess hotkeys\r
                case WM_HOTKEY:\r
                {\r
-                       if(PML_SetAction(tree, selected, wParam, SetIcon) != ERR_OK)\r
+                       if(PML_SetAction(tree, selected, wParam, SetIcon, Ask) != ERR_OK)\r
                                MessageBeep(MB_ICONHAND);\r
                }\r
                break;\r
index 63cd4cc..93451f9 100644 (file)
@@ -35,6 +35,7 @@ void Help (void);
 int AddItem (int id, const char* name, int parent, int icon);\r
 int SetText (const char* text);\r
 int SetStatus (int status1, int status2, WCHAR* text);\r
+int Ask (const WCHAR* message);\r
 \r
 /* Toolbar Releated */\r
 \r
index 6528ae5..f0d2f6b 100644 (file)
@@ -16,7 +16,7 @@
 #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
+const char* tree_server = "http://maarten-online.de/xml/"; \r
 \r
 HRESULT WINAPI URLDownloadToFileA(      \r
     LPUNKNOWN pCaller,\r
index 386b5bb..c7484ab 100644 (file)
@@ -14,6 +14,10 @@ BEGIN
   ERR_SYNATX       "Error while Script Execution.\nWrong Synatx."\r
   ERR_CALL         "Error while Script Execution.\nCould not find function."\r
   ERR_PARAMETER    "Error while Script Execution.\nWrong Parameter(s)."\r
+\r
+  ERR_DEP1        "To install this package you have to install the following package(s) as well:\n\n"\r
+  ERR_DEP2        "\nDo you want this ?"\r
+  ERR_READY       "You choosen to install %d package(s). To install them you have to read and agree with each of thier licences.\n\n Do you want still want to ?"\r
 END\r
 \r
 /* EOF */\r
index 847c699..ec63a7a 100644 (file)
@@ -6,6 +6,10 @@
 #define ERR_NOTODO        0x003 // without text yet\r
 #define ERR_PACK          0x004\r
 \r
+#define ERR_DEP1          0x005\r
+#define ERR_DEP2          0x006\r
+#define ERR_READY         0x007\r
+\r
 // Script\r
 #define ERR_SYNATX     0x011\r
 #define ERR_CALL       0x012\r
index f5812fe..db126ca 100644 (file)
@@ -102,7 +102,7 @@ DWORD WINAPI DoitThread (void* lpParam)
 \r
        // set all actions to none\r
        for(i=0; i<tree->packages.size(); i++)\r
-               PML_SetAction (tree, i, 0, tree->setIcon);\r
+               PML_SetAction (tree, i, 0, tree->setIcon, NULL);\r
 \r
        tree->setStatus(1000, ret, NULL);\r
 \r
@@ -110,7 +110,7 @@ DWORD WINAPI DoitThread (void* lpParam)
 } \r
 \r
 // Do the actions the user wants us to do\r
-extern "C" int PML_DoIt (TREE* tree, PML_SetStatus SetStatus)\r
+extern "C" int PML_DoIt (TREE* tree, PML_SetStatus SetStatus, PML_Ask Ask)\r
 { \r
     DWORD dummy; \r
        tree->setStatus = SetStatus;\r
@@ -118,6 +118,14 @@ extern "C" int PML_DoIt (TREE* tree, PML_SetStatus SetStatus)
        if(!tree->todo.size())\r
                return ERR_NOTODO;\r
 \r
+       //ask\r
+       WCHAR buffer [2000];\r
+       wsprintf(buffer, PML_TransError(ERR_READY), tree->todo.size());\r
+\r
+       if(!Ask(buffer))\r
+               return ERR_GENERIC;\r
+       \r
+\r
        hThread = CreateThread(NULL, 0, DoitThread, tree, 0, &dummy);\r
 \r
        if(!hThread)\r
index 9608168..7610d00 100644 (file)
@@ -58,6 +58,12 @@ void pack_start (void* usrdata, const char* tag, const char** arg)
 \r
                else if(!strcmp(tag, "description"))\r
                        pack->field = &pack->description;\r
+\r
+               else if (!strcmp(tag, "depent"))\r
+               {\r
+                       pack->depencies.push_back((char*)NULL);\r
+                       pack->field = &pack->depencies.back();\r
+               }\r
        }\r
 }\r
 \r
@@ -82,7 +88,6 @@ void pack_text (void* usrdata, const char* data, int len)
        (*pack->field)[len] = '\0';\r
 }\r
 \r
-\r
 // The user clicks on a package\r
 extern "C" int PML_LoadPackage (TREE* tree, int id, PML_SetButton SetButton)\r
 {\r
@@ -138,7 +143,7 @@ extern "C" int PML_FindItem (TREE* tree, const char* what)
 }\r
 \r
 // The user chooses a actions like Install\r
-extern "C" int PML_SetAction (TREE* tree, int id, int action, PML_SetIcon SetIcon)\r
+extern "C" int PML_SetAction (TREE* tree, int id, int action, PML_SetIcon SetIcon, PML_Ask Ask)\r
 {\r
        UINT i;\r
        int ret = ERR_OK;\r
@@ -148,7 +153,7 @@ extern "C" int PML_SetAction (TREE* tree, int id, int action, PML_SetIcon SetIco
 \r
        // if we have children, same action for them\r
        for (i=0; i<pack->children.size(); i++)\r
-               ret = ret || PML_SetAction(tree, pack->children[i], action, SetIcon);\r
+               ret = ret || PML_SetAction(tree, pack->children[i], action, SetIcon, Ask);\r
 \r
        // is the action possible ? \r
        if(!pack->actions[action])\r
@@ -158,11 +163,66 @@ extern "C" int PML_SetAction (TREE* tree, int id, int action, PML_SetIcon SetIco
        if(pack->action == action)\r
                return ERR_OK;\r
 \r
+       //\r
+       if(pack->depencies.size() && action)\r
+       {\r
+               UINT count = pack->depencies.size();\r
+               WCHAR buffer[2000], buffer2[200];\r
+               wcscpy(buffer, PML_TransError(ERR_DEP1));\r
+               \r
+               for (i=0; i<pack->depencies.size(); i++)\r
+               {\r
+                       int item = PML_FindItem(tree, pack->depencies[i]);\r
+\r
+                       if(!item)\r
+                               return ERR_GENERIC;\r
+\r
+                       if(action == tree->packages[item].action)// || tree->packages[item].installed\r
+                       {\r
+                               count--;\r
+                               continue;\r
+                       }\r
+\r
+                       MultiByteToWideChar (CP_ACP, 0, pack->depencies[i], strlen(pack->depencies[i])+1, buffer2, 200);\r
+                       wsprintf(buffer, L"%s - %s\n", buffer, buffer2);//\r
+               }\r
+\r
+               wcscat(buffer, PML_TransError(ERR_DEP2));\r
+\r
+               if(count)\r
+                       if(!Ask(buffer))\r
+                               return ERR_GENERIC;\r
+\r
+               for (i=0; i<pack->depencies.size(); i++)\r
+               {\r
+                       int item = PML_FindItem(tree, pack->depencies[i]);\r
+\r
+                       tree->packages[item].neededBy.push_back(id);\r
+\r
+                       PML_SetAction(tree, item, action, SetIcon, Ask);\r
+               }\r
+       }\r
+\r
+       // load it if it's not loaded yet\r
+       else if (!pack->loaded && pack->path)\r
+       {\r
+               PML_XmlDownload (pack->path, (void*)pack, pack_start, pack_end, pack_text);\r
+               pack->loaded = TRUE;\r
+\r
+               return PML_SetAction(tree, id, action, SetIcon, Ask);\r
+       }\r
+\r
        // set the icon\r
-       if(!pack->icon)\r
-               if(SetIcon)\r
+       if(SetIcon && !pack->icon)\r
                        SetIcon(id, action);\r
 \r
+       // set the button(s)\r
+       if(tree->setButton && action != 2)\r
+       {\r
+               tree->setButton(1, action);\r
+               //tree->setButton(pack->action+1, action);\r
+       }\r
+\r
        // can't do src install yet\r
        if(action == 2)\r
        {\r
@@ -177,19 +237,13 @@ extern "C" int PML_SetAction (TREE* tree, int id, int action, PML_SetIcon SetIco
                if(tree->setButton)\r
                        tree->setButton(1, 1);\r
                //tree->setButton(action+1, 0);\r
+\r
                pack->action = action;\r
 \r
                // root notes (like network) return here\r
                if(!pack->path)\r
                        return ret; \r
 \r
-               // load it if it's not loaded yet\r
-               if(!pack->loaded)\r
-               {\r
-                       PML_XmlDownload (pack->path, (void*)pack, pack_start, pack_end, pack_text);\r
-                       pack->loaded = TRUE;\r
-               }\r
-\r
                // save the name of the corresponding script in a vector\r
                tree->todo.push_back(pack->files[action-1]);\r
        }\r
@@ -197,10 +251,16 @@ extern "C" int PML_SetAction (TREE* tree, int id, int action, PML_SetIcon SetIco
        // undoing\r
        else \r
        {\r
-               // set other things back\r
-               if(tree->setButton)\r
-                       tree->setButton(1, 0);\r
-               //tree->setButton(pack->action+1, 1);\r
+               for(i=0; i<pack->neededBy.size(); i++)\r
+               {\r
+                       if(tree->packages[pack->neededBy[i]].action)\r
+                       {\r
+                               SetIcon(id, pack->action);\r
+                               return ERR_GENERIC;\r
+                       }\r
+               }\r
+\r
+               // set action back\r
                pack->action = 0;\r
 \r
                // root notes (like network) return here\r
@@ -211,8 +271,6 @@ extern "C" int PML_SetAction (TREE* tree, int id, int action, PML_SetIcon SetIco
                for(i=0; i<tree->todo.size(); i++)\r
                        if(!strcmp(tree->todo[i], pack->files[pack->action-1])) // look for right entry\r
                                tree->todo.erase(tree->todo.begin()+i); // delete it\r
-\r
-               return ERR_OK;\r
        }\r
 \r
        return ret;\r
index 0b90065..1170ba4 100644 (file)
@@ -18,6 +18,7 @@ typedef int (*PML_SetStatus)  (int status1, int status2, WCHAR* text);
 typedef int (*PML_SetButton)   (DWORD dwID, BOOL state);\r
 typedef int (*PML_SetIcon)             (int id, int icon);\r
 typedef int (*PML_SetText)             (const char* text);\r
+typedef int (*PML_Ask)                 (const WCHAR* text);\r
 \r
 \r
 /* Structs */\r
@@ -32,6 +33,8 @@ typedef struct
   char**               field;\r
   char*                        name;\r
   char*                        description;\r
+  vector<char*>        depencies;\r
+  vector<int>  neededBy;\r
   \r
   int                  action;\r
   char*                        files [4];\r
@@ -74,8 +77,8 @@ extern "C"
   int PML_FindItem (TREE* tree, const char* what);\r
   int PML_LoadPackage (pTree, int id, PML_SetButton);\r
   char* PML_GetDescription (TREE* tree, int id);\r
-  int PML_SetAction (pTree, int package, int action, PML_SetIcon);\r
-  int PML_DoIt (pTree, PML_SetStatus);\r
+  int PML_SetAction (pTree, int package, int action, PML_SetIcon, PML_Ask);\r
+  int PML_DoIt (pTree, PML_SetStatus, PML_Ask);\r
 \r
   void PML_CloseTree (pTree);\r
 }\r