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
\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
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
// 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
// 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
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
#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
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
#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
\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
} \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
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
\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
(*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
}\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
\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
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
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
// 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
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
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
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
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