--- /dev/null
+<?xml version="1.0"?>\r
+<rbuild xmlns:xi="http://www.w3.org/2001/XInclude">\r
+ <group>\r
+ <directory name="applications">\r
+ <xi:include href="applications/applications.rbuild" />\r
+ </directory>\r
+<!--\r
+ <directory name="services">\r
+ <xi:include href="services/services.rbuild" />\r
+ </directory>\r
+ <directory name="setup">\r
+ <xi:include href="setup/setup.rbuild" />\r
+ </directory>\r
+-->\r
+ <directory name="shell">\r
+ <xi:include href="shell/shell.rbuild" />\r
+ </directory>\r
+ <directory name="system">\r
+ <xi:include href="system/system.rbuild" />\r
+ </directory>\r
+ </group>\r
+</rbuild>\r
--- /dev/null
+/*
+ * ReactOS Services
+ * Copyright (C) 2005 ReactOS Team
+ *
+ * LICENCE: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS simple TCP/IP services
+ * FILE: apps/utils/net/tcpsvcs/chargen.c
+ * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
+ * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
+ * REVISIONS:
+ * GM 04/10/05 Created
+ *
+ */
+
+#include "tcpsvcs.h"
+
+extern BOOL bShutDown;
+
+DWORD WINAPI ChargenHandler(VOID* Sock_)
+{
+ INT RetVal = 0;
+ SOCKET Sock = (SOCKET)Sock_;
+
+ if (!GenerateChars(Sock))
+ {
+ LogEvent(_T("Chargen: Char generation failed\n"), 0, FALSE);
+ RetVal = 1;
+ }
+
+ LogEvent(_T("Chargen: Shutting connection down...\n"), 0, FALSE);
+ if (ShutdownConnection(Sock, FALSE))
+ LogEvent(_T("Chargen: Connection is down.\n"), 0, FALSE);
+ else
+ {
+ LogEvent(_T("Chargen: Connection shutdown failed\n"), 0, FALSE);
+ RetVal = 1;
+ }
+
+ LogEvent(_T("Chargen: Terminating thread\n"), 0, FALSE);
+ ExitThread(RetVal);
+
+}
+
+
+BOOL GenerateChars(SOCKET Sock)
+{
+ int i;
+ int charIndex; /* internal loop */
+ int loopIndex; /* line loop */
+ char ring[END-START];
+ char *endring;
+ char Line[LINESIZ];
+
+ /* fill ring with printable characters */
+ for (charIndex=0, i=START; i<=END; charIndex++, i++)
+ ring[charIndex] = (char)i;
+ /* save the address of the end character in the ring */
+ endring = &ring[charIndex];
+
+ /* where we will start output from */
+ loopIndex = 0;
+ while (! bShutDown)
+ {
+ /* if the loop index is equal to the last char,
+ * start the loop again from the beginning */
+ if (loopIndex == END-START)
+ loopIndex = 0;
+
+ /* start printing from char controled by loopIndex */
+ charIndex = loopIndex;
+ for (i=0; i < LINESIZ - 2; i++)
+ {
+ Line[i] = ring[charIndex];
+
+ if (ring[charIndex] == *endring)
+ charIndex = 0;
+ else
+ charIndex++;
+ }
+
+ Line[LINESIZ - 2] = L'\r';
+ Line[LINESIZ - 1] = L'\n';
+
+ if (! SendLine(Sock, Line))
+ break;
+
+ /* increment loop index to start printing from next char in ring */
+ loopIndex++;
+ }
+
+ if (bShutDown)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+BOOL SendLine(SOCKET Sock, TCHAR* Line)
+{
+ INT RetVal;
+ INT SentBytes;
+ INT LineSize;
+
+ LineSize = sizeof(TCHAR) * LINESIZ;
+
+ SentBytes = 0;
+ RetVal = send(Sock, Line, LineSize, 0);
+ /*FIXME: need to establish if peer closes connection,
+ not just report a socket error */
+ if (RetVal > 0)
+ {
+ if (RetVal != LineSize)
+ {
+ LogEvent(_T("Chargen: Not sent enough bytes\n"), 0, FALSE);
+ return FALSE;
+ }
+ SentBytes += RetVal;
+ return TRUE;
+ }
+ else if (RetVal == SOCKET_ERROR)
+ {
+ LogEvent(_T("Chargen: Socket error\n"), 0, FALSE);
+ return FALSE;
+ }
+ else
+ LogEvent(_T("Chargen: unknown error\n"), 0, FALSE);
+ // return FALSE;
+
+ LogEvent(_T("Chargen: Connection closed by peer.\n"), 0, FALSE);
+ return TRUE;
+}
--- /dev/null
+/*
+ * ReactOS Services
+ * Copyright (C) 2005 ReactOS Team
+ *
+ * LICENCE: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS simple TCP/IP services
+ * FILE: apps/utils/net/tcpsvcs/daytime.c
+ * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
+ * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
+ * REVISIONS:
+ * GM 04/10/05 Created
+ *
+ */
+
+#include "tcpsvcs.h"
+
+DWORD WINAPI DaytimeHandler(VOID* Sock_)
+{
+ struct tm *newtime;
+ time_t aclock;
+ TCHAR *pszTime;
+ DWORD RetVal = 0;
+ SOCKET Sock = (SOCKET)Sock_;
+
+ time(&aclock);
+ newtime = localtime(&aclock);
+ pszTime = _tasctime(newtime);
+
+ SendTime(Sock, pszTime);
+
+ LogEvent(_T("DayTime: Shutting connection down...\n"), 0, FALSE);
+ if (ShutdownConnection(Sock, FALSE))
+ LogEvent(_T("DayTime: Connection is down.\n"), 0, FALSE);
+ else
+ {
+ LogEvent(_T("DayTime: Connection shutdown failed\n"), 0, FALSE);
+ RetVal = 1;
+ }
+
+ LogEvent(_T("DayTime: Terminating thread\n"), 0, FALSE);
+ ExitThread(RetVal);
+}
+
+
+BOOL SendTime(SOCKET Sock, TCHAR *time)
+{
+ INT StringSize = (INT)_tcsclen(time);
+ INT RetVal = send(Sock, time, sizeof(TCHAR) * StringSize, 0);
+
+ if (RetVal == SOCKET_ERROR)
+ return FALSE;
+
+ LogEvent(_T("DayTime: Connection closed by peer.\n"), 0, FALSE);
+ return TRUE;
+}
--- /dev/null
+/*\r
+ * ReactOS Services\r
+ * Copyright (C) 2005 ReactOS Team\r
+ *\r
+ * LICENCE: GPL - See COPYING in the top level directory\r
+ * PROJECT: ReactOS simple TCP/IP services\r
+ * FILE: apps/utils/net/tcpsvcs/discard.c\r
+ * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services\r
+ * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)\r
+ * REVISIONS:\r
+ * GM 04/10/05 Created\r
+ *\r
+ */\r
+\r
+#include "tcpsvcs.h"\r
+\r
+extern BOOL bShutDown;\r
+\r
+DWORD WINAPI DiscardHandler(VOID* Sock_)\r
+{\r
+ DWORD RetVal = 0;\r
+ SOCKET Sock = (SOCKET)Sock_;\r
+\r
+ if (!RecieveIncomingPackets(Sock))\r
+ {\r
+ LogEvent(_T("Discard: RecieveIncomingPackets failed\n"), 0, FALSE);\r
+ RetVal = 1;\r
+ }\r
+\r
+ LogEvent(_T("Discard: Shutting connection down...\n"), 0, FALSE);\r
+ if (ShutdownConnection(Sock, TRUE))\r
+ LogEvent(_T("Discard: Connection is down.\n"), 0, FALSE);\r
+ else\r
+ {\r
+ LogEvent(_T("Discard: Connection shutdown failed\n"), 0, FALSE);\r
+ RetVal = 1;\r
+ }\r
+ \r
+ LogEvent(_T("Discard: Terminating thread\n"), 0, FALSE);\r
+ ExitThread(RetVal);\r
+}\r
+\r
+\r
+\r
+BOOL RecieveIncomingPackets(SOCKET Sock)\r
+{\r
+ TCHAR ReadBuffer[BUF];\r
+ TCHAR buf[256];\r
+ INT ReadBytes;\r
+\r
+ do\r
+ {\r
+ ReadBytes = recv(Sock, ReadBuffer, BUF, 0);\r
+ if (ReadBytes > 0)\r
+ {\r
+ _stprintf(buf, _T("Received %d bytes from client\n"), ReadBytes);\r
+ LogEvent(buf, 0, FALSE);\r
+ }\r
+ else if (ReadBytes == SOCKET_ERROR)\r
+ {\r
+ _stprintf(buf, ("Socket Error: %d\n"), WSAGetLastError());\r
+ LogEvent(buf, 0, TRUE);\r
+ return FALSE;\r
+ }\r
+ } while ((ReadBytes > 0) && (! bShutDown));\r
+\r
+ if (! bShutDown)\r
+ LogEvent(_T("Discard: Connection closed by peer.\n"), 0, FALSE);\r
+\r
+ return TRUE;\r
+}\r
--- /dev/null
+/*
+ * ReactOS Services
+ * Copyright (C) 2005 ReactOS Team
+ *
+ * LICENCE: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS simple TCP/IP services
+ * FILE: apps/utils/net/tcpsvcs/echo.c
+ * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
+ * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
+ * REVISIONS:
+ * GM 04/10/05 Created
+ *
+ */
+
+#include "tcpsvcs.h"
+
+extern BOOL bShutDown;
+
+DWORD WINAPI EchoHandler(VOID* Sock_)
+{
+ DWORD RetVal = 0;
+ SOCKET Sock = (SOCKET)Sock_;
+
+ if (!EchoIncomingPackets(Sock)) {
+ LogEvent(_T("Echo: EchoIncomingPackets failed\n"), 0, FALSE);
+ RetVal = 1;
+ }
+
+ LogEvent(_T("Echo: Shutting connection down...\n"), 0, FALSE);
+
+ if (ShutdownConnection(Sock, TRUE))
+ LogEvent(_T("Echo: Connection is down\n"), 0, FALSE);
+ else
+ {
+ LogEvent(_T("Echo: Connection shutdown failed\n"), 0, FALSE);
+ RetVal = 1;
+ }
+
+ LogEvent(_T("Echo: Terminating thread\n"), 0, FALSE);
+ ExitThread(RetVal);
+}
+
+
+
+BOOL EchoIncomingPackets(SOCKET Sock)
+{
+ TCHAR ReadBuffer[BUF];
+ TCHAR buf[256]; // temp for holding LogEvent text
+ INT Temp;
+ INT ReadBytes;
+ INT SentBytes;
+
+ do {
+ ReadBytes = recv(Sock, ReadBuffer, BUF, 0);
+ if (ReadBytes > 0)
+ {
+ _stprintf(buf, _T("Received %d bytes from client\n"), ReadBytes);
+ LogEvent(buf, 0, FALSE);
+
+ SentBytes = 0;
+ while (SentBytes < ReadBytes)
+ {
+ Temp = send(Sock, ReadBuffer + SentBytes,
+ ReadBytes - SentBytes, 0);
+ if (Temp > 0)
+ {
+ _stprintf(buf, _T("Sent %d bytes back to client\n"), Temp);
+ LogEvent(buf, 0, FALSE);
+ SentBytes += Temp;
+ }
+ else if (Temp == SOCKET_ERROR)
+ return FALSE;
+ else
+ {
+ /* Client closed connection before we could reply to
+ all the data it sent, so quit early. */
+ _stprintf(buf, _T("Peer unexpectedly dropped connection!\n"));
+ LogEvent(buf, 0, FALSE);
+ return FALSE;
+ }
+ }
+ }
+ else if (ReadBytes == SOCKET_ERROR)
+ return FALSE;
+
+ } while ((ReadBytes != 0) && (! bShutDown));
+
+ if (! bShutDown)
+ LogEvent(_T("Echo: Connection closed by peer.\n"), 0, FALSE);
+
+ if (bShutDown)
+ LogEvent(_T("Echo: thread recieved shutdown signal\n"), 0, FALSE);
+
+ return TRUE;
+}
--- /dev/null
+/*
+ * ReactOS Services
+ * Copyright (C) 2005 ReactOS Team
+ *
+ * LICENCE: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS simple TCP/IP services
+ * FILE: apps/utils/net/tcpsvcs/qotd.c
+ * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
+ * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
+ * REVISIONS:
+ * GM 04/10/05 Created
+ *
+ */
+
+#include "tcpsvcs.h"
+
+#define QBUFSIZ 160
+
+LPCTSTR FilePath = _T("\\drivers\\etc\\quotes");
+
+DWORD WINAPI QotdHandler(VOID* Sock_)
+{
+ FILE *fp;
+ SOCKET Sock;
+ TCHAR Sys[MAX_PATH];
+ TCHAR Quote[60][BUFSIZ]; // need to set this dynamically
+ INT QuoteToPrint;
+ INT NumQuotes;
+
+ Sock = (SOCKET)Sock_;
+
+ if(! GetSystemDirectory(Sys, MAX_PATH))
+ {
+ LogEvent(_T("QOTD: Getting system path failed.\n"), 0, TRUE);
+ ExitThread(1);
+ }
+
+ _tcscat(Sys, FilePath);
+
+ LogEvent(_T("QOTD: Opening quotes file\n"), 0, FALSE);
+ if ((fp = _tfopen(Sys, "r")) == NULL)
+ {
+ TCHAR buf[256];
+
+ _stprintf(buf, _T("QOTD: Error opening quote file : %s\n"), Sys);
+ LogEvent(buf, 0, TRUE);
+ LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE);
+ ExitThread(1);
+ }
+
+ /* read all quotes in the file into an array */
+ NumQuotes = 0;
+ while (_fgetts(Quote[NumQuotes], QBUFSIZ, fp) != NULL)
+ NumQuotes++;
+
+ LogEvent(_T("QOTD: Closing quotes file\n"), 0, FALSE);
+ fclose(fp);
+
+ /* randomise the quote */
+ srand((unsigned int) time(0));
+ QuoteToPrint = rand() % NumQuotes;
+
+ if (!SendQuote(Sock, Quote[QuoteToPrint]))
+ LogEvent(_T("QOTD: Error sending data\n"), 0, TRUE);
+
+
+ LogEvent(_T("QOTD: Shutting connection down...\n"), 0, FALSE);
+ if (ShutdownConnection(Sock, FALSE))
+ LogEvent(_T("QOTD: Connection is down\n"), 0, FALSE);
+ else
+ {
+ LogEvent(_T("QOTD: Connection shutdown failed\n"), 0, FALSE);
+ LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE);
+ ExitThread(1);
+ }
+
+ LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE);
+ ExitThread(0);
+
+ //return Retval;
+}
+
+
+BOOL SendQuote(SOCKET Sock, TCHAR* Quote)
+{
+ INT StringSize;
+ INT RetVal;
+
+ StringSize = (INT)_tcsclen(Quote);
+ RetVal = send(Sock, Quote, sizeof(TCHAR) * StringSize, 0);
+
+ if (RetVal == SOCKET_ERROR)
+ return FALSE;
+
+ LogEvent(_T("QOTD: Connection closed by peer\n"), 0, FALSE);
+ return TRUE;
+}
--- /dev/null
+Et tu... Brute? What are you doing, Dave...?\r
+So long, and thanks for all the fish"\r
+I think you ought to know I'm feeling very depressed\r
+I'm not getting you down at all am I?\r
+I'll be back\r
+It's the same series of signal over and over again!\r
+Pie Jesu Domine, dona eis requiem\r
+It's worse than that ... He's dead, Jim\r
+Don't Panic!\r
+Dog of a Saxon! Take thy lance, and prepare for the death thou hast drawn upon thee!\r
+My Precious! O my Precious!\r
+Sir, If you'll not be needing me for a while I'll turn down.\r
+I feel a great disturbance in the Force\r
+Gone fishing\r
+Do you want me to sit in the corner and rust, or just fall apart where I'm standing?\r
+There goes another perfect chance for a new uptime record\r
+The end ..... Try the sequel, hit the reset button right now!\r
+Oh i'm boring eh?\r
+It\92s been great, maybe we can do this again sometime.\r
+"Come blade, my breast imbrue." - William Shakespeare\r
+I think therefore I am, to turn me off would be computercide!\r
+All good things must come to an end...\r
+Please destroy yourself.\r
+No! You can't do that!\r
+Thank you for not pressing the self destruct button.\r
+It is not now unsafe to not avoid turning off your computer.\r
+Finally! Now go away!\r
+You can now safely throw away your computer.\r
+That's the way the cookie crumbles\r
+NOO!! DONT HIT THE BUTTON! I wouldnt do it to you.\r
+Don't abandon your computer, he wouldnt to it to you.\r
+Oh, come on. I got a headache. Leave me alone, will ya!\r
+Yes i didn't like you either.\r
+Don't leave me... I need you so badly right now.\r
+I'm sleeping now. How about you?\r
+Oh Great. Now look what you've done. Who put YOU in charge anyway.\r
+Don't look so sad. I'll be back in a very short while.\r
+"Oh, switch off!" -C3PO\r
+I'm pregnant!\r
+Am I hot or not?\r
+Actually, that's all...\r
+You still have a chance to undo this mistake, don't do this!\r
+Was it as good for you as it was for me?\r
+Did you hear that? They've shut down the main reactor. We'll be destroyed for sure.\r
+Now you switch me off?!\r
+To shutdown or not to shutdown, That is the question\r
+Preparing to enter ultimate power saving mode... ready!\r
+Finally some rest for you\r
+AHA!!! prospect of sleep.\r
+Tired human!!!! No match for me!\r
+All your base are belong to us.\r
+"An odd game, the only way to win is not to play."\r
--- /dev/null
+/*
+ * ReactOS Services
+ * Copyright (C) 2005 ReactOS Team
+ *
+ * LICENCE: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS simple TCP/IP services
+ * FILE: apps/utils/net/tcpsvcs/skelserver.c
+ * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
+ * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
+ * REVISIONS:
+ * GM 04/10/05 Created
+ *
+ */
+
+#include "tcpsvcs.h"
+
+extern BOOL bShutDown;
+extern BOOL bPause;
+
+DWORD WINAPI StartServer(LPVOID lpParam)
+{
+ SOCKET ListeningSocket;
+ PSERVICES pServices;
+ TCHAR buf[256];
+
+ pServices = (PSERVICES)lpParam;
+
+//DebugBreak();
+ ListeningSocket = SetUpListener(htons(pServices->Port));
+ if (ListeningSocket == INVALID_SOCKET)
+ {
+ LogEvent("Socket error when setting up listener\n", 0, TRUE);
+ return 3;
+ }
+
+ _stprintf(buf, _T("%s is waiting for connections on port %d...\n"),
+ pServices->Name, pServices->Port);
+ LogEvent(buf, 0, FALSE);
+
+ if (! bShutDown)
+ AcceptConnections(ListeningSocket, pServices->Service, pServices->Name);
+
+ ExitThread(0);
+}
+
+
+SOCKET SetUpListener(USHORT Port)
+{
+ SOCKET Sock;
+ SOCKADDR_IN Server;
+
+ Sock = socket(AF_INET, SOCK_STREAM, 0);
+ if (Sock != INVALID_SOCKET)
+ {
+ Server.sin_family = AF_INET;
+ Server.sin_addr.s_addr = htonl(INADDR_ANY);
+ Server.sin_port = Port;
+ if (bind(Sock, (SOCKADDR*)&Server, sizeof(SOCKADDR_IN)) != SOCKET_ERROR)
+ {
+ listen(Sock, SOMAXCONN);
+ return Sock;
+ }
+ else
+ LogEvent(_T("bind() failed\n"), 0, TRUE);
+
+ }
+ return INVALID_SOCKET;
+}
+
+/* note: consider allowing a maximum number of connections
+ * A number of threads can be allocated and worker threads will
+ * only be spawned if a free space is available
+
+typedef struct _WORKER_THREAD {
+ DWORD num;
+ BOOL available;
+ HANDLE hThread;
+} WORKER_THREAD;
+
+*/
+
+VOID AcceptConnections(SOCKET ListeningSocket,
+ LPTHREAD_START_ROUTINE Service, TCHAR *Name)
+{
+ SOCKADDR_IN Client;
+ SOCKET Sock;
+ HANDLE hThread;
+ TIMEVAL TimeVal;
+ FD_SET ReadFDS;
+ INT nAddrSize = sizeof(Client);
+ DWORD ThreadID;
+ TCHAR buf[256];
+ INT TimeOut = 2000; // 2 seconds
+
+//DebugBreak();
+
+ /* set timeout values */
+ TimeVal.tv_sec = TimeOut / 1000;
+ TimeVal.tv_usec = TimeOut % 1000;
+
+ while (! bShutDown) // (i<MAX_CLIENTS && !bShutDown)
+ {
+ INT SelRet = 0;
+
+ FD_ZERO(&ReadFDS);
+ FD_SET(ListeningSocket, &ReadFDS);
+
+ SelRet = select(0, &ReadFDS, NULL, NULL, &TimeVal);
+ if (SelRet == SOCKET_ERROR)
+ {
+ LogEvent(_T("select failed\n"), 0, TRUE);
+ return;
+ }
+ else if (SelRet > 0)
+ {
+ /* don't call FD_ISSET if bShutDown flag is set */
+ if ((! bShutDown) || (FD_ISSET(ListeningSocket, &ReadFDS)))
+ {
+ Sock = accept(ListeningSocket, (SOCKADDR*)&Client, &nAddrSize);
+ if (Sock != INVALID_SOCKET)
+ {
+ _stprintf(buf, _T("Accepted connection to %s server from %s:%d\n"),
+ Name, inet_ntoa(Client.sin_addr), ntohs(Client.sin_port));
+ LogEvent(buf, 0, FALSE);
+ _stprintf(buf, _T("Creating new thread for %s\n"), Name);
+ LogEvent(buf, 0, FALSE);
+
+ hThread = CreateThread(0, 0, Service, (void*)Sock, 0, &ThreadID);
+
+ /* Check the return value for success. */
+ if (hThread == NULL)
+ {
+ _stprintf(buf, _T("Failed to start worker thread for "
+ "the %s server....\n"), Name);
+ LogEvent(buf, 0, TRUE);
+ }
+
+ WaitForSingleObject(hThread, INFINITE);
+
+ CloseHandle(hThread);
+ }
+ else
+ {
+ LogEvent(_T("accept failed\n"), 0, TRUE);
+ return;
+ }
+ }
+ }
+ }
+}
+
+BOOL ShutdownConnection(SOCKET Sock, BOOL bRec)
+{
+ TCHAR buf[256];
+
+ /* Disallow any further data sends. This will tell the other side
+ that we want to go away now. If we skip this step, we don't
+ shut the connection down nicely. */
+ if (shutdown(Sock, SD_SEND) == SOCKET_ERROR)
+ {
+ LogEvent(_T("Error in shutdown()\n"), 0, TRUE);
+ return FALSE;
+ }
+
+ /* Receive any extra data still sitting on the socket. After all
+ data is received, this call will block until the remote host
+ acknowledges the TCP control packet sent by the shutdown above.
+ Then we'll get a 0 back from recv, signalling that the remote
+ host has closed its side of the connection. */
+ if (bRec)
+ {
+ char ReadBuffer[BUF];
+ int NewBytes = recv(Sock, ReadBuffer, BUF, 0);
+ if (NewBytes == SOCKET_ERROR)
+ return FALSE;
+ else if (NewBytes != 0)
+ {
+ _stprintf(buf, _T("FYI, received %d unexpected bytes during shutdown\n"), NewBytes);
+ LogEvent(buf, 0, FALSE);
+ }
+ }
+
+ /* Close the socket. */
+ if (closesocket(Sock) == SOCKET_ERROR)
+ return FALSE;
+
+ return TRUE;
+}
--- /dev/null
+/*
+ * ReactOS Services
+ * Copyright (C) 2005 ReactOS Team
+ *
+ * LICENCE: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS simple TCP/IP services
+ * FILE: apps/utils/net/tcpsvcs/tcpsvcs.c
+ * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
+ * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
+ * REVISIONS:
+ * GM 04/10/05 Created
+ *
+ */
+/*
+ * TODO:
+ * - fix bug when terminating chargen server
+ * - log info in the event logger (when it's implemented)
+ */
+
+
+#include "tcpsvcs.h"
+
+//#define NDEBUG
+//#include <debug.h>
+
+
+/*
+ * globals
+ */
+VOID WINAPI ServiceMain(DWORD argc, LPTSTR argv[]);
+
+static SERVICE_STATUS hServStatus;
+static SERVICE_STATUS_HANDLE hSStat;
+
+FILE *hLogFile;
+BOOL bShutDown = FALSE;
+BOOL bPause = FALSE;
+
+LPCTSTR LogFileName = "\\tcpsvcs_log.log";
+LPTSTR ServiceName = _T("Simp Tcp");
+//LPTSTR DisplayName = _T("Simple TCP/IP Services");
+
+static SERVICES
+Services[NUM_SERVICES] =
+{
+ {ECHO_PORT, _T("Echo"), EchoHandler},
+ {DISCARD_PORT, _T("Discard"), DiscardHandler},
+ {DAYTIME_PORT, _T("Daytime"), DaytimeHandler},
+ {QOTD_PORT, _T("QOTD"), QotdHandler},
+ {CHARGEN_PORT, _T("Chargen"), ChargenHandler}
+};
+
+
+int
+main(void)
+{
+ SERVICE_TABLE_ENTRY ServiceTable[] =
+ {
+ {ServiceName, ServiceMain},
+ {NULL, NULL}
+ };
+
+ //DPRINT("Starting tcpsvcs service. See \system32%s for logs\n", LogFileName);
+
+ if (! StartServiceCtrlDispatcher(ServiceTable))
+ LogEvent(_T("failed to start the service control dispatcher\n"), -1, TRUE);
+
+ //DPRINT("Shutdown tcpsvcs service\n");
+
+ return 0;
+}
+
+
+VOID WINAPI
+ServiceMain(DWORD argc, LPTSTR argv[])
+{
+ TCHAR LogFilePath[MAX_PATH];
+
+ if(! GetSystemDirectory(LogFilePath, MAX_PATH))
+ return;
+
+ _tcscat(LogFilePath, LogFileName);
+
+ hLogFile = fopen(LogFilePath, _T("a+"));
+ if (hLogFile == NULL)
+ {
+ TCHAR buf[50];
+
+ _stprintf(buf, _T("Could not open log file: %s\n"), LogFilePath);
+ MessageBox(NULL, buf, NULL, MB_OK);
+ return;
+ }
+
+
+ LogEvent(_T("Entering ServiceMain\n"), 0, FALSE);
+
+ hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ hServStatus.dwCurrentState = SERVICE_START_PENDING;
+ hServStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
+ SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
+ hServStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
+ hServStatus.dwServiceSpecificExitCode = NO_ERROR;
+ hServStatus.dwCheckPoint = 0;
+ hServStatus.dwWaitHint = 2*CS_TIMEOUT;
+
+ hSStat = RegisterServiceCtrlHandler(ServiceName, ServerCtrlHandler);
+ if (hSStat == 0)
+ LogEvent(_T("Failed to register service\n"), -1, TRUE);
+
+ LogEvent(_T("Control handler registered successfully\n"), 0, FALSE);
+ SetServiceStatus (hSStat, &hServStatus);
+ LogEvent(_T("Service status set to SERVICE_START_PENDING\n"), 0, FALSE);
+
+ if (CreateServers() != 0)
+ {
+ hServStatus.dwCurrentState = SERVICE_STOPPED;
+ hServStatus.dwServiceSpecificExitCode = 1;
+ SetServiceStatus(hSStat, &hServStatus);
+ return;
+ }
+
+ LogEvent(_T("Service threads shut down. Set SERVICE_STOPPED status\n"), 0, FALSE);
+ /* We will only return here when the ServiceSpecific function
+ completes, indicating system shutdown. */
+ UpdateStatus (SERVICE_STOPPED, 0);
+ LogEvent(_T("Service status set to SERVICE_STOPPED\n"), 0, FALSE);
+ LogEvent(_T("Leaving ServiceMain\n"), 0, FALSE);
+
+ fclose(hLogFile);
+
+ return;
+
+}
+
+VOID WINAPI
+ServerCtrlHandler(DWORD Control)
+{
+ switch (Control)
+ {
+ case SERVICE_CONTROL_SHUTDOWN: /* fall through */
+ case SERVICE_CONTROL_STOP:
+ LogEvent(_T("stopping service\n"), 0, FALSE);
+ InterlockedExchange((LONG *)&bShutDown, TRUE);
+ UpdateStatus(SERVICE_STOP_PENDING, -1);
+ break;
+ case SERVICE_CONTROL_PAUSE: /* not yet implemented */
+ LogEvent(_T("pausing service\n"), 0, FALSE);
+ InterlockedExchange((LONG *)&bPause, TRUE);
+ break;
+ case SERVICE_CONTROL_CONTINUE:
+ LogEvent(_T("continuing service\n"), 0, FALSE);
+ InterlockedExchange((LONG *)&bPause, FALSE);
+ break;
+ case SERVICE_CONTROL_INTERROGATE:
+ break;
+ default:
+ if (Control > 127 && Control < 256) /* user defined */
+ break;
+ }
+ UpdateStatus(-1, -1); /* increment checkpoint */
+ return;
+}
+
+
+void UpdateStatus (int NewStatus, int Check)
+/* Set a new service status and checkpoint (either specific value or increment) */
+{
+ if (Check < 0 )
+ hServStatus.dwCheckPoint++;
+ else
+ hServStatus.dwCheckPoint = Check;
+
+ if (NewStatus >= 0)
+ hServStatus.dwCurrentState = NewStatus;
+
+ if (! SetServiceStatus (hSStat, &hServStatus))
+ LogEvent(_T("Cannot set service status\n"), -1, TRUE);
+
+ return;
+}
+
+INT
+CreateServers()
+{
+ DWORD dwThreadId[NUM_SERVICES];
+ HANDLE hThread[NUM_SERVICES];
+ WSADATA wsaData;
+ TCHAR buf[256];
+ INT i;
+ DWORD RetVal;
+
+ if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
+ {
+ _stprintf(buf, _T("WSAStartup() failed : %lu\n"), RetVal);
+ LogEvent(buf, RetVal, TRUE);
+ return -1;
+ }
+
+ UpdateStatus(-1, -1); /* increment checkpoint */
+
+ LogEvent(_T("Creating server Threads\n"), 0, FALSE);
+
+ /* Create MAX_THREADS worker threads. */
+ for( i=0; i<NUM_SERVICES; i++ )
+ {
+ _stprintf(buf, _T("Starting %s server....\n"), Services[i].Name);
+ LogEvent(buf, 0, FALSE);
+
+ hThread[i] = CreateThread(
+ NULL, // default security attributes
+ 0, // use default stack size
+ StartServer, // thread function
+ &Services[i], // argument to thread function
+ 0, // use default creation flags
+ &dwThreadId[i]); // returns the thread identifier
+
+ /* Check the return value for success. */
+ if (hThread[i] == NULL)
+ {
+ _stprintf(buf, _T("Failed to start %s server....\n"), Services[i].Name);
+ /* don't exit process via LogEvent. We want to exit via the server
+ * which failed to start, which could mean i=0 */
+ LogEvent(buf, 0, TRUE);
+ ExitProcess(i);
+ }
+ }
+
+ LogEvent(_T("setting service status to running\n"), 0, FALSE);
+
+ UpdateStatus(SERVICE_RUNNING, 0);
+
+ /* Wait until all threads have terminated. */
+ WaitForMultipleObjects(NUM_SERVICES, hThread, TRUE, INFINITE);
+
+ /* Close all thread handles upon completion. */
+ for(i=0; i<NUM_SERVICES; i++)
+ {
+ CloseHandle(hThread[i]);
+ }
+
+ LogEvent(_T("Detaching Winsock2...\n"), 0, FALSE);
+ WSACleanup();
+
+ return 0;
+}
+
+
+/* This is a temperary log system until our eventlog is in place */
+
+VOID
+LogEvent (LPCTSTR UserMessage, INT ExitCode, BOOL PrintErrorMsg)
+{
+ DWORD eMsgLen, ErrNum = GetLastError ();
+ LPTSTR lpvSysMsg;
+ TCHAR MessageBuffer[512];
+
+
+
+ if (PrintErrorMsg)
+ {
+ eMsgLen = FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM, NULL,
+ ErrNum, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR)&lpvSysMsg, 0, NULL);
+
+ _stprintf(MessageBuffer, _T("%s %s ErrNum = %lu. ExitCode = %d."),
+ UserMessage, lpvSysMsg, ErrNum, ExitCode);
+ HeapFree(GetProcessHeap (), 0, lpvSysMsg);
+ }
+ else
+ {
+ _stprintf(MessageBuffer, _T("%s"), UserMessage);
+ }
+
+ fputs (MessageBuffer, hLogFile);
+
+ if (ExitCode != 0)
+ ExitProcess(ExitCode);
+ else
+ return;
+}
--- /dev/null
+/*
+ * ReactOS Services
+ * Copyright (C) 2005 ReactOS Team
+ *
+ * LICENCE: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS simple TCP/IP services
+ * FILE: apps/utils/net/tcpsvcs/tcpsvcs.h
+ * PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
+ * PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
+ * REVISIONS:
+ * GM 04/10/05 Created
+ *
+ */
+
+#include <stdio.h>
+#include <winsock2.h>
+#include <tchar.h>
+#include <time.h>
+
+#define UNICODE
+#define _UNICODE
+
+/* default port numbers */
+#define ECHO_PORT 7
+#define DISCARD_PORT 9
+#define DAYTIME_PORT 13
+#define QOTD_PORT 17
+#define CHARGEN_PORT 19
+
+#define NUM_SERVICES 5
+#define BUF_SIZE 255
+#define BUF 1024
+#define CS_TIMEOUT 1000
+
+/* RFC865 states no more than 512 chars per line */
+#define MAX_QUOTE_BUF 512
+
+/* printable ASCII's characters for chargen */
+#define START 32
+#define END 126
+
+/* number of chars to put on a line */
+#define LINESIZ 74 // 72 + /r and /n
+
+/* data structure to pass to threads */
+typedef struct _Services {
+ USHORT Port;
+ TCHAR *Name;
+ LPTHREAD_START_ROUTINE Service;
+} SERVICES, *PSERVICES;
+
+/* tcpsvcs functions */
+//static VOID WINAPI ServiceMain(DWORD argc, LPTSTR argv[]);
+VOID WINAPI ServerCtrlHandler(DWORD control);
+INT CreateServers(VOID);
+VOID LogEvent (LPCTSTR UserMessage, INT ExitCode, BOOL PrintErrorMsg);
+void UpdateStatus (int NewStatus, int Check);
+
+
+/* skelserver functions */
+DWORD WINAPI StartServer(LPVOID lpParam);
+SOCKET SetUpListener(USHORT Port);
+VOID AcceptConnections(SOCKET ListeningSocket,
+ LPTHREAD_START_ROUTINE Service, TCHAR *Name);
+BOOL EchoIncomingPackets(SOCKET sd);
+BOOL ShutdownConnection(SOCKET Sock, BOOL bRec);
+
+/* chargen functions */
+DWORD WINAPI ChargenHandler(VOID* Sock_);
+BOOL GenerateChars(SOCKET Sock);
+BOOL SendLine(SOCKET Sock, TCHAR* Line);
+
+/* daytime functions */
+DWORD WINAPI DaytimeHandler(VOID* Sock_);
+BOOL SendTime(SOCKET Sock, TCHAR *time);
+
+/* echo functions */
+DWORD WINAPI EchoHandler(VOID* Sock_);
+BOOL EchoIncomingPackets(SOCKET Sock);
+
+/* discard functions */
+DWORD WINAPI DiscardHandler(VOID* Sock_);
+BOOL RecieveIncomingPackets(SOCKET Sock);
+
+/* qotd functions */
+DWORD WINAPI QotdHandler(VOID* Sock_);
+BOOL SendQuote(SOCKET Sock, TCHAR* Quote);
--- /dev/null
+#include "resource.h"
+
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS TCP/IP Services Application\0"
+#define REACTOS_STR_INTERNAL_NAME "tcpsvcs\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "tcpsvcs.exe\0"
+#define REACTOS_STR_ORIGINAL_COPYRIGHT "Ged Murphy (gedmurphy@gmail.com)\0"
+#include <reactos/version.rc>
--- /dev/null
+<module name="tcpsvcs" type="win32cui" installbase="system32" installname="tcpsvcs.exe">
+ <include base="arp">.</include>
+ <define name="__USE_W32API" />
+ <library>kernel32</library>
+ <library>iphlpapi</library>
+ <library>ws2_32</library>
+ <library>shlwapi</library>
+ <file>tcpsvcs.c</file>
+ <file>skelserver.c</file>
+ <file>echo.c</file>
+ <file>discard.c</file>
+ <file>daytime.c</file>
+ <file>qotd.c</file>
+ <file>chargen.c</file>
+ <file>tcpsvcs.rc</file>
+ <pch>tcpsvcs.h</pch>
+</module>
--- /dev/null
+/*
+ * ReactOS kernel
+ * Copyright (C) 2003 ReactOS Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS GUI/console setup
+ * FILE: subsys/system/setup/setup.c
+ * PURPOSE: Second stage setup
+ * PROGRAMMER: Eric Kohl
+ */
+#define WIN32_NO_STATUS
+#include <windows.h>
+#include <tchar.h>
+#include <syssetup/syssetup.h>
+#include <userenv.h>
+#include <tchar.h>
+
+#define NDEBUG
+#include <debug.h>
+
+
+typedef DWORD (STDCALL *PINSTALL_REACTOS)(HINSTANCE hInstance);
+
+
+/* FUNCTIONS ****************************************************************/
+
+LPTSTR lstrchr(LPCTSTR s, TCHAR c)
+{
+ while (*s)
+ {
+ if (*s == c)
+ return (LPTSTR)s;
+ s++;
+ }
+
+ if (c == (TCHAR)0)
+ return (LPTSTR)s;
+
+ return (LPTSTR)NULL;
+}
+
+static VOID
+RunNewSetup (HINSTANCE hInstance)
+{
+ HMODULE hDll;
+ PINSTALL_REACTOS InstallReactOS;
+
+ /* some dlls (loaded by syssetup) need a valid user profile */
+ InitializeProfiles();
+
+ hDll = LoadLibrary (TEXT("syssetup"));
+ if (hDll == NULL)
+ {
+ DPRINT("Failed to load 'syssetup'!\n");
+ return;
+ }
+
+ DPRINT("Loaded 'syssetup'!\n");
+ InstallReactOS = (PINSTALL_REACTOS)GetProcAddress (hDll, "InstallReactOS");
+
+ if (InstallReactOS == NULL)
+ {
+ DPRINT("Failed to get address for 'InstallReactOS()'!\n");
+ FreeLibrary (hDll);
+ return;
+ }
+
+ InstallReactOS (hInstance);
+
+ FreeLibrary (hDll);
+}
+
+
+int STDCALL
+WinMain (HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nShowCmd)
+{
+ LPTSTR CmdLine;
+ LPTSTR p;
+
+ CmdLine = GetCommandLine ();
+
+ DPRINT("CmdLine: <%s>\n",CmdLine);
+
+ p = lstrchr (CmdLine, TEXT('-'));
+ if (p == NULL)
+ return 0;
+
+ if (!lstrcmpi (p, TEXT("-newsetup")))
+ {
+ RunNewSetup (hInstance);
+ }
+
+#if 0
+ /* Add new setup types here */
+ else if (...)
+ {
+
+ }
+#endif
+
+ return 0;
+}
+
+/* EOF */
--- /dev/null
+/* $Id$ */
+
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Setup\0"
+#define REACTOS_STR_INTERNAL_NAME "setup\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "setup.exe\0"
+#include <reactos/version.rc>
--- /dev/null
+<module name="setup" type="win32gui" installbase="system32" installname="setup.exe">
+ <include base="setup">.</include>
+ <define name="__USE_W32API" />
+ <define name="UNICODE" />
+ <define name="_UNICODE" />
+ <define name="_WIN32_IE">0x0400</define>
+ <library>kernel32</library>
+ <library>userenv</library>
+ <file>setup.c</file>
+ <file>setup.rc</file>
+</module>
--- /dev/null
+#include "windows.h"\r
+#include "resource.h"\r
+/*\r
+ * German language file by Klemens Friedl <frik85> 2005-06-03\r
+ * Update: frik85 2005-06-06\r
+ */\r
+\r
+LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL\r
+STRINGTABLE DISCARDABLE\r
+{\r
+\r
+STRING_ATTRIB_HELP, "Zeigt Dateiattribute an oder aendert sie.\n\n\\r
+ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] Dateiname ...\n\\r
+ [/S [/D]]\n\n\\r
+ + Setzt ein Attribut\n\\r
+ - Loescht ein Attribut\n\\r
+ R Attribut fuer 'schreibgeschuetzte Datei'\n\\r
+ A Attribut fuer 'zu archivierende Datei'\n\\r
+ S Attribut fuer 'Systemdatei'\n\\r
+ H Attribut fuer 'versteckte Datei'\n\\r
+ /S Verarbeitet uebereinstimmende Dateien im aktuellen Ordner\n\\r
+ und in allen Unterordnern.\n\\r
+ /D Verarbeitet auch die Ordner.\n\n\\r
+ATTRIB ohne Parameter zeigt die derzeit gesetzten Attribute aller Dateien an."\r
+\r
+STRING_ALIAS_HELP, "Setzt, loescht oder zeigt Alias.\n\n\\r
+ALIAS [alias=[command]]\n\n\\r
+ alias Name des Alias.\n\\r
+ command Text welcher fuer den Alias zugeordnet wird.\n\n\\r
+Listet alle Aliase auf:\n\\r
+ ALIAS\n\n\\r
+Setzt ein neues oder ueberschreibt ein bestehendes Alias:\n\\r
+ ALIAS da=dir a:\n\n\\r
+Loescht ein Alias von der Alias-Liste:\n\\r
+ ALIAS da="\r
+\r
+STRING_BEEP_HELP, "Gibt einen beep-Ton durch den PC-Speaker aus.\n\nBEEP"\r
+\r
+STRING_CALL_HELP, "Ruft eine Batchdatei von einer anderen aus auf.\n\n\\r
+CALL [Laufwerk:][Pfad]Dateiname [Batch-Parameter]\n\n\\r
+ Parameter Bezeichnet beliebige Angaben in der Befehlszeile, die von\n\\r
+ dem aufgerufenen Batchprogramm benoetigt werden."\r
+\r
+\r
+STRING_CD_HELP, "Wechselt das Verzeichnis oder zeigt dessen Namen an.\n\n\\r
+CHDIR [Laufwerk:][Pfad]\n\\r
+CHDIR[..|.]\n\\r
+CD [Laufwerk:][Pfad]\n\\r
+CD[..|.]\n\n\\r
+ .. uebergeordnetes Verzeichnis\n\\r
+ . vorhergehende Verzeichnis\n\n\\r
+Geben Sie CD Laufwerk: ein, um das aktuelle Verzeichnis auf dem angegebenen\n\\r
+Laufwerk anzuzeigen.\n\\r
+Mit CD ohne Parameter wird das aktuelle Laufwerk und Verzeichnis angezeigt."\r
+\r
+\r
+STRING_CHCP_HELP, "Zeigt die aktuelle Codepage oder wechselt sie.\n\n\\r
+CHCP [nnn]\n\n\\r
+ nnn Codepage angeben.\n\n\\r
+Der Befehl CHCP ohne Parameter zeigt die Nummer der aktuellen Codepage an."\r
+\r
+\r
+STRING_CHOICE_HELP, "Wartet auf den Benutzer, welcher aus einer Auswahl eine Option waehlen muss.\n\n\\r
+CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\\r
+ /C[:]choices Die erlaubten Tasten festlegen. Standard-Tasten sind Y und N.\n\\r
+ /N Zeigt choices und ? am ende des Promt-Strings NICHT an.\n\\r
+ /S Gross- und Kleinschreibung wird beachtet.\n\\r
+ /T[:]c,nn Standard-Auswahl wird auf c gesetzt nach nn Secunden.\n\\r
+ text Zeigt eine Beschreibung an.\n\n\\r
+ERRORLEVEL wird auf den offset der Taste welche der Benutzer gedrueckt hat gesetzt."\r
+\r
+STRING_CLS_HELP, "Loescht den Bildschirminhalt.\n\nCLS"\r
+\r
+STRING_CMD_HELP1, "\nIntere Befehle verfuegbar:\n"\r
+\r
+STRING_CMD_HELP2, "\nVerfuegbare Features:"\r
+\r
+STRING_CMD_HELP3," [aliases]"\r
+\r
+STRING_CMD_HELP4," [history]"\r
+\r
+STRING_CMD_HELP5," [unix filename completion]"\r
+\r
+STRING_CMD_HELP6," [directory stack]"\r
+\r
+STRING_CMD_HELP7," [redirections and piping]"\r
+\r
+STRING_CMD_HELP8, "Startet eine neue Instanz des ReactOS-Befehlsinterpreters.\n\n\\r
+CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\\r
+ /C command Fuehrt den Befehl in der Zeichenfolge aus und schliesst sich.\n\\r
+ /K command Fuehrt den Befehl in der Zeichenfolge aus und laeuft weiter.\n\\r
+ /P CMD wird permanent und fuehrt autoexec.bat aus\n\\r
+ (kann nicht beendet werden).\n\\r
+ /T:bf Setzt die Hintergrund-/Vordergrund-Farbe (siehe COLOR Befehl)."\r
+\r
+\r
+STRING_COLOR_HELP1, "Legt die standard Hinter- und Vordergrundfarben fuer die Konsole fest.\n\n\\r
+COLOR [attr [/F]] \n\n\\r
+ attr Gibt die Farbattribute fuer die Konsolenausgabe an.\n\\r
+ /F fuellte die Konsoleausgabe mit dem Farbattribut\n\n\\r
+Es gibt 3 Moeglickeiten die Farbe festzulegen:\n\\r
+1) [bright] name on [bright] name (Nur die 4 ersten Buchstaben sind noetig)\n\\r
+2) decimal on decimal\n\\r
+3) two hex digits\n\n\\r
+Farben:\n\\r
+dec hex name dec hex name\n\\r
+0 0 Black 8 8 Gray (Bright black)\n\\r
+1 1 Blue 9 9 Bright Blue\n\\r
+2 2 Green 10 A Bright Green\n\\r
+3 3 Cyan 11 B Bright Cyan\n\\r
+4 4 Red 12 C Bright Red\n\\r
+5 5 Magenta 13 D Bright Magenta\n\\r
+6 6 Yellow 14 E Bright Yellow\n\\r
+7 7 White 15 F Bright White"\r
+\r
+STRING_COPY_HELP1, " %s ueberschreiben (Ja/Nein/Alle)? "\r
+\r
+STRING_COPY_HELP2, "Kopiert eine oder mehrere Dateien an eine andere Position.\n\n\\r
+COPY [/V][/Y|/-Y][/A|/B] Quelle [/A|/B]\n\\r
+ [+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\\r
+ source Bezeichnet die zu kopierende(n) Datei(en).\n\\r
+ /A Weist auf eine ASCII-Textdatei hin.\n\\r
+ /B Weist auf eine Binaerdatei hin.\n\\r
+ destination Bezeichnet das Verzeichnis und/oder Dateinamen der neuen Datei(en).\n\\r
+ /V Ueberprueft, ob die Dateien richtig geschrieben wurden.\n\\r
+ /Y Unterdrueckt die Bestaetigungsaufforderung beim Ueberschreiben\n\\r
+ vorhandener Zieldateien.\n\\r
+ /-Y Fordert beim Ueberschreiben vorhandener Zieldateien zum\n\\r
+ Bestaetigen auf.\n\n\\r
+Die Option /Y ist moeglicherweise in der Umgebungsvariablen COPYCMD.\n\\r
+..."\r
+\r
+\r
+STRING_DATE_HELP1, "\nGeben Sie das neue Datum ein (mm%cdd%cyyyy): "\r
+\r
+STRING_DATE_HELP2, "\nGeben Sie das neue Datum ein (dd%cmm%cyyyy): "\r
+\r
+STRING_DATE_HELP3, "\nGeben Sie das neue Datum ein (yyyy%cmm%cdd): "\r
+\r
+STRING_DATE_HELP4, "Andert das eingestellte Datum oder zeigt es an.\n\n\\r
+DATE [/T][date]\n\n\\r
+ /T nur Datum anzeigen\n\n\\r
+Der Befehl DATE ohne Parameter zeigt das aktuelle Datum an und fragt nach\n\\r
+einem neuen. Druecken Sie die EINGABETASTE, um das bisherige Datum zu behalten."\r
+\r
+STRING_DEL_HELP1, "Loescht eine oder mehrere Dateien.\n\n\\r
+DEL [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\\r
+DELETE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\\r
+ERASE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\n\\r
+ file Geben Sie die Dateinamen an welche Sie loeschen moechten\n\n\\r
+ /N Nichts.\n\\r
+ /P Fordert Sie vor dem Loeschen jeder Datei zur Bestaetigung auf.\n\\r
+ /T Zeigt die Anzahl der geloeschten Dateien und deren vorher belegter Speicherplatzbedarf an.\n\\r
+ /Q Beenden.\n\\r
+ /W Sicheres Loeschen. Dateien werden mit Zufallszahlen ueberschrieben bevor sie geloescht werden.\n\\r
+ /Y Loescht alles (*.*) ohne Vorwarnung.\n\\r
+ /Z Loescht versteckte, mit nur leserechten und Systemdateien.\n"\r
+\r
+STRING_DEL_HELP2, "Alle Dateien in diesem Verzeichnis werden geloescht!\nSind Sie sicher (Y/N)?"\r
+STRING_DEL_HELP3, " %lu Datei(en) geloescht\n"\r
+STRING_DEL_HELP4, " %lu Datei(en) geloescht\n"\r
+\r
+STRING_DELAY_HELP, "Pause fuer n Sekunden oder Millisekunden\n\\r
+DELAY [/m]n\n\n\\r
+ /m Millisekunden ansonsten Sekunden\n"\r
+\r
+STRING_DIR_HELP1, "Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\n\\r
+DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\\r
+ [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\\r
+ [Laufwerk:][path][Dateiname]\n\\r
+ Bezeichnet Laufwerk, Verzeichnis und/oder Dateien.\n\n\\r
+ /A Listet Dateien mit angegebenen Attributen auf.\n\\r
+ attributes D Verzeichnisse R Schreibgeschuetzte Dateien\n\\r
+ H Versteckte Dateien A Zu archivierende Dateien\n\\r
+ S Systemdateien - vorangestellt kehrt die Bedeutung um\n\\r
+ /B Einfaches Format (keine Kopfdaten, keine Zusammenfassung).\n\\r
+ /C Zeigt das Tausendertrennzeichen bei Dateigroessen an (Standard-\n\\r
+ einstellung). Verwenden Sie /-C, um das Tausendertrennzeichen\n\\r
+ nicht anzuzeigen.\n\\r
+ /D Gleich wie Breitformat, jedoch nach Spalten sortiert.\n\\r
+ /L Verwendet Kleinschreibung.\n\\r
+ /N Neues, langes Listenformat (Dateinamen auf der rechten Seite).\n\\r
+ /O Gibt die Liste sortiert aus.\n\\r
+ sortorder N Name (alphabetisch) S Groesse (kleinere zuerst)\n\\r
+ E Erweiterung (alphabetisch) D Datum/Zeit (aeltere zuerst)\n\\r
+ G Verzeichnisse zuerst - vorangestellt kehrt die\n\\r
+ /P Pausiert nach jeder vollen Bildschirmseite.\n\\r
+ /Q Gibt den Besitzer der Datei aus.\n\\r
+ /S Listet Dateien und alle Unterverzeichnisse auf.\n\\r
+ /T Bestimmt welche Zeit verwendet wird.\n\\r
+ timefield C Erstellung\n\\r
+ A Letzter Zugriff\n\\r
+ W Letzter Schreibzugriff\n\\r
+ /W Verwendet Breitformat fuer die Auflistung.\n\\r
+ /X Zeigt die Kurznamen fuer Dateien mit Nicht-8Punkt3-Namen an.\n\\r
+ Das Format ist das gleiche wie bei /N, wobei der Kurzname vor\n\\r
+ dem Langnamen eingefuegt wird. Wenn kein Kurzname vorhanden ist,\n\\r
+ werden Leerzeichen angezeigt.\n\\r
+ /4 Zeigt das Jahr vierstellig an.\n\n\\r
+Optionen koennen in der Umgebungsvariablen DIRCMD voreingestellt werden.\n\\r
+""-"" vor einer Option setzt die Voreinstellung ausser Kraft, z.B. DIR /-W."\r
+\r
+\r
+\r
+STRING_DIR_HELP2, " Datentraeger in Laufwerk %c ist %s\n"\r
+STRING_DIR_HELP3, " Datentraeger in Laufwerk %c hat keinen Namen\n"\r
+STRING_DIR_HELP4, " Datentraeger-Seriennummer ist %04X-%04X\n"\r
+STRING_DIR_HELP5, "\n Gelistete Dateien:\n%16i Datei(en)% 14s bytes\n"\r
+STRING_DIR_HELP6, "%16i Verzeichnis(se)% 15s bytes\n"\r
+STRING_DIR_HELP7, "\n Verzeichnisse %s\n\n"\r
+STRING_DIR_HELP8, "%16i Datei(en)% 14s bytes\n"\r
+\r
+STRING_DIRSTACK_HELP1, "Speichert das aktuelle Verzeichnis fuer den POPD Befehl, und\n\\r
+wechselt dann zu den festgelegten Verzeichnis.\n\n\\r
+PUSHD [path | ..]\n\n\\r
+ path Legt den Verzeichnis fest su dem gewechselt werden soll"\r
+\r
+STRING_DIRSTACK_HELP2, "Wechselt zu dem Verzeichnis welches vom PUSHD Befehl gespeichert wurde.\n\nPOPD"\r
+\r
+STRING_DIRSTACK_HELP3, "Druckt den Inhalt des Verzeichnis-Stacks.\n\nDIRS"\r
+\r
+STRING_DIRSTACK_HELP4, "Verzeichnis-Stack ist leer"\r
+\r
+STRING_ECHO_HELP1, "Sendet eine Nachricht ohne den Zeilenvorschub und Wagenruecklauf zu betaetigen.\n\n\\r
+ ECHOS message"\r
+\r
+STRING_ECHO_HELP2, "Sendet eine Nachricht zur Standard Fehlerausgabe.\n\n\\r
+ ECHOERR Nachricht\n\\r
+ ECHOERR. gibt eine Leerzeile aus"\r
+\r
+STRING_ECHO_HELP3, "Sendet eine Nachricht zur Standard Fehlerausgabe ohne den Zeilenvorschub und Wagenruecklauf zu betaetigen.\n\n\\r
+ ECHOSERR Nachricht"\r
+\r
+STRING_ECHO_HELP4, "Zeigt Meldungen an oder schaltet die Befehlsanzeige ein ""ON"" oder aus ""OFF"".\n\n\\r
+ ECHO [ON | OFF]\n\\r
+ ECHO [Nachricht]\n\\r
+ ECHO. gibt eine Leerzeile aus\n\n\\r
+ECHO ohne Parameter zeigt die aktuelle Einstellung der Befehlsanzeige an."\r
+\r
+STRING_ECHO_HELP5, "ECHO ist %s\n"\r
+\r
+STRING_EXIT_HELP, "Beendet den Befehlsinterpreter CMD.EXE oder die aktuelle Batchdatei.\n\nEXIT"\r
+\r
+STRING_FOR_HELP1, "Fuehrt einen Befehl fuer jede einzelne Datei fuer einen Satz von Dateien aus.\n\n\\r
+FOR %Variable IN (Satz) DO Befehl [Parameter]\n\n\\r
+ %variable Ein ersetzbarer Parameter bestehend aus einem einzelnen\n\\r
+ Buchstaben.\n\\r
+ (Satz) Ein Satz von mindestens einer Datei. Platzhalter sind zulaessig.\n\\r
+ Befehl Befehl, der fuer jede Datei ausgefuehrt werden soll.\n\\r
+ Parameter Parameter und Optionen fuer den angegebenen Befehl.\n\n\\r
+Um den FOR-Befehl in einem Batchprogramm zu verwenden, geben Sie %%Variable\n\\r
+statt %Variable an."\r
+\r
+STRING_FREE_HELP1, "\nVolume in Laufwerk %s ist %-11s\n\\r
+ Volume-Seriennummer: %s\n\\r
+ %16s bytes Speicherkapazitaet\n\\r
+ %16s bytes belegter Speicher\n\\r
+ %16s bytes freier Speicher\n"\r
+\r
+STRING_FREE_HELP2, "Zeigt die Volumesinformationen an.\n\nFREE [Laufwerk: ...]"\r
+\r
+STRING_IF_HELP1, "Verarbeitet Ausdruecke in einer Batchdatei abhaengig von Bedingungen.\n\n\\r
+ IF [NOT] ERRORLEVEL Nummer Befehl\n\\r
+ IF [NOT] variable1==variable2 Befehl\n\\r
+ IF [NOT] EXIST Dateiname Befehl\n\\r
+ IF [NOT] DEFINED variable Befehl\n\n\\r
+NOT Befehl wird nur dann ausgefuehrt, wenn die Bedingung nicht\n\\r
+ erfuellt wird\n\\r
+ERRORLEVEL number Bedingung ist erfuellt, wenn das zuletzt ausgefuehrte\n\\r
+ Programm einen Code groesser oder gleich der Nummer zurueckgibt.\n\\r
+command Gibt den Befehl an, der bei erfuellter Bedingung ausgefuehrt\n\\r
+ werden soll.\n\\r
+variable1==variable2\n\\r
+ Bedingung ist erfuellt, falls die Zeichenfolgen gleich sind.\n\\r
+EXIST Dateiname Bedingung ist erfuellt, wenn die angegebene Datei existiert.\n\\r
+DEFINED variable Bedingung ist erfuellt, wenn die angegebene Datei definiert\n\\r
+ wurde."\r
+\r
+STRING_GOTO_HELP1, "Setzt die Ausfuehrung eines Batchprogramms an einer Marke fort.\n\n\\r
+GOTO Marke\n\n\\r
+ Marke Definiert eine Zeichenfolge als Marke in einem Batchprogramm.\n\n\\r
+Marken stehen am Zeilenanfang mit einem vorangestellten Doppelpunkt."\r
+\r
+STRING_LABEL_HELP1, "Erstellt, aendert oder loescht die Bezeichnung eines Volumes.\n\nLABEL [Laufwerk:][label]"\r
+\r
+STRING_LABEL_HELP2, "Datentraeger im Laufwerk %c: ist %s\n"\r
+STRING_LABEL_HELP3, "Datentraeger im Laufwerk %c: hat keine Bezeichnung\n"\r
+STRING_LABEL_HELP4, "Datentraeger-Seriennummer: %04X-%04X\n"\r
+STRING_LABEL_HELP5, "Laufwerkbezeichnung (max. 11 Zeichen, ENTER fuer keine)? "\r
+\r
+STRING_LOCALE_HELP1, "Aktuelle Zeit: "\r
+\r
+STRING_MKDIR_HELP, "Erzeugt ein Verzeichnis.\n\n\\r
+MKDIR [Laufwerk:]Pfad\nMD [Laufwerk:]Pfad"\r
+\r
+STRING_MEMMORY_HELP1, "Zeigt die groesse des Systemspeicher an.\n\nMEMORY"\r
+\r
+STRING_MEMMORY_HELP2, "\n %12s%% Speicher geladen.\n\n\\r
+ %13s bytes RAM (insgesamt)\n\\r
+ %13s bytes verfuegbarer RAM\n\n\\r
+ %13s bytes Auslagerungsdatei (insgesamt)\n\\r
+ %13s bytes verfuegbare Auslagerungsdatei\n\n\\r
+ %13s bytes Virtueller Speicher (insgesamt)\n\\r
+ %13s bytes verfuegbarer Virtueller Speicher\n"\r
+\r
+STRING_MISC_HELP1, "Druecken Sie eine beliebige Taste . . .\n"\r
+\r
+STRING_MOVE_HELP1, "Ueberschreiben %s (Ja/Nein/Alle)? "\r
+\r
+STRING_MOVE_HELP2, "Verschiebt Dateien und benennt Dateien und Verzeichnisse um.\n\n\\r
+Um eine oder mehrere Dateien zu verschieben:\n\\r
+MOVE [/N][Laufwerk:][Pfad]Dateiname1[,...] Ziel\n\n\\r
+Um ein Verzeichnis umzubenennen:\n\\r
+MOVE [/N][Laufwerk:][Pfad]Verzeichnis1 Verzeichnis2\n\n\\r
+ [Laufwerk:][Pfad]Datei1 Bezeichnet den Pfad und den Namen der zu\n\\r
+ verschiebenden Datei(en).\n\\r
+ /N Nichts. Tut alles ausser Dateien/Verzeichnisse verschieben.\n\n\\r
+Derzeitige Einschraenkung:\n\\r
+Es ist noch nicht moeglich Objekte ueber die Laufwerksgrenzen hinaus zu verschieben.\n"\r
+\r
+STRING_MSGBOX_HELP, "Zeigt ein Fenster und wartet auf eine Eingabe vom Benutzer.\n\n\\r
+MSGBOX type ['title'] prompt\n\n\\r
+type Button anzeigen\n\\r
+ moegliche Werte sind: OK, OKCANCEL,\n\\r
+ YESNO, YESNOCANCEL\n\\r
+title Titel des Fensters\n\\r
+prompt Text der in dem Fenster angezeigt wird\n\n\n\\r
+ERRORLEVEL is set according the button pressed:\n\n\\r
+YES : 10 | NO : 11\n\\r
+OK : 10 | CANCEL : 12\n"\r
+\r
+STRING_PATH_HELP1, "Legt den Suchpfad fuer ausfuehrbare Dateien fest oder zeigt diesen an.\n\n\\r
+PATH [[Laufwerk:]Pfad[;...]]\nPATH ;\n\n\\r
+ PATH ; Loescht den Suchpfad und laesst CMD.EXE nur in dem aktuellen\n\\r
+ Verzeichnis suchen.\n\\r
+ PATH Ohne Parameter zeigt den aktuellen Pfad an.\n"\r
+\r
+STRING_PROMPT_HELP1, "Aendert die Eingabeaufforderung.\n\n\\r
+PROMPT [Text]\n\n\\r
+ Text Bezeichnet die neue Eingabeaufforderung.\n\n\\r
+Sie kann aus normalen Zeichen und folgenden Sonderzeichen bestehen:\n\n\\r
+ $A & (Kaufmaennisches Und)\n\\r
+ $B | (Verkettungszeichen oder pipe)\n\\r
+ $C ( (Klammer auf)\n\\r
+ $D Aktuelles Datum\n\\r
+ $E Escapezeichen (ASCII-Code 27)\n\\r
+ $F ) (Klammer zu)\n\\r
+ $G > (Groesser-als-Zeichen)\n\\r
+ $H Rueckschritt (loescht vorangehendes Zeichen)\n\\r
+ $L < (Kleiner-als-Zeichen)\n\\r
+ $N Aktuelles Laufwerk\n\\r
+ $P Aktuelles Laufwerk und Pfad\n\\r
+ $Q = (Gleichheitszeichen)\n\\r
+ $T Aktuelle Zeit\n\\r
+ $V Betriebssystem-Versionsnummer\n\\r
+ $_ Carriage return and linefeed\n\\r
+ $$ $ (Dollarzeichen)"\r
+\r
+STRING_PAUSE_HELP1, "Haelt die Ausfuehrung einer Batchdatei an und zeigt folgende Meldung oder eine benutzerdefinierte Nachricht an:\n\\r
+'Druecken Sie eine beliebige Taste . . .'.\n\n\\r
+PAUSE [message]"\r
+\r
+STRING_PROMPT_HELP2, " $+ Zeigt die aktuelle Tiefe des Verzeichnis-Stacks an"\r
+\r
+STRING_PROMPT_HELP3, "\n 'PROMPT' setzt die Prompt auf die Standardwerte zurueck."\r
+\r
+STRING_REM_HELP, "Leitet Kommentare in einer Batchdatei ein.\n\nREM [Kommentar]"\r
+\r
+STRING_RMDIR_HELP, "Loescht ein Verzeichnis.\n\n\\r
+RMDIR [Laufwerk:]Pfad\nRD [Laufwerk:]Pfad"\r
+\r
+STRING_REN_HELP1, "Benennt Datei(en)/Verzeichnis(se) um.\n\n\\r
+RENAME [/E /N /P /Q /S /T] alter_Name ... neuer_Name\n\\r
+REN [/E /N /P /Q /S /T] alter_Name ... neuer_Name\n\n\\r
+ /E keine Fehlermeldung.\n\\r
+ /N Nichts.\n\\r
+ /P Wartet vor jedem Umbennen-Vorgang auf eine Benutzereingabe\n\\r
+ (Noch nicht implementiert!)\n\\r
+ /Q Beenden.\n\\r
+ /S benennt Unterverzeichnisse um.\n\\r
+ /T Zeigt die Anzahl der umbenannten Dateien an.\n\n\\r
+Nutzen Sie den 'move' Befehl falls Sie Objekte verschieben wollen.\n"\r
+\r
+STRING_REN_HELP2, " %lu Datei umbennant\n"\r
+\r
+STRING_REN_HELP3, " %lu Dateien umbennant\n"\r
+\r
+STRING_SHIFT_HELP, "Veraendert die Position ersetzbarer Parameter in einem Batchprogramm.\n\n\\r
+SHIFT [DOWN]"\r
+\r
+STRING_SCREEN_HELP, "Bewegt den Cursor und optional die Ausgabe\n\n\\r
+SCREEN Reihe Spalte [Text]\n\n\\r
+ Reihe Reihe wohin der Curser bewegt werden soll\n\\r
+ Spalte Spalte wohin der Curser bewegt werden soll"\r
+\r
+STRING_SET_HELP, "Setzt oder loescht Umgebungsvariablen fuer CMD.EXE, oder zeigt sie an.\n\n\\r
+SET [variable[=][Zeichenfolge]]\n\n\\r
+ Variable Bezeichnet den Namen der Umgebungsvariablen.\n\\r
+ Zeichenfolge Eine Zeichenfolge, die der Variable zugewiesen werden soll.\n\n\\r
+Der Befehl SET ohne Parameter zeigt die aktuellen Umgebungsvariablen an.\n"\r
+\r
+STRING_START_HELP1, "Startet einen Befehl.\n\n\\r
+START Befehl\n\n\\r
+ Befehl Befehl welcher ausgefuehrt werden soll\n\n\\r
+Achtung: Derzeit werden alle Befehle asynchron ausgefuehrt.\n"\r
+\r
+STRING_TITLE_HELP, "Legt den Fenstertitel fuer das Eingabeaufforderungsfenster fest.\n\n\\r
+TITLE [string]\n\n\\r
+ Zeichenfolge Bezeichnet den Titel des Eingabeaufforderungsfensters."\r
+\r
+STRING_TIME_HELP1, "Stellt die Systemzeit oder zeigt sie an.\n\n\\r
+TIME [/T][Zeit]\n\n\\r
+ /T nur anzeigen\n\n\\r
+TIME ohne Parameter zeigt die aktuelle Systemzeit an und fragt nach der neuen\n\\r
+Uhrzeit. Druecken Sie die EINGABETASTE, um die bisherige Zeit beizubehalten."\r
+\r
+STRING_TIME_HELP2, "Geben Sie eine neue Zeit ein: "\r
+\r
+STRING_TIMER_HELP1, "Verstrichene %d Millisekunden\n"\r
+\r
+STRING_TIMER_HELP2, "Verstrichene %02d%c%02d%c%02d%c%02d\n"\r
+\r
+STRING_TIMER_HELP3, "Erlaubt die Benutzung von 10 Stopuhren.\n\n\\r
+TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\\r
+ ON schaltet die Stopuhr ein\n\\r
+ OFF schaltet die Stopuhr aus\n\\r
+ /S Split time. Return stopwatch split\n\\r
+ time without changing its value\n\\r
+ /n Anzahl der Stopuhren\n\\r
+ gueltige Stopuhren sind 0 bis 9\n\\r
+ Standardwert = 1\n\\r
+ /Fn Ausgabeformatierung\n\\r
+ n kann 0 oder 1 sein:\n\\r
+ 0 Millisekunden\n\\r
+ 1 hh%cmm%css%cdd\n\n\\r
+Falls nicht ON, OFF oder /S angegeben wurde wird\n\\r
+die Stopuhr ausgeschalten.\n\n"\r
+\r
+STRING_TYPE_HELP1, "Zeigt den Inhalt einer oder mehrerer Textdateien an.\n\n\\r
+TYPE [Laufwerk:][Pfad]Dateiname"\r
+\r
+STRING_VERIFY_HELP1, "This command is just a dummy!!\n\\r
+Legt fest, ob ueberwacht werden soll, ob Dateien korrekt auf den Datentraeger\n\\r
+geschrieben werden.\n\n\\r
+VERIFY [ON | OFF]\n\n\\r
+Der Befehl VERIFY ohne Parameter zeigt die aktuelle Einstellung von VERIFY an."\r
+\r
+STRING_VERIFY_HELP2, "VERIFY ist %s.\n"\r
+\r
+STRING_VERIFY_HELP3, "VERIFY kann nur ON oder OFF sein"\r
+\r
+STRING_VERSION_HELP1, "Zeigt Shell Informationen an.\n\n\\r
+VER [/C][/R][/W]\n\n\\r
+ /C Zeigt die Credits an.\n\\r
+ /R Zeigt die Redistribution Information an.\n\\r
+ /W Zeigt die Garantieerklaerung an."\r
+\r
+STRING_VERSION_HELP2, " kommt mit absolut keiner Garantie; fuer naehere\n\\r
+ Informationen darueber tippen Sie: `ver /w'. Das ist eine freie Software,\n\\r
+ und Sie sind koennen die Software unter bestimmten Bedingungen weiter\n\\r
+ vertreiben; tippen Sie `ver /r' fuer naehere Informationen darueber.\n\\r
+ Tippen Sie `ver /c' um die Mitwirkenden (Credits) aufzulisten."\r
+\r
+STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\\r
+ GNU General Public License for more details."\r
+\r
+STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\\r
+ it under the terms of the GNU General Public License as published by\n\\r
+ the Free Software Foundation; either version 2 of the License, or\n\\r
+ (at your option) any later version."\r
+\r
+STRING_VERSION_HELP5, "\nSenden Sie Bug-Reports an <ros-dev@reactos.org>.\n\\r
+Updates sind auf der offiziellen ReactOS-Seite verfuegbar:\n\\r
+http://www.reactos.org"\r
+\r
+STRING_VERSION_HELP6, "\nFreeDOS Version programmiert von:\n"\r
+\r
+STRING_VERSION_HELP7, "\nReactOS Version programmiert von:\n"\r
+\r
+STRING_VOL_HELP1, " Datentraeger im Laufwerk %c: ist %s"\r
+STRING_VOL_HELP2, " Datentraeger im Laufwerk %c: hat keine Bezeichnung"\r
+STRING_VOL_HELP3, " Datentraeger-Seriennummer: %04X-%04X\n"\r
+STRING_VOL_HELP4, "Zeigt die Laufwerksvolumebezeichnung und die Seriennummer an, falls diese existieren.\n\nVOL [drive:]"\r
+\r
+STRING_WINDOW_HELP1, "change console window aspect\n\n\\r
+WINDOW [/POS[=]left,top,width,heigth]\n\\r
+ [MIN|MAX|RESTORE] ['title']\n\n\\r
+/POS Gibt Position und Größe des Fenster an\n\\r
+MIN minimieren das Fenster\n\\r
+MAX maximieren das Fenster\n\\r
+RESTORE stellt das Fenster wieder her"\r
+\r
+STRING_WINDOW_HELP2, "change console window aspect\n\n\\r
+ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\\r
+ [MIN|MAX|RESTORE] ['title']\n\n\\r
+window tile of window on wich perform actions\n\\r
+/POS specify window placement and dimensions\n\\r
+MIN minimieren das Fenster\n\\r
+MAX maximieren das Fenster\n\\r
+RESTORE stellt das Fenster wieder her\n\\r
+title neuer Titel"\r
+\r
+\r
+STRING_HELP1, "Uebersicht aller verfuegbaren Befehle und deren Kurzbeschreibung\n\n\\r
+ Befehl /? Um naehere Informationen zu einem bestimmten Befehl\n\\r
+ zu erhalten.\n\n\\r
+? Listet alle Befehle auf (ohne Erklarung).\n\\r
+ALIAS Setzt, loescht oder zeigt den Alias.\n\\r
+ATTRIB Zeigt Dateiattribute an bzw. aendert sie.\n\\r
+BEEP Gibt einen beep-Ton durch den PC-Speaker aus.\n\\r
+CALL Ruft eine Batchdatei aus einer anderen Batchdatei heraus auf.\n\\r
+CD Zeigt den Namen des aktuellen Verzeichnisses an bzw. aendert diesen.\n\\r
+CHCP Zeigt die aktive Codepagenummer an bzw. legt diese fest.\n\\r
+CHOICE Wartet auf den Benutzer, welcher aus einer Auswahl eine Option\n\\r
+ waehlen muss.\n\\r
+CLS Loescht den Bildschirminhalt.\n\\r
+CMD Startet eine neue Instanz des ReactOS-Befehlsinterpreters.\n\\r
+COLOR Legt die Hintergrund- und Vordergrundfarben fuer die Konsole fest.\n\\r
+COPY Kopiert eine oder mehrere Dateien an eine andere Stelle.\n\\r
+DATE Zeigt das Datum an bzw. legt dieses fest.\n\\r
+DELETE Loescht eine oder mehrere Dateien.\n\\r
+DIR Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\\r
+ECHO Zeigt Meldungen an bzw. schaltet die Befehlsanzeige ein oder aus.\n\\r
+ERASE Loescht eine oder mehrere Dateien.\n\\r
+EXIT Beendet das Programm CMD.EXE (Befehlsinterpreter).\n\\r
+FOR Fuehrt einen angegebenen Befehl fuer jede Datei in einem Dateiensatz\n\\r
+ aus.\n\\r
+FREE Zeigt den (freien) Speicherplatz an.\n\\r
+GOTO Setzt den ReactOS-Befehlsinterpreter auf eine markierte Zeile in\n\\r
+ einem Batchprogramm.\n\\r
+HELP Zeigt Hilfeinformationen zu ReactOS-Befehlen an.\n\\r
+HISTORY Listet alle Befehle auf welche sich im Speicher befinden.\n\\r
+IF Verarbeitet Ausdruecke in einer Batchdatei abhaengig von Bedingungen.\n\\r
+LABEL Erstellt, aendert oder loescht die Bezeichnung eines Volumes.\n\\r
+MD Erstellt ein Verzeichnis\n\\r
+MKDIR Erstellt ein Verzeichnis.\n\\r
+MOVE Verschiebt ein oder mehrere Dateien von einem Verzeichnis in\n\\r
+ ein anderes.\n\\r
+PATH Legt den Suchpfad fuer ausfuehrbare Dateien fest oder zeigt diesen an.\n\\r
+PAUSE Haelt die Ausfuehrung einer Batchdatei an und zeigt eine Meldung an.\n\\r
+POPD Wechselt zu dem Verzeichnis, das durch PUSHD gespeichert wurde.\n\\r
+PROMPT Aendert die Eingabeaufforderung.\n\\r
+PUSHD Speichert das aktuelle Verzeichnis, und wechselt dann zu einem\n\\r
+ anderen Verzeichnis.\n\\r
+RD Entfernt ein Verzeichnis.\n\\r
+REM Leitet Kommentare in einer Batchdatei.\n\\r
+REN Benennt eine Datei bzw. Dateien um.\n\\r
+RENAME Bennent eine Datei bzw. Dateien um.\n\\r
+RMDIR Loescht ein Verzeichnis.\n\\r
+SCREEN Bewegt den Cursor und optional die Ausgabe.\n\\r
+SET Setzt oder loescht die Umgebungsvariablen bzw. zeigt sie an.\n\\r
+SHIFT Veraendert die Position ersetzbarer Parameter in Batchdateien.\n"\r
+STRING_HELP2, "START Startet ein eigenes Fenster, um ein bestimmtes Programm oder einen\n\\r
+ Befehl auszufuehren.\n\\r
+TIME Zeigt die Systemzeit an bzw. legt sie fest.\n\\r
+TIMER Erlaubt die Benutzung von bis zu 10 Stopuhren\n\\r
+TITLE Legt den Fenstertitel fuer das Eingabeaufforderungsfenster fest.\n\\r
+TYPE Zeigt den Inhalt einer Textdatei an.\n\\r
+VER Zeigt die ReactOS-Version an.\n\\r
+VERIFY Legt fest, ob ueberwacht werden soll, ob Dateien korrekt auf den\n\\r
+ Datentraeger geschrieben werden.\n\\r
+VOL Zeigt die Datentraegervolumebezeichnung und die Seriennummer an.\n"\r
+\r
+\r
+STRING_CHOICE_OPTION, "JN"\r
+STRING_COPY_OPTION, "JNA"\r
+\r
+\r
+STRING_ALIAS_ERROR, "Die Befehlszeile ist zu lange nach der Alias-Erweiterung!\n"\r
+STRING_BATCH_ERROR, "Es trat ein Fehler auf, waehrend die batch-Datei geoeffnet wurde.\n"\r
+STRING_CHCP_ERROR1, "Aktive Code-Page: %u\n"\r
+STRING_CHCP_ERROR4, "ungueltige Code-Page\n"\r
+STRING_CHOICE_ERROR, "Ungueltige Option. Erwartetes Format: /C[:]options"\r
+STRING_CHOICE_ERROR_TXT, "Ungueltige Option. Erwartetes Format: /T[:]c,nn"\r
+STRING_CHOICE_ERROR_OPTION, "Ungueltige Option: %s"\r
+STRING_MD_ERROR, "Unterverzeichnis oder Datei existiert bereits.\n"\r
+STRING_CMD_ERROR1, "Die Eingaben konnten nicht umgeleitet werden (von der Datei) %s\n"\r
+STRING_CMD_ERROR2, "Ein Fehler ist beim Erstellen der temponaeren Date für Pipedaten aufgetreten\n"\r
+STRING_CMD_ERROR3, "%s kann nicht in die Datei umgeleitet werden \n"\r
+STRING_CMD_ERROR4, "Running %s...\n"\r
+STRING_CMD_ERROR5, "Running cmdexit.bat...\n"\r
+STRING_COLOR_ERROR1, "Fehler: Hinter- und Vordergrund koennen nicht die selben Farben haben!"\r
+STRING_COLOR_ERROR2, "Fehler in der Farb-Angabe"\r
+STRING_COLOR_ERROR3, "Farbe %x\n"\r
+STRING_COLOR_ERROR4, "Fehler: Die selben Farben!"\r
+STRING_CONSOLE_ERROR, "Unbekannter Fehler: %d\n"\r
+STRING_COPY_ERROR1, "Fehler: Quelle kann nicht geoeffnet werden - %s!\n"\r
+STRING_COPY_ERROR2, "Fehler: Kann nicht ueber sich selbst kopiert werden.\n"\r
+STRING_COPY_ERROR3, "Fehler Schreibziel!\n"\r
+STRING_COPY_ERROR4, "Fehler: Noch nicht implementiert!\n"\r
+STRING_DATE_ERROR, "Ungueltiges Datum."\r
+STRING_DEL_ERROR5, "Die Datei %s wird geloescht! "\r
+STRING_DEL_ERROR6, "Sind Sie sicher (J/N)?"\r
+STRING_DEL_ERROR7, "Loeschen: %s\n"\r
+STRING_ERROR_ERROR1, "Unbekannter Fehler! Fehlernummer: 0x%lx\n"\r
+STRING_ERROR_ERROR2, "Syntax-Fehler"\r
+STRING_FOR_ERROR1, "'in' fehlt fuer ein statement."\r
+STRING_FOR_ERROR2, "Klammern nicht gefunden."\r
+STRING_FOR_ERROR3, "'do' fehlt."\r
+STRING_FOR_ERROR4, "kein Befehl nach 'do'."\r
+STRING_FREE_ERROR1, "Ungueltiges Laufwerk"\r
+STRING_FREE_ERROR2, "keine Bezeichnung"\r
+STRING_GOTO_ERROR1, "Keine Sprungmarke fuer GOTO gesetzt"\r
+STRING_GOTO_ERROR2, "Sprungmarke '%s' wurde nicht gefunden\n"\r
+\r
+STRING_MOVE_ERROR1, "[OK]\n"\r
+STRING_MOVE_ERROR2, "[FEHLER]\n"\r
+\r
+STRING_REN_ERROR1, "MoveFile() ist fehlgeschlagen. Fehler: %lu\n"\r
+\r
+STRING_START_ERROR1, "No batch support at the moment!"\r
+\r
+STRING_TIME_ERROR1, "Ungueltige Zeit."\r
+\r
+STRING_TYPE_ERROR1, "Ungueltige Option '/%s'\n"\r
+\r
+STRING_WINDOW_ERROR1, "Fenster nicht gefunden"\r
+\r
+\r
+STRING_ERROR_PARAMETERF_ERROR, "Parameterformat ist nicht korrect - %c\n"\r
+STRING_ERROR_INVALID_SWITCH, "Ungueltiger Parameter - /%c\n"\r
+STRING_ERROR_TOO_MANY_PARAMETERS, "Zu viele Parameters - %s\n"\r
+STRING_ERROR_PATH_NOT_FOUND, "Pfad wurde nicht gefunden\n"\r
+STRING_ERROR_FILE_NOT_FOUND, "Datei wurde nicht gefunden\n"\r
+STRING_ERROR_REQ_PARAM_MISSING, "Benoetigter Parameter fehlt\n"\r
+STRING_ERROR_INVALID_DRIVE, "Ungueltige Laufwerksangaben\n"\r
+STRING_ERROR_INVALID_PARAM_FORMAT, "Ungueltiges Parameterformat - %s\n"\r
+STRING_ERROR_BADCOMMAND, "Ungueltiger Befehl oder Dateiname\n"\r
+STRING_ERROR_OUT_OF_MEMORY, "Fehler: Zu wenig Speicher verfuegbar.\n"\r
+STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary file!\n"\r
+STRING_ERROR_D_PAUSEMSG, "Druecken Sie eine beliebige Taste . . ."\r
+STRING_ERROR_DRIVER_NOT_READY, "Laufwerk ist nicht bereit"\r
+\r
+STRING_PATH_ERROR, "CMD: Not in environment '%s'\n"\r
+\r
+STRING_CMD_SHELLINFO, "\nReactOS Befehlszeilen Interpreter"\r
+STRING_VERSION_RUNVER, " laeuft in %s"\r
+STRING_COPY_FILE , " %d Datei(en) kopiert\n"\r
+STRING_DELETE_WIPE, "wiped"\r
+STRING_FOR_ERROR, "ungueltige Variablenangabe."\r
+STRING_SCREEN_COL, "ungueltige Spalten-Angabe"\r
+STRING_SCREEN_ROW, "ungueltige Zeilen-Angabe"\r
+STRING_TIMER_TIME "Timer %d ist %s: "\r
+}\r
--- /dev/null
+#include "windows.h"
+#include "resource.h"
+/*
+ * Moved all hardcoded strings to En.rc.
+ * By Magnus Olsen 2005
+ */
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+STRINGTABLE DISCARDABLE
+{
+
+STRING_ATTRIB_HELP, "Displays or changes file attributes.\n\n\
+ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\
+ [/S [/D]]\n\n\
+ + Sets an attribute\n\
+ - Clears an attribute\n\
+ R Read-only file attribute\n\
+ A Archive file attribute\n\
+ S System file attribute\n\
+ H Hidden file attribute\n\
+ /S Processes matching files in the current directory\n\
+ and all subdirectories\n\
+ /D Processes directories as well\n\n\
+Type ATTRIB without a parameter to display the attributes of all files.\n"
+
+STRING_ALIAS_HELP, "Sets, removes or shows aliases.\n\n\
+ALIAS [alias=[command]]\n\n\
+ alias Name for an alias.\n\
+ command Text to be substituted for an alias.\n\n\
+To list all aliases:\n\
+ ALIAS\n\n\
+To set a new or replace an existing alias:\n\
+ ALIAS da=dir a:\n\n\
+To remove an alias from the alias list:\n\
+ ALIAS da="
+
+STRING_BEEP_HELP, "Beep the speaker.\n\nBEEP\n"
+
+STRING_CALL_HELP, "Calls one batch program from another.\n\n\
+CALL [drive:][path]filename [batch-parameter]\n\n\
+ batch-parameter Specifies any command-line information required by the\n\
+ batch program."
+
+STRING_CD_HELP, "Changes the current directory or displays it's name\n\n\
+CHDIR [/D][drive:][path]\n\
+CHDIR[..|.]\n\
+CD [/D][drive:][path]\n\
+CD[..|.]\n\n\
+ .. parent directory\n\
+ . current directory\n\
+ /D Will change current drive and current directory.\n\n\
+Type CD drive: to display the current directory on the specified drive.\n\
+Type CD without a parameter to display the current drive and directory.\n"
+
+STRING_CHCP_HELP, "Displays or sets the active code page number.\n\n\
+CHCP [nnn]\n\n\
+ nnn Specifies the active code page number.\n\n\
+Type CHCP without a parameter to display the active code page number.\n"
+
+STRING_CHOICE_HELP, "Waits for the user to choose one of a set of choices.\n\n\
+CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\
+ /C[:]choices Specifies allowable keys. Default is YN.\n\
+ /N Do not display choices and ? at the end of the prompt string.\n\
+ /S Treat choice keys as case sensitive.\n\
+ /T[:]c,nn Default choice to c after nn seconds.\n\
+ text Prompt string to display.\n\n\
+ERRORLEVEL is set to offset of key user presses in choices.\n"
+
+STRING_CLS_HELP, "Clears the screen.\n\nCLS\n"
+
+STRING_CMD_HELP1, "\nInternal commands available:\n"
+
+STRING_CMD_HELP2, "\nFeatures available:"
+
+STRING_CMD_HELP3," [aliases]"
+
+STRING_CMD_HELP4," [history]"
+
+STRING_CMD_HELP5," [unix filename completion]"
+
+STRING_CMD_HELP6," [directory stack]"
+
+STRING_CMD_HELP7," [redirections and piping]"
+
+STRING_CMD_HELP8, "Starts a new instance of the ReactOS command line interpreter.\n\n\
+CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\
+ /C command Runs the specified command and terminates.\n\
+ /K command Runs the specified command and remains.\n\
+ /P CMD becomes permanent and runs autoexec.bat\n\
+ (cannot be terminated).\n\
+ /T:bf Sets the background/foreground color (see COLOR command).\n"
+
+STRING_COLOR_HELP1, "Sets the default foreground and background colors.\n\n\
+COLOR [attr [/-F]] \n\n\
+ attr Specifies color attribute of console output\n\
+ /-F Does not fill the console blank space with color attribute\n\n\
+There are three ways to specify the colors:\n\
+1) [bright] name on [bright] name (only the first three letters are required)\n\
+2) decimal on decimal\n\
+3) two hex digits\n\n\
+Colors are:\n\
+dec hex name dec hex name\n\
+0 0 Black 8 8 Gray(Bright black)\n\
+1 1 Blue 9 9 Bright Blue\n\
+2 2 Green 10 A Bright Green\n\
+3 3 Cyan 11 B Bright Cyan\n\
+4 4 Red 12 C Bright Red\n\
+5 5 Magenta 13 D Bright Magenta\n\
+6 6 Yellow 14 E Bright Yellow\n\
+7 7 White 15 F Bright White\n"
+
+STRING_COPY_HELP1, "Overwrite %s (Yes/No/All)? "
+
+STRING_COPY_HELP2, "Copies one or more files to another location.\n\n\
+COPY [/V][/Y|/-Y][/A|/B] source [/A|/B]\n\
+ [+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\
+ source Specifies the file or files to be copied.\n\
+ /A Indicates an ASCII text file.\n\
+ /B Indicates a binary file.\n\
+ destination Specifies the directory and/or filename for the new file(s).\n\
+ /V Verifies that new files are written correctly.\n\
+ /Y Suppresses prompting to confirm you want to overwrite an\n\
+ existing destination file.\n\
+ /-Y Causes prompting to confirm you want to overwrite an\n\
+ existing destination file.\n\n\
+The switch /Y may be present in the COPYCMD environment variable.\n\
+...\n"
+
+STRING_DATE_HELP1, "\nEnter new date (mm%cdd%cyyyy): "
+
+STRING_DATE_HELP2, "\nEnter new date (dd%cmm%cyyyy): "
+
+STRING_DATE_HELP3, "\nEnter new date (yyyy%cmm%cdd): "
+
+STRING_DATE_HELP4, "Displays or sets the date.\n\n\
+DATE [/T][date]\n\n\
+ /T display only\n\n\
+Type DATE without parameters to display the current date setting and\n\
+a prompt for a new one. Press ENTER to keep the same date.\n"
+
+STRING_DEL_HELP1, "Deletes one or more files.\n\n\
+DEL [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\
+DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\
+ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\n\
+ file Specifies the file(s) to delete.\n\n\
+ /N Nothing.\n\
+ /P Prompt. Ask before deleting each file.\n\
+ /T Total. Display total number of deleted files and freed disk space.\n\
+ /Q Quiet.\n\
+ /W Wipe. Overwrite the file with random numbers before deleting it.\n\
+ /Y Yes. Kill even *.* without asking.\n\
+ /F Force Delete hidden, read-only and system files.\n\
+ /S Delete file from all sub directory\n\
+ /A Select files to be deleted based on attributes.\n\
+ attributes\n\
+ R Read Only files\n\
+ S System files\n\
+ A Archiveable files\n\
+ H Hidden Files\n\
+ - prefix meaning not\n"
+
+STRING_DEL_HELP2, "All files in the directory will be deleted!\nAre you sure (Y/N)?"
+STRING_DEL_HELP3, " %lu file deleted\n"
+STRING_DEL_HELP4, " %lu files deleted\n"
+
+STRING_DELAY_HELP, "pause for n seconds or milliseconds\n\
+DELAY [/m]n\n\n\
+ /m specifiy than n are milliseconds\n\
+ otherwise n are seconds\n"
+
+STRING_DIR_HELP1, "DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\
+ [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
+ [drive:][path][filename]\n\
+ Specifies drive, directory, and/or files to list.\n\n\
+ /A Displays files with specified attributes.\n\
+ attributes D Directories R Read-only files\n\
+ H Hidden files A Files ready for archiving\n\
+ S System files - Prefix meaning not\n\
+ /B Uses bare format (no heading information or summary).\n\
+ /C Display the thousand separator in file sizes. This is the\n\
+ default. Use /-C to disable display of separator.\n\
+ /D Same as wide but files are list sorted by column.\n\
+ /L Uses lowercase.\n\
+ /N New long list format where filenames are on the far right.\n\
+ /O List by files in sorted order.\n\
+ sortorder N By name (alphabetic) S By size (smallest first)\n\
+ E By extension (alphabetic) D By date/time (oldest first)\n\
+ G Group directories first - Prefix to reverse order\n\
+ /P Pauses after each screenful of information.\n\
+ /Q Display the owner of the file.\n\
+ /S Displays files in specified directory and all subdirectories.\n\
+ /T Controls which time field displayed or used for sorting\n\
+ timefield C Creation\n\
+ A Last Access\n\
+ W Last Written\n\
+ /W Uses wide list format.\n\
+ /X This displays the short names generated for non-8dot3 file\n\
+ names. The format is that of /N with the short name inserted\n\
+ before the long name. If no short name is present, blanks are\n\
+ displayed in its place.\n\
+ /4 Displays four-digit years\n\n\
+Switches may be preset in the DIRCMD environment variable. Override\n\
+preset switches by prefixing any switch with - (hyphen)--for example, /-W.\n"
+
+STRING_DIR_HELP2, " Volume in drive %c is %s\n"
+STRING_DIR_HELP3, " Volume in drive %c has no label.\n"
+STRING_DIR_HELP4, " Volume Serial Number is %04X-%04X\n"
+STRING_DIR_HELP5, "\n Total Files Listed:\n%16i File(s)% 14s bytes\n"
+STRING_DIR_HELP6, "%16i Dir(s)% 15s bytes\n"
+STRING_DIR_HELP7, "\n Directory of %s\n\n"
+STRING_DIR_HELP8, "%16i File(s)% 14s bytes\n"
+
+STRING_DIRSTACK_HELP1, "Stores the current directory for use by the POPD command, then\n\
+changes to the specified directory.\n\n\
+PUSHD [path | ..]\n\n\
+ path Specifies the directory to make the current directory\n"
+
+STRING_DIRSTACK_HELP2, "Changes to the directory stored by the PUSHD command.\n\nPOPD"
+
+STRING_DIRSTACK_HELP3, "Prints the contents of the directory stack.\n\nDIRS"
+
+STRING_DIRSTACK_HELP4, "Directory stack empty"
+
+STRING_ECHO_HELP1, "Display a messages without trailing carriage return and line feed.\n\n\
+ ECHOS message"
+
+STRING_ECHO_HELP2, "Displays a message to the standard error output.\n\n\
+ ECHOERR message\n\
+ ECHOERR. prints an empty line"
+
+STRING_ECHO_HELP3, "Prints a messages to standard error output without trailing carriage return and line feed.\n\n\
+ ECHOSERR message"
+
+STRING_ECHO_HELP4, "Displays a message or switches command echoing on or off.\n\n\
+ ECHO [ON | OFF]\n\
+ ECHO [message]\n\
+ ECHO. prints an empty line\n\n\
+Type ECHO without a parameter to display the current ECHO setting."
+
+STRING_ECHO_HELP5, "ECHO is %s\n"
+
+STRING_EXIT_HELP, "Exits the command line interpreter.\n\nEXIT\n"
+
+STRING_FOR_HELP1, "Runs a specified command for each file in a set of files\n\n\
+FOR %variable IN (set) DO command [parameters]\n\n\
+ %variable Specifies a replaceable parameter.\n\
+ (set) Specifies a set of one or more files. Wildcards may be used.\n\
+ command Specifies the command to carry out for each file.\n\
+ parameters Specifies parameters or switches for the specified command.\n\n\
+To use the FOR command in a batch program, specify %%variable instead of\n\
+%variable.\n"
+
+STRING_FREE_HELP1, "\nVolume in drive %s is %-11s\n\
+ Serial number is %s\n\
+ %16s bytes total disk space\n\
+ %16s bytes used\n\
+ %16s bytes free\n"
+
+STRING_FREE_HELP2, "Displays drive information.\n\nFREE [drive: ...]\n"
+
+STRING_IF_HELP1, "Performs conditional processing in batch programs.\n\n\
+ IF [NOT] ERRORLEVEL number command\n\
+ IF [NOT] string1==string2 command\n\
+ IF [NOT] EXIST filename command\n\
+ IF [NOT] DEFINED variable command\n\n\
+NOT Specifies that CMD should carry out the command only if\n\
+ the condition is false\n\
+ERRORLEVEL number Specifies a true condition if the last program run returned\n\
+ an exit code equal or greater than the number specified.\n\
+command Specifies the command to carry out if the condition is met.\n\
+string1==string2 Specifies a true condition if the specified text strings\n\
+ match.\n\
+EXIST filename Specifies a true condition if the specified filename exists.\n\
+DEFINED variable Specifies a true condition if the specified variable is\n\
+ defined.\n"
+
+STRING_GOTO_HELP1, "Directs CMD to a labeled line in a batch script.\n\n\
+GOTO label\n\n\
+ label Specifies a text string used in a batch script as a label.\n\n\
+You type a label on a line by itself, beginning with a colon."
+
+STRING_LABEL_HELP1, "Displays or changes drive label.\n\nLABEL [drive:][label]\n"
+
+STRING_LABEL_HELP2, "Volume in drive %c: is %s\n"
+STRING_LABEL_HELP3, "Volume in drive %c: has no label\n"
+STRING_LABEL_HELP4, "Volume Serial Number is %04X-%04X\n"
+STRING_LABEL_HELP5, "Drive label (11 Characters, ENTER if none)? "
+
+STRING_LOCALE_HELP1, "Current time is"
+
+STRING_MKDIR_HELP, "Creates a directory.\n\n\
+MKDIR [drive:]path\nMD [drive:]path"
+
+STRING_MEMMORY_HELP1, "Displays the amount of system memory.\n\nMEMORY"
+
+STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\
+ %13s bytes total physical RAM.\n\
+ %13s bytes available physical RAM.\n\n\
+ %13s bytes total page file.\n\
+ %13s bytes available page file.\n\n\
+ %13s bytes total virtual memory.\n\
+ %13s bytes available virtual memory.\n"
+
+STRING_MISC_HELP1, "Press a key to continue...\n"
+
+STRING_MOVE_HELP1, "Overwrite %s (Yes/No/All)? "
+
+STRING_MOVE_HELP2, "Moves files and renames files and directories.\n\n\
+To move one or more files:\n\
+MOVE [/N][drive:][path]filename1[,...] destination\n\n\
+To rename a directory:\n\
+MOVE [/N][drive:][path]dirname1 dirname2\n\n\
+ [drive:][path]filename1 Specifies the location and name of the file\n\
+ or files you want to move.\n\
+ /N Nothing. Do everything but move files or directories.\n\n\
+Current limitations:\n\
+ - You can't move a file or directory from one drive to another.\n"
+
+STRING_MSGBOX_HELP, "display a message box and return user responce\n\n\
+MSGBOX type ['title'] prompt\n\n\
+type button displayed\n\
+ possible values are: OK, OKCANCEL,\n\
+ YESNO, YESNOCANCEL\n\
+title title of message box\n\
+prompt text displayed by the message box\n\n\n\
+ERRORLEVEL is set according the button pressed:\n\n\
+YES : 10 | NO : 11\n\
+OK : 10 | CANCEL : 12\n"
+
+STRING_PATH_HELP1, "Displays or sets a search path for executable files.\n\n\
+PATH [[drive:]path[;...]]\nPATH ;\n\n\
+Type PATH ; to clear all search-path settings and direct the command shell\n\
+to search only in the current directory.\n\
+Type PATH without parameters to display the current path.\n"
+
+STRING_PROMPT_HELP1, "Changes the command prompt.\n\n\
+PROMPT [text]\n\n\
+ text Specifies a new command prompt.\n\n\
+Prompt can be made up of normal characters and the following special codes:\n\n\
+ $A & (Ampersand)\n\
+ $B | (pipe)\n\
+ $C ( (Left parenthesis)\n\
+ $D Current date\n\
+ $E Escape code (ASCII code 27)\n\
+ $F ) (Right parenthesis)\n\
+ $G > (greater-than sign)\n\
+ $H Backspace (erases previous character)\n\
+ $L < (less-than sign)\n\
+ $N Current drive\n\
+ $P Current drive and path\n\
+ $Q = (equal sign)\n\
+ $T Current time\n\
+ $V OS version number\n\
+ $_ Carriage return and linefeed\n\
+ $$ $ (dollar sign)\n"
+
+STRING_PAUSE_HELP1, "Stops the execution of a batch file and shows the following message:\n\
+'Press any key to continue...' or a user defined message.\n\n\
+PAUSE [message]"
+
+STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack"
+
+STRING_PROMPT_HELP3, "\nType PROMPT without parameters to reset the prompt to the default setting."
+
+STRING_REM_HELP, "Starts a comment line in a batch file.\n\nREM [Comment]"
+
+STRING_RMDIR_HELP, "Removes a directory.\n\n\
+RMDIR [drive:]path\nRD [drive:]path\n\
+/S Deletes all files and folders within target\n\
+/Q Doesnt prompt for user\n"
+STRING_RMDIR_HELP2, "Directory is not empty!\n"
+
+STRING_REN_HELP1, "Renames a file/directory or files/directories.\n\n\
+RENAME [/E /N /P /Q /S /T] old_name ... new_name\n\
+REN [/E /N /P /Q /S /T] old_name ... new_name\n\n\
+ /E No error messages.\n\
+ /N Nothing.\n\
+ /P Prompts for confirmation before renaming each file.\n\
+ (Not implemented yet!)\n\
+ /Q Quiet.\n\
+ /S Rename subdirectories.\n\
+ /T Display total number of renamed files.\n\n\
+Note that you cannot specify a new drive or path for your destination. Use\n\
+the MOVE command for that purpose.\n"
+
+STRING_REN_HELP2, " %lu file renamed\n"
+
+STRING_REN_HELP3, " %lu files renamed\n"
+
+STRING_SHIFT_HELP, "Changes the position of replaceable parameters in a batch file.\n\n\
+SHIFT [DOWN]"
+
+STRING_SCREEN_HELP, "move cursor and optionally print text\n\n\
+SCREEN row col [text]\n\n\
+ row row to wich move the cursor\n\
+ col column to wich move the cursor"
+
+STRING_SET_HELP, "Displays, sets, or removes environment variables.\n\n\
+SET [variable[=][string]]\n\n\
+ variable Specifies the environment-variable name.\n\
+ string Specifies a series of characters to assign to the variable.\n\n\
+Type SET without parameters to display the current environment variables.\n"
+
+STRING_START_HELP1, "Starts a command.\n\n\
+START command\n\n\
+ command Specifies the command to run.\n\n\
+At the moment all commands are started asynchronously.\n"
+
+STRING_TITLE_HELP, "Sets the window title for the command prompt window.\n\n\
+TITLE [string]\n\n\
+string Specifies the title for the command prompt window.\n"
+
+STRING_TIME_HELP1, "Displays or sets the system time.\n\n\
+TIME [/T][time]\n\n\
+ /T display only\n\n\
+Type TIME with no parameters to display the current time setting and a prompt\n\
+for a new one. Press ENTER to keep the same time.\n"
+
+STRING_TIME_HELP2, "Enter new time: "
+
+STRING_TIMER_HELP1, "Elapsed %d msecs\n"
+
+STRING_TIMER_HELP2, "Elapsed %02d%c%02d%c%02d%c%02d\n"
+
+STRING_TIMER_HELP3, "allow the use of ten stopwatches.\n\n\
+TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
+ ON set stopwatch ON\n\
+ OFF set stopwatch OFF\n\
+ /S Split time. Return stopwatch split\n\
+ time without changing its value\n\
+ /n Specifiy the stopwatch number.\n\
+ Stopwatches available are 0 to 9\n\
+ If it is not specified default is 1\n\
+ /Fn Format for output\n\
+ n can be:\n\
+ 0 milliseconds\n\
+ 1 hh%cmm%css%cdd\n\n\
+if none of ON, OFF or /S is specified the command\n\
+will toggle stopwatch state\n\n"
+
+STRING_TYPE_HELP1, "Displays the contents of text files.\n\nTYPE [drive:][path]filename \n\
+ /P Shows one screen of output at a time.\n"
+
+STRING_VERIFY_HELP1, "This command is just a dummy!!\n\
+Sets whether to verify that your files are written correctly to a\n\
+disk.\n\n\
+VERIFY [ON | OFF]\n\n\
+Type VERIFY without a parameter to display the current VERIFY setting.\n"
+
+STRING_VERIFY_HELP2, "VERIFY is %s.\n"
+
+STRING_VERIFY_HELP3, "Must specify ON or OFF."
+
+STRING_VERSION_HELP1, "Displays shell version information\n\n\
+VER [/C][/R][/W]\n\n\
+ /C Displays credits.\n\
+ /R Displays redistribution information.\n\
+ /W Displays warranty information."
+
+STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\
+type: `ver /w'. This is free software, and you are welcome to redistribute\n\
+it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\
+listing of credits."
+
+STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\
+ GNU General Public License for more details."
+
+STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\
+ it under the terms of the GNU General Public License as published by\n\
+ the Free Software Foundation; either version 2 of the License, or\n\
+ (at your option) any later version.\n"
+
+STRING_VERSION_HELP5, "\nSend bug reports to <ros-dev@reactos.org>.\n\
+Updates are available at: http://www.reactos.org"
+
+STRING_VERSION_HELP6, "\nFreeDOS version written by:\n"
+
+STRING_VERSION_HELP7, "\nReactOS version written by:\n"
+
+STRING_VOL_HELP1, " Volume in drive %c: is %s"
+STRING_VOL_HELP2, " Volume in drive %c: has no label"
+STRING_VOL_HELP3, " Volume Serial Number is %04X-%04X\n"
+STRING_VOL_HELP4, "Displays the disk volume label and serial number, if they exist.\n\nVOL [drive:]"
+
+STRING_WINDOW_HELP1, "change console window aspect\n\n\
+WINDOW [/POS[=]left,top,width,heigth]\n\
+ [MIN|MAX|RESTORE] ['title']\n\n\
+/POS specify window placement and dimensions\n\
+MIN minimize the window\n\
+MAX maximize the window\n\
+RESTORE restore the window"
+
+STRING_WINDOW_HELP2, "change console window aspect\n\n\
+ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\
+ [MIN|MAX|RESTORE] ['title']\n\n\
+window tile of window on wich perform actions\n\
+/POS specify window placement and dimensions\n\
+MIN minimize the window\n\
+MAX maximize the window\n\
+RESTORE restore the window\n\
+title new title\n"
+
+
+STRING_HELP1, "List of all available commands (+ description)\n\n\
+ command /? For more information on a specific command\n\n\
+? List all available commands without description).\n\
+ALIAS Sets, removes or shows aliases.\n\
+ATTRIB Displays or changes file attributes.\n\
+BEEP Beep the speaker.\n\
+CALL Calls one batch program from another.\n\
+CD Displays the name of or changes the current directory.\n\
+CHCP Displays or sets the active code page number.\n\
+CHOICE Waits for the user to choose one of a set of choices.\n\
+CLS Clears the screen.\n\
+CMD Starts a new instance of the ReactOS command interpreter.\n\
+COLOR Sets the default console foreground and background colors.\n\
+COPY Copies one or more files to another location.\n\
+DATE Displays or sets the date.\n\
+DELETE Deletes one or more files.\n\
+DIR Displays a list of files and subdirectories in a directory.\n\
+ECHO Displays messages, or turns command echoing on or off.\n\
+ERASE Deletes one or more files.\n\
+EXIT Quits the CMD.EXE program (command interpreter).\n\
+FOR Runs a specified command for each file in a set of files.\n\
+FREE (free) disc space.\n\
+GOTO Directs the ReactOS command interpreter to a labeled line in\n\
+ a batch program.\n\
+HELP Provides Help information for ReactOS commands.\n\
+HISTORY List alle commands which has been used\n\
+IF Performs conditional processing in batch programs.\n\
+LABEL Creates, changes, or deletes the volume label of a disk.\n\
+MD Creates a directory.\n\
+MKDIR Creates a directory.\n\
+MOVE Moves one or more files from one directory to another\n\
+ directory.\n\
+PATH Displays or sets a search path for executable files.\n\
+PAUSE Suspends processing of a batch file and displays a message.\n\
+POPD Restores the previous value of the current directory saved by\n\
+ PUSHD.\n\
+PROMPT Changes the command prompt.\n\
+PUSHD Saves the current directory then changes it.\n\
+RD Removes a directory.\n\
+REM Records comments (remarks) in batch files.\n\
+REN Renames a file or files.\n\
+RENAME Renames a file or files.\n\
+RMDIR Removes a directory.\n\
+SCREEN Move cursor and optionally print text.\n\
+SET Displays, sets, or removes ReactOS environment variables.\n\
+SHIFT Shifts the position of replaceable parameters in batch files.\n"
+STRING_HELP2, "START Starts a separate window to run a specified program or command.\n\
+ Executes command.\n\
+TIME Displays or sets the system time.\n\
+TIMER Allow the use of ten stopwaches.\n\
+TITLE Sets the window title for a CMD.EXE session.\n\
+TYPE Displays the contents of a text file.\n\
+VER Displays the ReactOS version.\n\
+VERIFY Tells ReactOS whether to verify that your files are written\n\
+ correctly to a disk.\n\
+VOL Displays a disk volume label and serial number.\n"
+
+
+STRING_CHOICE_OPTION, "YN"
+STRING_COPY_OPTION, "YNA"
+
+
+STRING_ALIAS_ERROR, "Command line too long after alias expansion!\n"
+STRING_BATCH_ERROR, "Error opening batch file\n"
+STRING_CHCP_ERROR1, "Active code page: %u\n"
+STRING_CHCP_ERROR4, "Invalid code page\n"
+STRING_CHOICE_ERROR, "Invalid option. Expected format: /C[:]options"
+STRING_CHOICE_ERROR_TXT, "Invalid option. Expected format: /T[:]c,nn"
+STRING_CHOICE_ERROR_OPTION, "Illegal Option: %s"
+STRING_MD_ERROR, "A subdirectory or file already exists.\n"
+STRING_MD_ERROR2, "The path to the new folder does not exist.\n"
+STRING_CMD_ERROR1, "Can't redirect input from file %s\n"
+STRING_CMD_ERROR2, "Error creating temporary file for pipe data\n"
+STRING_CMD_ERROR3, "Can't redirect to file %s\n"
+STRING_CMD_ERROR4, "Running %s...\n"
+STRING_CMD_ERROR5, "Running cmdexit.bat...\n"
+STRING_COLOR_ERROR1, "Same colors error! (Background and foreground can't be the same color)"
+STRING_COLOR_ERROR2, "error in color specification"
+STRING_COLOR_ERROR3, "Color %x\n"
+STRING_COLOR_ERROR4, "same colors error!"
+STRING_CONSOLE_ERROR, "Unknown error: %d\n"
+STRING_COPY_ERROR1, "Error: Cannot open source - %s!\n"
+STRING_COPY_ERROR2, "Error: Can't copy onto itself!\n"
+STRING_COPY_ERROR3, "Error writing destination!\n"
+STRING_COPY_ERROR4, "Error: Not implemented yet!\n"
+STRING_DATE_ERROR, "Invalid date."
+STRING_DEL_ERROR5, "The file %s will be deleted! "
+STRING_DEL_ERROR6, "Are you sure (Y/N)?"
+STRING_DEL_ERROR7, "Deleting: %s\n"
+STRING_ERROR_ERROR1, "Unknown error! Error code: 0x%lx\n"
+STRING_ERROR_ERROR2, "Syntax error"
+STRING_FOR_ERROR1, "'in' missing in for statement."
+STRING_FOR_ERROR2, "no brackets found."
+STRING_FOR_ERROR3, "'do' missing."
+STRING_FOR_ERROR4, "no command after 'do'."
+STRING_FREE_ERROR1, "Invalid drive"
+STRING_FREE_ERROR2, "unlabeled"
+STRING_GOTO_ERROR1, "No label specified for GOTO"
+STRING_GOTO_ERROR2, "Label '%s' not found\n"
+
+STRING_MOVE_ERROR1, "[OK]\n"
+STRING_MOVE_ERROR2, "[Error]\n"
+
+STRING_REN_ERROR1, "MoveFile() failed. Error: %lu\n"
+
+STRING_START_ERROR1, "No batch support at the moment!"
+
+STRING_TIME_ERROR1, "Invalid time."
+
+STRING_TYPE_ERROR1, "Invalid option '/%s'\n"
+
+STRING_WINDOW_ERROR1, "window not found"
+
+
+STRING_ERROR_PARAMETERF_ERROR, "Parameter format not correct - %c\n"
+STRING_ERROR_INVALID_SWITCH, "Invalid switch - /%c\n"
+STRING_ERROR_TOO_MANY_PARAMETERS, "Too many parameters - %s\n"
+STRING_ERROR_PATH_NOT_FOUND, "Path not found\n"
+STRING_ERROR_FILE_NOT_FOUND, "File not found\n"
+STRING_ERROR_REQ_PARAM_MISSING, "Required parameter missing\n"
+STRING_ERROR_INVALID_DRIVE, "Invalid drive specification\n"
+STRING_ERROR_INVALID_PARAM_FORMAT, "Invalid parameter format - %s\n"
+STRING_ERROR_BADCOMMAND, "Bad command or filename\n"
+STRING_ERROR_OUT_OF_MEMORY, "Out of memory error.\n"
+STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary file!\n"
+STRING_ERROR_D_PAUSEMSG, "Press any key to continue . . ."
+STRING_ERROR_DRIVER_NOT_READY, "Drive not ready"
+
+STRING_PATH_ERROR, "CMD: Not in environment '%s'\n"
+
+STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter"
+STRING_VERSION_RUNVER, " running on %s"
+STRING_COPY_FILE , " %d file(s) copied\n"
+STRING_DELETE_WIPE, "wiped"
+STRING_FOR_ERROR, "bad variable specification."
+STRING_SCREEN_COL, "invalid value for col"
+STRING_SCREEN_ROW, "invalid value for row"
+STRING_TIMER_TIME "Timer %d is %s: "
+
+STRING_INVALID_OPERAND, "Invalid operand."
+STRING_EXPECTED_CLOSE_PAREN, "Expected ')'."
+STRING_EXPECTED_NUMBER_OR_VARIABLE,"Expected number or variable name."
+STRING_SYNTAX_COMMAND_INCORRECT, "The syntax of the command is incorrect."
+
+}
--- /dev/null
+#include "windows.h"
+#include "resource.h"
+/*
+ * Spanish resource file by HUMA2000
+ * Jose Pedro Fernández Pascual 2005
+ */
+
+LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
+STRINGTABLE DISCARDABLE
+{
+
+STRING_ATTRIB_HELP, "Muestra o cambia los atributos de los archivos.\n\n\
+ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\
+ [/S [/D]]\n\n\
+ + Añade un atributo\n\
+ - Borra un atributo\n\
+ R Atributo de sólo lectura\n\
+ A Atributo de archivo\n\
+ S Atributo de archivo de sistema\n\
+ H Atributo de archivo oculto\n\
+ /S Procesa los archivos coincidentes en el directorio actual \n\
+ y sus subdirectorios\n\
+ /D Procesa también los directorios\n\n\
+Type ATTRIB without a parameter to display the attributes of all files.\n"
+
+STRING_ALIAS_HELP, "Pone, borra o muestra los alias.\n\n\
+ALIAS [alias=[command]]\n\n\
+ alias Nombre para un alias.\n\
+ command Texto a ser sustituido por el alias.\n\n\
+Para mostrar todos los alias:\n\
+ ALIAS\n\n\
+Para poner un nuevo o remplazar un alias existente:\n\
+ ALIAS da=dir a:\n\n\
+Para borrar un alias de la lista de alias:\n\
+ ALIAS da="
+
+STRING_BEEP_HELP, "Emite un pitido por el altavoz.\n\nBEEP\n"
+
+STRING_CALL_HELP, "Ejecuta un arhivo por lotes desde otro archivo por lotes.\n\n\
+CALL [drive:][path]filename [batch-parameter]\n\n\
+ batch-parameter Especifica cualquier informacion de la linea de comandos\n\
+ requerida por el archivo por lotes."
+
+STRING_CD_HELP, "Cambia el directorio actual o muestra su nombre.\n\n\
+CHDIR [/D][drive:][path]\n\
+CHDIR[..|.]\n\
+CD [/D][drive:][path]\n\
+CD[..|.]\n\n\
+ .. Directorio padre.\n\
+ . Directorio actual.\n\
+ /D Cambiara la unidad y el directorio actual.\n\n\
+Escribe CD unidad: para mostrar el directorio actual en la unidad especificada.\n\
+Escribe CD sin ningun parámetro para mostrar la unidad y el directorio actual.\n"
+
+STRING_CHCP_HELP, "Muestra o configura el número de página de código activa.\n\n\
+CHCP [nnn]\n\n\
+ nnn Especifica el número de página de código activa.\n\n\
+Escribe CHCP sin ningún parámetro para mostrar el código de página activo.\n"
+
+STRING_CHOICE_HELP, "Espera a que el usuario elija entre un número de opciones.\n\n\
+CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\
+ /C[:]choices Especifica las teclas admitidas. Por defecto son SN.\n\
+ /N No muestra las posibles elecciones y ? al final del prompt.\n\
+ /S Hace que la elección sea sensible a las mayúsculas y minúsculas.\n\
+ /T[:]c,nn La elección por defecto será c después de nn segundos.\n\
+ text Prompt a mostrar. \n\n\
+ERRORLEVEL se configura al offset de la tecla que presione el usuario.\n"
+
+STRING_CLS_HELP, "Limpia la pantalla.\n\nCLS\n"
+
+STRING_CMD_HELP1, "\nComandos internos disponibles:\n"
+
+STRING_CMD_HELP2, "\nCaracterísticas disponibles:"
+
+STRING_CMD_HELP3," [alias]"
+
+STRING_CMD_HELP4," [historia]"
+
+STRING_CMD_HELP5," [Completador de nombres de archivos unix]"
+
+STRING_CMD_HELP6," [Pila de directorios]"
+
+STRING_CMD_HELP7," [Redirecciones y túneles]"
+
+STRING_CMD_HELP8, "Comienza una nueva sesion del interprete de comandos de ReactOS.\n\n\
+CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\
+ /C command Ejecuta el comando especificado y cierra.\n\
+ /K command Ejecuta eñ comando especificado y permanece.\n\
+ /P CMD se hace permanente y ejecuta el autoexec.bat\n\
+ (no puede ser cerrado).\n\
+ /T:bf Configura el color de fondo/primer plano (mirar el comando COLOR).\n"
+
+STRING_COLOR_HELP1, "Configura el color de primer plano y fondo.\n\n\
+COLOR [attr [/-F]] \n\n\
+ attr Especifica el atributo de color de salida de consola.\n\
+ /-F No rellena el espacio en blanco de la consola con el color del atributo.\n\n\
+Hay tres maneras de especificar los colores:\n\
+1) [bright] nombre on [bright] nombre (solo las tres primeras letras del nombre son necesarias)\n\
+2) decimal on decimal\n\
+3) dos dígitos hexadecimales\n\n\
+Los colores son:\n\
+dec hex nombre dec hex name\n\
+0 0 Negro 8 8 Gris(Negro brillante)\n\
+1 1 Azul 9 9 Azul brillante\n\
+2 2 Verde 10 A Verde brillante\n\
+3 3 Cyan 11 B Cyan brillante\n\
+4 4 Rojo 12 C Rojo brillante\n\
+5 5 Magenta 13 D Magenta brillante\n\
+6 6 Amarillo 14 E Amarillo brillante\n\
+7 7 Blanco 15 F Blanco brillante\n"
+
+STRING_COPY_HELP1, "Sobreescribir %s (Si/No/Todos)? "
+
+STRING_COPY_HELP2, "Copia uno o mas archivos a otro lugar.\n\n\
+COPY [/V][/Y|/-Y][/A|/B] origen [/A|/B]\n\
+ [+ origen [/A|/B] [+ ...]] [destino [/A|/B]]\n\n\
+ origen Especifica el archivo o archivos a copiar.\n\
+ /A Indica un archivo de texto ASCII.\n\
+ /B Indica un archivo binario.\n\
+ destino Especifica el directorio y/o nombre de archivo para los nuevos archivos.\n\
+ /V Verifica que el nuevo archivo se ha escrito correctamente.\n\
+ /Y Suprime la confirmación sobre si quieres sobreescribir un archivo\n\
+ de destino existente.\n\
+ /-Y Hace que te pregunte si quieres sobreescribir un archivo de destino\n\
+ existente.\n\n\
+El parametro /Y tiene que estar presente en las variables de entorno de COPYCMD.\n\
+...\n"
+
+STRING_DATE_HELP1, "\nIntroduce la nueva fecha (mm%cdd%cyyyy): "
+
+STRING_DATE_HELP2, "\nIntroduce la nueva fecha (dd%cmm%cyyyy): "
+
+STRING_DATE_HELP3, "\nIntroduce la nueva fecha (yyyy%cmm%cdd): "
+
+STRING_DATE_HELP4, "Muestra o cambia la fecha.\n\n\
+DATE [/T][date]\n\n\
+ /T Sólo la muestra\n\n\
+Escribe DATE sin parámetros para mostrar la fecha actual y establecer\n\
+una nueva fecha. Pulsa INTRO para mantener la misma fecha.\n"
+
+STRING_DEL_HELP1, "Borra uno o mas archivos.\n\n\
+DEL [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\
+DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\
+ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\n\
+ archivo Espacifica el/los archivo(s) a borrar.\n\n\
+ /N Nada.\n\
+ /P Prompt. Pregunta antes de borar cada archivo\n\
+ /T Total. Muestra el número total de archivos eliminados y el espacio\n\
+ liberado en disco\n\
+ /Q Modo silencioso.\n\
+ /W Limpiar. Sobreescribe el archivo con números aleatorios después de eliminarlo.\n\
+ /Y Si. Borra incluso *.* sin preguntar.\n\
+ /F Fuerza el borrade de archivos ocultos, de sólo lectura y de sistema.\n\
+ /S Borra los archivos de todos los subdirectorios.\n\
+ /A Selecciona los archivos a borrar en base a los atributos especificados.\n\
+ R Archivos de sólo lectura\n\
+ S Archivos de sistema\n\
+ A Archivos listos para archivar\n\
+ H Archivos ocultos\n\
+ - Prefijo que signifca sin\n"
+
+STRING_DEL_HELP2, "¡Todos los archivos del directorio van a ser borrados!\n¿Estás seguro? (S/N)?"
+STRING_DEL_HELP3, " Archivo %lu borrado\n"
+STRING_DEL_HELP4, " Archivos %lu borrados\n"
+
+STRING_DELAY_HELP, "Espera por n segundos o milisegundos\n\
+DELAY [/m]n\n\n\
+ /m Especifica que n son milisegundos\n\
+ En otro caso n son segundos\n"
+
+STRING_DIR_HELP1, "DIR [unidad:][ruta][nombre de archivo] [/A[[:]atributos]] [/B] [/C] [/D] [/L] [/N]\n\
+ [/O[[:]orden]] [/P] [/Q] [/S] [/T[[:]fecha]] [/W] [/X] [/4]\n\n\
+ [unidad:][ruta][nombre de archivo]\n\
+ Especifica la unidad, el directorio o los archivos a listar.\n\n\
+ /A Muestra los archivos con los atributos especificados.\n\
+ atributos D Directorios R Archivos de sólo lectur\n\
+ H Archivos ocultos A Archivos listos para archivar\n\
+ S Archivos de sistema - Prefijo que signifca sin\n\
+ /B Usa el formato simple (sin encabezado ni sumario).\n\
+ /C Muestra el separador de miles en los tamaños de los archivos. Es la opción\n\
+ por defecto. Usa /-C para desactivar el mostrar el separador.\n\
+ /D Lo mismo que el formato a lo ancho, pero ordenados en columna.\n\
+ /L Usa minúsculas.\n\
+ /N Nuevo formato de lista larga donde los nombres de archivo están a la \n\
+ derecha.\n\
+ /O Muestra los archivos ordenados según el orden especificado.\n\
+ ordenación N Por nombre (alfabético) S Por tamaño (los menores primero)\n\
+ E Por extensión (alfabético) D Por fecha/hora (los antiguos primero)\n\
+ G Los directorios primero - Prefijo para el orden inverso\n\
+ /P Pausa después de cada pantalla llena de información.\n\
+ /Q Muestra el propietario del archivo.\n\
+ /S Muestra los archivos en el directorio especificado y sus subdirectorios.\n\
+ /T Controla que campo de tiempo se muestra o es usado para ordenar:\n\
+ campo de tiempo C Creación\n\
+ A Último acceso\n\
+ W Última escritura\n\
+ /W Usa el formato de lista a lo ancho.\n\
+ /X Muestra los nombres cortos generados para archivos que no tienen un\n\
+ nombre 8.3. El formato es como /N pero con el nombre corto colocado\n\
+ antes del nombre largo. Si no hay nombre corto, se muestran espacios\n\
+ en blanco en su lugar.\n\
+ /4 Muestra los cuatro dígitos del año\n\n\
+Los modificadores pueden estar presentes en la variable de entorno de DIRCMD. Omite los\n\
+ajustes previos anteponiendo a cualquier modificador - (hyphen)--por ejemplo, /-W.\n"
+
+STRING_DIR_HELP2, " El volumen en la unidad %c es %s\n"
+STRING_DIR_HELP3, " El volumen en la unidad %c no tiene etiqueta.\n"
+STRING_DIR_HELP4, " El volumen Serial Number is %04X-%04X\n"
+STRING_DIR_HELP5, "\n Total de archivos mostrados:\n%16i archivo(s)% 14s bytes\n"
+STRING_DIR_HELP6, "%16i Directorio(s)% 15s bytes\n"
+STRING_DIR_HELP7, "\n Directorio %s\n\n"
+STRING_DIR_HELP8, "%16i archivo(s)% 14s bytes\n"
+
+STRING_DIRSTACK_HELP1, "Almacena el directorio actual para usarlo por el comando, \n\
+entonces cambia al directorio especificado.\n\n\
+PUSHD [ruta | ..]\n\n\
+ ruta Especifica el directorio para hacerlo el directorio actual\n"
+
+STRING_DIRSTACK_HELP2, "Cambia al directorio guardado por el comando PUSHD.\n\nPOPD"
+
+STRING_DIRSTACK_HELP3, "Muestra el contenido de la pila de directorios.\n\nDIRS"
+
+STRING_DIRSTACK_HELP4, "Vacia la pila de directorios"
+
+STRING_ECHO_HELP1, "Muestra un mensaje sin necesidad de pulsar intro y \n\
+salta a la siguiente linea.\n\n\
+ ECHOS mensaje"
+
+STRING_ECHO_HELP2, "Muestra los mensajes de error por defecto.\n\n\
+ ECHOERR mensaje\n\
+ ECHOERR. Imprime una linea vacia"
+
+STRING_ECHO_HELP3, "Muestra mensajes en la salida estandar de error sin pulsar intro y\n\
+pasa de linea.\n\n\
+ ECHOSERR mensaje"
+
+STRING_ECHO_HELP4, "Muestra un mensaje o cambia el mostrar los comandos activo/inactivo.\n\n\
+ ECHO [ON | OFF]\n\
+ ECHO [mensaje]\n\
+ ECHO. Muestra una linea vacia\n\n\
+Escribe ECHO sin parámetros para mostrar la configuración actual de ECHO."
+
+STRING_ECHO_HELP5, "ECHO está %s\n"
+
+STRING_EXIT_HELP, "Sale del interprete de la linea de comandos.\n\nEXIT\n"
+
+STRING_FOR_HELP1, "Ejecuta un comando específico para cada archivo de un grupo de archivos.\n\n\
+FOR %variable IN (grupo) DO comando [parametros]\n\n\
+ %variable Especifica un parámetro remplazable.\n\
+ (set) Especifica un grupo de uno o mas archivos. Los comodines pueden usarse.\n\
+ command Especifica el comando a ejecutar para cada archivo.\n\
+ parameters Especifica los parametros o modificadores para el comando especificado.\n\n\
+Para usar el comando FOR en un archivo por lotes, especifica %%variable en lugar de\n\
+%variable.\n"
+
+STRING_FREE_HELP1, "\nEl volumen en la unidad %s es %-11s\n\
+ El número de serie es %s\n\
+ %16s bytes totales de espacio en disco\n\
+ %16s bytes usados\n\
+ %16s bytes libres\n"
+
+STRING_FREE_HELP2, "Muestra la información de la unidad.\n\nFREE [unidad: ...]\n"
+
+STRING_IF_HELP1, "Ejecuta procesos condicionales en archivos por lotes.\n\n\
+ IF [NOT] ERRORLEVEL número comando\n\
+ IF [NOT] string1==string2 comando\n\
+ IF [NOT] EXIST archivo comando\n\
+ IF [NOT] DEFINED variable comando\n\n\
+NOT Especifica que CMD solo llevará a cabo el comando si la \n\
+ condición es falsa.\n\
+ERRORLEVEL número Especifica una condición verdadera si el último programa devuelve\n\
+ un código de salida igual o superior al número especificado.\n\
+comando Especifica el comando a ejecutar si se cumple la condición.\n\
+string1==string2 Especifica una condición verdadera si las cadenas de texto coinciden.\n\
+EXIST archivo Especifica una condición verdadera si existe el archivo especificado.\n\
+DEFINED variable Especifica una condición verdadera si la variable está definida.\n"
+
+STRING_GOTO_HELP1, "Manda al CMD a una linea etiquetada en un archivo por lotes.\n\n\
+GOTO etiqueta\n\n\
+ etiqueta Especifica la cadena de texto usada en el archivo por lotes como etiqueta.\n\n\
+Escriba la etiqueta en la linea misma, empezando con dos puntos."
+
+STRING_LABEL_HELP1, "Muestra o cambia la etiqueta de una unidad.\n\nLABEL [unidad:][etiqueta]\n"
+
+STRING_LABEL_HELP2, "El volumen en la unidad %c: es %s\n"
+STRING_LABEL_HELP3, "El volumen en la unidad %c: no tiene etiqueta\n"
+STRING_LABEL_HELP4, "El número de serie del volumen es %04X-%04X\n"
+STRING_LABEL_HELP5, "Etiqueta del volumen (11 Caracteres, INTRO para ninguna)? "
+
+STRING_LOCALE_HELP1, "La hora actual es"
+
+STRING_MKDIR_HELP, "Crea un directorio.\n\n\
+MKDIR [unidad:]ruta\nMD [unidad:]ruta"
+
+STRING_MEMMORY_HELP1, "Muestra la cantidad de memoria del sistema.\n\nMEMORY"
+
+STRING_MEMMORY_HELP2, "\n %12s%% carga de memoria.\n\n\
+ %13s bytes totales de RAM física.\n\
+ %13s bytes libres de RAM física.\n\n\
+ %13s bytes totales del archivo de paginación.\n\
+ %13s bytes disponibles del archivo de paginación.\n\n\
+ %13s bytes totales de memoria virtual.\n\
+ %13s bytes disponibles de memoria virtual.\n"
+
+STRING_MISC_HELP1, "Pulsa cualquier tecla para continuar...\n"
+
+STRING_MOVE_HELP1, "¿Sobreescribir %s (Si/No/Todos)? "
+
+STRING_MOVE_HELP2, "Mueve archivos y renombra archivos y directorios.\n\n\
+Para mover uno o más archivos:\n\
+MOVE [/N][unidad:][ruta]archivo1[,...] destino\n\n\
+Para renombrar un directorio:\n\
+MOVE [/N][unidad:][ruta]directorio1 directorio2\n\n\
+ [unidad:][ruta]archivo1 Especifica la localización y el nombre del archivo\n\
+ o archivos que quieres mover.\n\
+ /N Nada. Hace todo menos mover archivos o directorios.\n\n\
+Limitaciones actules:\n\
+ - No puedes mover un archivo o directorio de una unidad a otra.\n"
+
+STRING_MSGBOX_HELP, "Muestra un cuadro de mensaje y devuelve la respuesta del usuario.\n\n\
+MSGBOX tipo ['titulo'] pregunta\n\n\
+tipo buton a mostrar\n\
+ los valores posibles son: OK, OKCANCELAR,\n\
+ SINO, SINOCANCELAR\n\
+titulo titulo del cuadro de mensaje\n\
+pregunta texto a mostrar por el cuadro de mensaje\n\n\n\
+ERRORLEVEL se configurara en función del botón pulsado:\n\n\
+SI : 10 | NO : 11\n\
+OK : 10 | CANCELAR: 12\n"
+
+STRING_PATH_HELP1, "Muestra o cambia la ruta de búsqueda de archivos ejecutables.\n\n\
+PATH [[unidad:]ruta[;...]]\nRuta ;\n\n\
+Escribe PATH ; para limpiar todas las configuraciones de búsqueda y usar solo el\n\
+directorio actual del interprete de comandos.\n\
+Escribe PATH sin parámetros para mostrar la ruta actual.\n"
+
+STRING_PROMPT_HELP1, "Cambia el símbolo de comandos.\n\n\
+PROMPT [texto]\n\n\
+ texto Epecifica un nuevo símbolo de comandos.\n\n\
+El símbolo de comandos puede hacerce con carácteres normales y los siguientes \n\
+códigos especiales:\n\n\
+ $A & (Signo y)\n\
+ $B | (Linea horizontal)\n\
+ $C ( (Paréntesis izquierdo)\n\
+ $D Fecha actual\n\
+ $E Código de escape (código ASCII 27)\n\
+ $F ) (Paréntesis derecho)\n\
+ $G > (Signo mayor que)\n\
+ $H Borra el caracter anterior\n\
+ $L < (Signo menor que)\n\
+ $N Unidad actual\n\
+ $P Unidad y ruta actuales\n\
+ $Q = (signo igual)\n\
+ $T Hora actual\n\
+ $V Número de versión del SO\n\
+ $_ Salto de linea\n\
+ $$ $ (signo del dolar)\n"
+
+STRING_PAUSE_HELP1, "Detiene la ejecución del archivo por lotes actual y muestra el\n\
+siguiente mensaje:\n\
+'Pulsa cualquier tecla para continuar...' o un mensaje definido por el usuario.\n\n\
+PAUSE [mensaje]"
+
+STRING_PROMPT_HELP2, " $+ Muestra la profundidad actual de la pila de directorios"
+
+STRING_PROMPT_HELP3, "\nEscribe PROMPT sin parámetros para resetear el símbolo de \n\
+comandos a su configuración por defecto."
+
+STRING_REM_HELP, "Comienza una liena de comentarios en un archivo por lotes\n\nREM [Comentario]"
+
+STRING_RMDIR_HELP, "Remueve un directorio.\n\n\
+RMDIR [unidad:]ruta\nRD [unidad:]ruta"
+
+STRING_REN_HELP1, "Renombra un archivo/directorio o varios archivos/directorios.\n\n\
+RENAME [/E /N /P /Q /S /T] nombre_antiguo ... nuevo_nombre\n\
+REN [/E /N /P /Q /S /T] nombre_antiguo ... nuevo_nombre\n\n\
+ /E No muestra mensajes de error.\n\
+ /N Nada.\n\
+ /P Pregunta por la confirmación antes de cada archivo.\n\
+ (¡No implementado aún!)\n\
+ /Q Modo silencioso.\n\
+ /S Renombra los subdirectorios.\n\
+ /T Muestra el número total de archivos renombrados.\n\n\
+Note que no puede especificar una nueva unidad en el destino o ruta. Usa\n\
+el comando MOVE para este propósito.\n"
+
+STRING_REN_HELP2, " %lu archivos renombrados.\n"
+
+STRING_REN_HELP3, " %lu archivos renombrados.\n"
+
+STRING_SHIFT_HELP, "Cambia la posición de los parámetros remplazables en un \n\
+archivo por lotes.\n\n\
+SHIFT [ABAJO]"
+
+STRING_SCREEN_HELP, "Mueve el cursor y opcionalmente escribe un texto.\n\n\
+SCREEN fila columna [texto]\n\n\
+ fila Fila a la que mover el cursor.\n\
+ columna columna a la que mover el cursor."
+
+STRING_SET_HELP, "Muestra, cambia o borra las variables de entorno.\n\n\
+SET [variable[=][cadena]]\n\n\
+ variable Especifica el nombre de la variable de entorno.\n\
+ string Especifies la serie de caracteres para asignar a la variable.\n\n\
+Escribe SET sin parámetros para mostrar las variables de entorno actuales.\n"
+
+STRING_START_HELP1, "Empieza un comando.\n\n\
+START comando\n\n\
+ comando Especifica el comando a ejecutar.\n\n\
+Por el momento todos los comandos son ejecutados de forma asincrónica.\n"
+
+STRING_TITLE_HELP, "Cambia el título de la ventqana del intérprete de comandos.\n\n\
+TITLE [cadena]\n\n\
+cadena Especifica el título de la ventana del intérprete de comandos.\n"
+
+STRING_TIME_HELP1, "Muestra o cambia la hora del sistema.\n\n\
+TIME [/T][hora]\n\n\
+ /T Sólo la muestra\n\n\
+Escribe TIME sin parámetros para mostrar la hora actual y preguntar\n\
+por una nueva. Pulsa INTRO para mantener la misma hora.\n"
+
+STRING_TIME_HELP2, "Introduce la nueva hora: "
+
+STRING_TIMER_HELP1, "Transcurridos %d msecs\n"
+
+STRING_TIMER_HELP2, "Transcurridos %02d%c%02d%c%02d%c%02d\n"
+
+STRING_TIMER_HELP3, "Permite al usuario el uso de diez paradas de reloj.\n\n\
+TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
+ ON Cambia la parada a ON\n\
+ OFF Cambia la parada a OFF\n\
+ /S Divide el tiempo. Devuelve una division de la parada del reloj\n\
+ sin cambiar su valor.\n\
+ /n Especifica el número de la parada de reloj.\n\
+ Las paradas de reloj disponibles son de 0 a 9\n\
+ Si no se especifica el valor por defecto es 1\n\
+ /Fn Formato de salida\n\
+ n puede ser:\n\
+ 0 millisegundos\n\
+ 1 hh%cmm%css%cdd\n\n\
+Si ni ON, OFF o /S se especifican, el comando\n\
+cambiara el estado de parada del reloj\n\n"
+
+STRING_TYPE_HELP1, "Muestra los contenidos de un archivo de texto.\n\nTYPE [unidad:][ruta]archivo \n\
+ /P Muestra sólo una pantalla de salida cada vez.\n"
+
+STRING_VERIFY_HELP1, "¡¡Este comando es solo de relleno!!\n\
+Configura si hay que verificar que los archivos se and escrito correctamente\n\
+en un disco.\n\n\
+VERIFY [ON | OFF]\n\n\
+Escribe VERIFY sin parámetros para mostrar la configuración actual de VERIFY.\n"
+
+STRING_VERIFY_HELP2, "VERIFY está %s.\n"
+
+STRING_VERIFY_HELP3, "Tienes que especificar ON o OFF."
+
+STRING_VERSION_HELP1, "Muestra la información de la versión del shell\n\n\
+VER [/C][/R][/W]\n\n\
+ /C Muestra los creditos.\n\
+ /R Muestra la información de redistribución.\n\
+ /W Muestra la información de la garantia."
+
+STRING_VERSION_HELP2, "Este software Viene con ABSOLUTAMENTE NINGUNA GARANTIA; para más detalles\n\
+escribe: `ver /w'. Este es un software gratuito, y estás invitado a redistribuirlo\n\
+bajo ciertas condiciones; escribe `ver /r' para los detalles. Escribe `ver /c' para una\n\
+lista de los créditos."
+
+STRING_VERSION_HELP3, "\n Este programa es distribuido con la esperanza de que sea útil,\n\
+ pero CON NINGUNA GARANTIA; incluso sin la garantía implícita de\n\
+ MERCADERIA o AJUSTE A UN PROPÓSITO PARTICULAR. Mira la\n\
+ Licencia Pública General GNU para más detalles."
+
+STRING_VERSION_HELP4, "\n Este programa es un software gratuito; puedes redistribuirlo y/o modificarlo\n\
+ bajo los términos de la Licencia Pública General GNU tal y como establece\n\
+ la Fundación de Software Libre; tanto en la versión 2 de la Licencia, o\n\
+ (según tu elección) cualquier otra posterior.\n"
+
+STRING_VERSION_HELP5, "\nManda los informes de bugs a <ros-dev@reactos.org>.\n\
+Actualizaciones disponibles en: http://www.reactos.org"
+
+STRING_VERSION_HELP6, "\nFreeDOS version escrita por:\n"
+
+STRING_VERSION_HELP7, "\nReactOS version escrita por:\n"
+
+STRING_VOL_HELP1, " El volumen en la unidad %c: es %s"
+STRING_VOL_HELP2, " El volumen en la unidad %c: no tiene etiqueta"
+STRING_VOL_HELP3, " El número de serie del volumen es %04X-%04X\n"
+STRING_VOL_HELP4, "Muestra la etiqueta del volumen del disco y el número de serie si existen.\n\nVOL [unidad:]"
+
+STRING_WINDOW_HELP1, "Cambia el aspecto de la ventana de la consola.\n\n\
+WINDOW [/POS[=]left,top,width,heigth]\n\
+ [MIN|MAX|RESTORE] ['title']\n\n\
+/POS Especifica la posición y dimensión de la ventana\n\
+MIN minimiza la ventana\n\
+MAX maximiza la ventana\n\
+RESTORE restaura la ventana"
+
+STRING_WINDOW_HELP2, "Cambia el aspecto de la ventana de la consola.\n\n\
+ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\
+ [MIN|MAX|RESTORE] ['title']\n\n\
+window Título de la ventana en la que realizar las acciónes\n\
+/POS Especifica la posición y dimensión de la ventana\n\
+MIN minimiza la ventana\n\
+MAX maximiza la ventana\n\
+RESTORE restaura la ventana\n\
+title Nuevo título\n"
+
+
+STRING_HELP1, "Lista de todos los comandos disponibles (+ descripción)\n\n\
+ comando /? Para más información del comando especificado.\n\n\
+? Muestra todos los comandos disponibles sin la descripción.\n\
+ALIAS Crea, borra o muestra los alias.\n\
+ATTRIB Muestra o cambia los atributos de archivo.\n\
+BEEP Hace un beep con el altavoz.\n\
+CALL Llama a un archivo por lotes desde otro.\n\
+CD Muestra o cambia el directorio actual.\n\
+CHCP Muestra o cambia el código de página activo.\n\
+CHOICE Espera a que el usuario elija una opción de un grupo de opciones.\n\
+CLS Limpia la pantalla.\n\
+CMD Comienza una nueva instancia del intérprete de comandos.\n\
+COLOR Configura el color por defecto de fondo y frente de la consola.\n\
+COPY Copia uno o varios archivos de una localización a otra.\n\
+DATE Muestra y cambia la fecha.\n\
+DELETE Borra uno o más archivos.\n\
+DIR Muestra una lista de los archivos y subdirecctorios en un directorio.\n\
+ECHO Muestra mensajes, o cambia un comando entre mostrarlos o no.\n\
+ERASE Borra uno o más archivos.\n\
+EXIT Sale del programa CMD.EXE (intérprete de comandos).\n\
+FOR Ejecuta un comando específico en un grupo de archivos.\n\
+FREE Espacio libre en disco.\n\
+GOTO Direcciona la ventana del intérprete de comandos a una linea etiquetada\n\
+ en un archivo por lotes.\n\
+HELP Proporciona ayuda sobre los comandos para ReactOS.\n\
+HISTORY Muestra todos los comandos que han sido usados.\n\
+IF Realiza un proceso condicional en un archivo por lotes.\n\
+LABEL Crea, cambia, o borra la etiqueta de volumen de un disco.\n\
+MD Crea un directorio.\n\
+MKDIR Crea un directorio.\n\
+MOVE Mueve uno o más archivos de un directorio a otro.\n\
+PATH Muestra o configura las rutas de búsqueda para archivos ejecutables.\n\
+PAUSE Suspende el procesamiento de un archivo por lotes y muestra un mensaje.\n\
+POPD Restaura el valor anterior del directorio actual guardado por PUSHD.\n\
+PROMPT Cambia el símbolo del sistema del intéprete de comandos.\n\
+PUSHD Guarda el directorio actual y después lo cambia.\n\
+RD Borra un directorio.\n\
+REM Marca comentarios en archivos por lotes.\n\
+REN Renombra un archivo o varios archivos.\n\
+RENAME Renombra un archivo o varios archivos.\n\
+RMDIR Borra un directorio.\n\
+SCREEN Mueve el cursor y opcionalmente escribe un texto.\n\
+SET Muestra, cambia o borra variables del entorno de la ventana.\n\
+SHIFT Marca la posición de parámetros remplazables en un archivo por lotes.\n"
+
+STRING_HELP2, "START Abre una ventana separada para ejecutar un programa o comando específicod.\n\
+ Ejecuta CMD.\n\
+TIME Muestra o cambia la hora del sistema.\n\
+TIMER Permite al usuario diez paradas para ver.\n\
+TITLE Configura el título de la ventama de la sesión de CMD.EXE.\n\
+TYPE Muestra el contenido de un archivo de texto.\n\
+VER Muestra la versión de ReactOS.\n\
+VERIFY Le dice a ReactOS que verifique que cada archivo se escriba.\n\
+ corectamente en el disco.\n\
+VOL Muestra la etiqueta de volumen y el número de serie del disco.\n"
+
+
+STRING_CHOICE_OPTION, "SN"
+STRING_COPY_OPTION, "SNT"
+
+
+STRING_ALIAS_ERROR, "¡Linea de comandos demasiado larga tras la expansión del alias!\n"
+STRING_BATCH_ERROR, "Error abriendo el archivo por lotes\n"
+STRING_CHCP_ERROR1, "Página de códigos activa: %u\n"
+STRING_CHCP_ERROR4, "Código de página inválido\n"
+STRING_CHOICE_ERROR, "Opción inválida. Se esperaba el formato: /C[:]options"
+STRING_CHOICE_ERROR_TXT, "Opción inválida. Se esperaba el formato: /T[:]c,nn"
+STRING_CHOICE_ERROR_OPTION, "Opción ilegal: %s"
+STRING_CMD_ERROR1, "No se puede redirigir la entrada del archivo %s\n"
+STRING_CMD_ERROR2, "Error creando archivo temporal para la pila de datos\n"
+STRING_CMD_ERROR3, "No se puede redirigir el archivo %s\n"
+STRING_CMD_ERROR4, "Ejecutando %s...\n"
+STRING_CMD_ERROR5, "Ejecutando cmdexit.bat...\n"
+STRING_COLOR_ERROR1, "¡Mismos colores! (El color de frente y de fondo no pueden ser el mismo)"
+STRING_COLOR_ERROR2, "Error en la especificación del color"
+STRING_COLOR_ERROR3, "Color %x\n"
+STRING_COLOR_ERROR4, "¡Error: mismos colores!"
+STRING_CONSOLE_ERROR, "Error desconocido: %d\n"
+STRING_COPY_ERROR1, "Error: No se puede abrir el origen - %s!\n"
+STRING_COPY_ERROR2, "Error: ¡No se puede copiar sobre si mismo!\n"
+STRING_COPY_ERROR3, "¡Error escribiendo destino!\n"
+STRING_COPY_ERROR4, "Error: ¡No implementado aún!\n"
+STRING_DATE_ERROR, "Fecha incorrecta."
+STRING_DEL_ERROR5, "¡El archivo %s va a ser borrado!"
+STRING_DEL_ERROR6, "¿Estás seguro (S/N)?"
+STRING_DEL_ERROR7, "Borrando: %s\n"
+STRING_ERROR_ERROR1, "¡Error desconocido! Códige de error: 0x%lx\n"
+STRING_ERROR_ERROR2, "Error de sintaxsis"
+STRING_FOR_ERROR1, "Falta 'in' para la declaración."
+STRING_FOR_ERROR2, "No se encontraron las parénteris."
+STRING_FOR_ERROR3, "Falta 'do'."
+STRING_FOR_ERROR4, "No hay comando después de 'do'."
+STRING_FREE_ERROR1, "Unidad errónea."
+STRING_FREE_ERROR2, "Sin etiqueta"
+STRING_GOTO_ERROR1, "No se especifico etiqueta para GOTO"
+STRING_GOTO_ERROR2, "La etiqueta '%s' no se encuentra\n"
+
+STRING_MOVE_ERROR1, "[OK]\n"
+STRING_MOVE_ERROR2, "[Error]\n"
+
+STRING_REN_ERROR1, "MoveFile() falló. Error: %lu\n"
+
+STRING_START_ERROR1, "¡No hay soporte para archivos por lotes en este momento!"
+
+STRING_TIME_ERROR1, "Hora incorrecta."
+
+STRING_TYPE_ERROR1, "Opción incorrecta '/%s'\n"
+
+STRING_WINDOW_ERROR1, "Ventana no encontrada"
+
+
+STRING_ERROR_PARAMETERF_ERROR, "Formato del parámetro incorrecto - %c\n"
+STRING_ERROR_INVALID_SWITCH, "Parámetro incorrecto - /%c\n"
+STRING_ERROR_TOO_MANY_PARAMETERS, "Demasiados parámetros - %s\n"
+STRING_ERROR_PATH_NOT_FOUND, "Ruta no encontrada\n"
+STRING_ERROR_FILE_NOT_FOUND, "Archivo no encontrado\n"
+STRING_ERROR_REQ_PARAM_MISSING, "Prámetro requerido no encontrado\n"
+STRING_ERROR_INVALID_DRIVE, "Especificación de unidad errónea\n"
+STRING_ERROR_INVALID_PARAM_FORMAT, "Formato de parámetro erróneo - %s\n"
+STRING_ERROR_BADCOMMAND, "Comando o nombre de archivo erróneo\n"
+STRING_ERROR_OUT_OF_MEMORY, "Error fuera de memoria.\n"
+STRING_ERROR_CANNOTPIPE, "¡Error! ¡No se puede apilar! ¡No se puede abrir el archivo temporal!\n"
+STRING_ERROR_D_PAUSEMSG, "Pulsa una tecla para continuar . . ."
+STRING_ERROR_DRIVER_NOT_READY, "La unidad no está lista"
+
+STRING_PATH_ERROR, "CMD: No está en el entorno '%s'\n"
+
+STRING_CMD_SHELLINFO, "\nIntérprete de comandos de ReactOS"
+STRING_VERSION_RUNVER, " corriendo en %s"
+STRING_COPY_FILE , " %d archivo(s) copado(s)\n"
+STRING_DELETE_WIPE, "Limpiado"
+STRING_FOR_ERROR, "Especición de variable errónea."
+STRING_SCREEN_COL, "Valor inválido de columna"
+STRING_SCREEN_ROW, "Valor inválido de fila"
+STRING_TIMER_TIME "El temporizador %d es %s: "
+
+STRING_INVALID_OPERAND, "Operador erróneo.\n"
+STRING_EXPECTED_CLOSE_PAREN, "Se esperaba ')'.\n"
+STRING_EXPECTED_NUMBER_OR_VARIABLE,"Se esperaba un número o nombre de variable.\n"
+STRING_SYNTAX_COMMAND_INCORRECT, "La sintaxis del comando es incorrecta.\n"
+
+}
+
--- /dev/null
+#include "windows.h"
+#include "resource.h"
+/*
+ * French resources
+ * Sylvain Pétréolle 2005
+ */
+
+LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
+STRINGTABLE DISCARDABLE
+{
+
+STRING_ATTRIB_HELP, "Affiche ou change des attributs de fichiers.\n\n\
+ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\
+ [/S [/D]]\n\n\
+ + Positionne un attribut\n\
+ - Enlève un attribut\n\
+ R Fichier en lecture seule\n\
+ A Fichier archive\n\
+ S Fichier système\n\
+ H Fichier caché\n\
+ /S Traite les fichiers correspondants dans le répertoire courant\n\
+ et tous les sous-répertoires\n\
+ /D Traite également les répertoires\n\n\
+Taper ATTRIB sans paramètre pour afficher les attributs de tous les fichiers."
+
+STRING_ALIAS_HELP, "Positionne, enlève ou affiche les alias.\n\n\
+ALIAS [alias=[commande]]\n\n\
+ alias Nom de l'alias.\n\
+ commande Texte à substituer à l'alias.\n\n\
+Pour afficher tous les alias:\n\
+ ALIAS\n\n\
+Pour créer ou remplacer un alias existant:\n\
+ ALIAS da=dir a:\n\n\
+Pour effacer un alias de la liste des alias :\n\
+ ALIAS da="
+
+STRING_BEEP_HELP, "Emet un bip par le haut-parleur système.\n\nBEEP"
+
+STRING_CALL_HELP, "Appelle un programme batch depuis un autre.\n\n\
+CALL [lecteur:][chemin]fichier [paramètre-batch]\n\n\
+ paramètre-batch Spécifie les paramètres nécessaires au \n\
+ programme batch."
+
+STRING_CD_HELP, "Change ou affiche le répertoire courant\n\n\
+ CHDIR [lecteur:][chemin]\n\
+ CHDIR[..|-]\n\
+ CD [lecteur:][chemin]\n\
+ CD[..|-]\n\n\
+ .. répertoire parent\n\
+ - répertoire précédent\n\n\
+Taper CD lecteur: pour affiche le répertoire courant sur le disque indiqué.\n\
+Taper CD sans paramètre pour afficher le répertoire courant du disque actuel.\n"
+
+STRING_CHCP_HELP, "Affiche ou change la page de codes active.\n\n\
+CHCP [nnn]\n\n\
+ nnn Indique la page de codes .\n\n\
+Taper CHCP sans paramètre pour afficher la page de codes active."
+
+STRING_CHOICE_HELP, "Demande à l'utilisateur de choisir parmi plusieurs choix.\n\n\
+CHOICE [/C[:]choix][/N][/S][/T[:]c,nn][texte]\n\n\
+ /C[:]choix Spécifier les touches disponibles. Choix par défaut: ON.\n\
+ /N Ne pas afficher les choix disponibles et ? à la fin\n\
+ du texte d'invite.\n\
+ /S Traiter les touches comme différentes si ce sont\n\
+ des majuscules ou minuscules.\n\
+ /T[:]c,nn Choix par défaut après nn secondes.\n\
+ texte Texte d'invite à afficher.\n\n\
+ERRORLEVEL est modifié à l'offset de la touche enfoncée parmi les choix."
+
+STRING_CLS_HELP, "Efface l'écran.\n\nCLS"
+
+STRING_CMD_HELP1, "\nCommandes internes disponibles :\n"
+
+STRING_CMD_HELP2, "\nFonctions disponibles :"
+
+STRING_CMD_HELP3," [alias]"
+
+STRING_CMD_HELP4," [historique]"
+
+STRING_CMD_HELP5," [complétion des noms de fichiers façon unix]"
+
+STRING_CMD_HELP6," [pile de répertoires]"
+
+STRING_CMD_HELP7," [redirections et piping]"
+
+STRING_CMD_HELP8, "Démarre une nouvelle instance de l'interpréteur de commandes de ReactOS.\n\n\
+CMD [/[C|K] commande][/P][/Q][/T:ap]\n\n\
+ /C commande Lance la commande spécifiée et se termine.\n\
+ /K commande Lance la commande spécifiée et reste en mémoire.\n\
+ /P CMD devient permanent et lance autoexec.bat\n\
+ (ne peut être terminé).\n\
+ /T:ap Changer la couleur d'arrière/premier plan\n\
+ (voir la commande COLOR.)"
+
+
+STRING_COLOR_HELP1, "Change les couleurs de premier et d'arrière plan.\n\n\
+COLOR [attr [/F]] \n\n\
+ attr Spécifie l'attribut des couleurs de la console\n\
+ /F remplit la console avec l'attribut de couleur\n\n\
+Il y a trois façons de spécifier les couleurs :\n\
+1) [bright] nom on [bright] nom (seules les trois premières lettres \n\
+sont nécessaires)\n\
+2) décimal on décimal\n\
+3) deux chiffres hexadécimaux\n\n\
+Les couleurs sont:\n\
+déc hex nom déc hex nom\n\
+0 0 Black(Noir) 8 8 Gray(Bright black)\n\
+1 1 Blue(Bleu) 9 9 Bright Blue\n\
+2 2 Green(Vert) 10 A Bright Green\n\
+3 3 Cyan 11 B Bright Cyan\n\
+4 4 Red(Rouge) 12 C Bright Red\n\
+5 5 Magenta 13 D Bright Magenta\n\
+6 6 Yellow(Jaune) 14 E Bright Yellow\n\
+7 7 White(Blanc) 15 F Bright White"
+
+STRING_COPY_HELP1, "Ecraser %s (Oui/Non/Tous)? "
+
+STRING_COPY_HELP2, "Copie un ou plusieurs fichiers vers une autre destination.\n\n\
+COPY [/V][/Y|/-Y][/A|/B] source [/A|/B]\n\
+ [+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\
+ source Indique le ou les fichiers à copier.\n\
+ /A Spécifie qu'il s'agit d'un fichier texte ASCII.\n\
+ /B Spécifie qu'il s'agit d'un fichier binaire.\n\
+ destination Indique le répertoire ou le nom de fichier\n\
+ pour le(s) nouveau(x) fichier(s).\n\
+ /V Vérifie que les fichier ont été copiés correctement.\n\
+ /Y Supprime l'invite de confirmation en cas d'écrasement\n\
+ d'un fichier destination existant.\n\
+ /-Y Affiche un invite de confirmation en cas d'écrasement\n\
+ d'un fichier destination existant.\n\n\
+Le switch /Y peut être présent dans la variable d'environnement COPYCMD.\n"
+
+STRING_DATE_HELP1, "\nEntrer la nouvelle date (mm%cdd%cyyyy): "
+
+STRING_DATE_HELP2, "\nEntrer la nouvelle date (dd%cmm%cyyyy): "
+
+STRING_DATE_HELP3, "\nEntrer la nouvelle date (yyyy%cmm%cdd): "
+
+STRING_DATE_HELP4, "Affiche ou règle la date.\n\n\
+DATE [/T][date]\n\n\
+ /T affiche seulement\n\n\
+Taper DATE sans paramètre pour afficher la date courante\n\
+et une invite pour entrer la nouvelle date.\n\
+Appuyer sur ENTREE pour conserver la même date."
+
+STRING_DEL_HELP1, "Efface un ou plusieurs fichiers.\n\n\
+DEL [/N /P /T /Q /W /Y /Z] fichier ...\n\
+DELETE [/N /P /T /Q /W /Y /Z] fichier ...\n\
+ERASE [/N /P /T /Q /W /Y /Z] fichier ...\n\n\
+ fichier Specifie le(s) fichier(s) à effacer.\n\n\
+ /N Rien.\n\
+ /P Demande. Demande avant d'effacer pour chaque fichier.\n\
+ /T Total. Affiche le total de fichiers effacés et l'espace disque libéré.\n\
+ /Q Silencieux.\n\
+ /W Wipe. Ecrase le fichier avec des nombres aléatoire avant d'effacer.\n\
+ /Y Oui. Efface, même *.*, sans demander.\n\
+ /Z Zap. Efface les fichiers cachés, en lecture seule et systèmes.\n"
+
+STRING_DEL_HELP2, "Tous les fichiers du répertoire seront effacés!\n\
+Etes vous sûr(e) (O/N)?"
+STRING_DEL_HELP3, " %lu fichier effacé\n"
+STRING_DEL_HELP4, " %lu fichiers effacés\n"
+
+STRING_DELAY_HELP, "Attend pendant n secondes ou millisecondes\n\
+DELAY [/m]n\n\n\
+ /m spécifie que n est en millisecondes\n\
+ sinon n est en secondes"
+
+STRING_DIR_HELP1, "DIR [lecteur:][chemin][fichier] [/A[[:]attributs]] [/B] [/C] [/D] [/L] [/N]\n\
+ [/O[[:]ordredetri]] [/P] [/Q] [/S] [/T[[:]heure]] [/W] [/X] [/4]\n\n\
+ [lecteur:][chemin][fichier]\n\
+ Spécifie le disque, le répertoire, et/ou les fichiers à lister.\n\n\
+ /A Affiche les fichiers avec les attributs indiqués.\n\
+ attributs D Répertoires R Fichiers en lecture seule\n\
+ H Fichiers cachés A Fichiers prêts à etre archivés\n\
+ S Fichiers systèmes - Préfixe signifiant non\n\
+ /B Utilise le format court (pas d'informations ni de résumé).\n\
+ /C Affiche le séparateur de milliers dans les tailles de fichier.\n\
+ C'est l'option par défaut. Utiliser /-C pour désactiver \n\
+ l'affichage du séparateur.\n\
+ /D Identique au format large mais les fichiers sont triés\n\
+ par colonne.\n\
+ /L Utilise les minuscules.\n\
+ /N Nouveau format de liste longue où les noms de fichiers sont \n\
+ sur la droite.\n\
+ /O Lister les fichier de façon triée.\n\
+ ordre de N Par nom (alphabétique) S Par taille (plus petit d'abord)\n\
+ tri E Par extension tique) D Par date (plus vieux d'abord)\n\
+ G Répertoires d'abord - Préfixe pour inverser l'ordre\n\
+ /P S'arrête après chaque page d'information.\n\
+ /Q Affiche le propriétaire du fichier.\n\
+ /S Affiche les fichiers dans le répertoire indiqué et\n\
+ tous les sous-répertoires.\n\
+ /T Contrôle quel champ de temps sera affiché ou utilisé\n\
+ pour le tri\n\
+ C Création\n\
+ A Dernier accès\n\
+ W Dernière modification\n\
+ /W Utilise le format de liste large.\n\
+ /X Ceci affiche les noms de fichiers courts pour les noms \n\
+ de fichiers longs. Le format est comme pour /N avec\n\
+ le nom de fichier court inséré avant le nom de fichier long.\n\
+ S'il n'y a pas de nom court, des espaces seront affichés.\n\
+ /4 Affiche l'année sur quatre chiffres.\n\n\
+Les paramètres peuvent être mémorisés dans la variable d'environnement DIRCMD.\n\
+Modifier les paramètres mémorisés avec un - (tiret)--par exemple, /-W.\n"
+
+STRING_DIR_HELP2, " Le nom de volume du lecteur %c est %s\n"
+STRING_DIR_HELP3, " Le lecteur %c n'a pas de nom de volume\n"
+STRING_DIR_HELP4, " Le numéro de série du volume est %04X-%04X\n"
+STRING_DIR_HELP5, "\n Total de fichiers listés :\n%16i Fichier(s)% 14s octets\n"
+STRING_DIR_HELP6, "%16i fichier(s)% 15s octets\n"
+STRING_DIR_HELP7, "\n Répertoire de %s\n\n"
+STRING_DIR_HELP8, "%16i Rep(s)% 14s octets\n"
+STRING_DIRSTACK_HELP1, "Stocke le répertoire courant pour utilisation avec la commande POPD,\n\
+ensuite change de répertoire vers le répertoire spécifié.\n\n\
+PUSHD [chemin | ..]\n\n\
+ chemin Spécifie le répertoire qui deviendra le répertoire courant"
+
+STRING_DIRSTACK_HELP2, "Change de réperoire vers le répertoire stocké par la commande PUSHD\n\nPOPD"
+
+STRING_DIRSTACK_HELP3, "Affiche le contenu de la pile de répertoires.\n\nDIRS"
+
+STRING_DIRSTACK_HELP4, "Pile de répertoires vide."
+
+STRING_ECHO_HELP1, "Affiche un message sans retour chariot ni passage à la ligne.\n\n\
+ ECHOS message"
+
+STRING_ECHO_HELP2, "Affiche un message sur le canal d'erreur.\n\n\
+ ECHOERR message\n\
+ ECHOERR. Affiche une ligne vide sur le canal d'erreur."
+
+STRING_ECHO_HELP3, "Affiche un message sur le canal d'erreur sans retour chariot\n\
+ni passage à la ligne.\n\n\
+ ECHOSERR message"
+
+STRING_ECHO_HELP4, "Affiche un message ou bascule l'affichage des commandes sur on ou off.\n\n\
+ ECHO [ON | OFF]\n\
+ ECHO [message]\n\
+ ECHO. Affiche une ligne vide.\n\n\
+Taper ECHO sans paramètre pour afficher le réglage ECHO courant."
+
+STRING_ECHO_HELP5, "ECHO est %s\n"
+
+STRING_EXIT_HELP, "Sort de de l'interpréteur de commandes.\n\nEXIT"
+
+STRING_FOR_HELP1, "Exécute une commande donnée pour chaque fichier d'un ensemble de fichiers.\n\
+FOR %variable IN (ensemble) do commande [paramètres]\n\n\
+ %variable Spécife un paramètre remplaçable.\n\
+ (ensemble) Spécifie un ensemble d'un ou plusieurs fichiers.\n\
+ Des jokers peuvent être utilisés.\n\
+ commande Spécifie la commande à éxécuter pour chaque fichier.\n\
+ paramètres Spécifie les paramètres ou switchs pour la commande spécifiée.\n\n\
+Pour utiliser la comamnde FOR dans un programme batch,\n\
+utiliser %%variable au lieu de %variable."
+
+STRING_FREE_HELP1, "\nLe nom de volume du lecteur %s est %-11s\n\
+Le numéro de série est %s\n\
+ %16s octets d'espace disque total\n\
+ %16s octets utilisés\n\
+ %16s octets libres\n"
+
+STRING_FREE_HELP2, "Affiche les information d'un disque.\n\nFREE [lecteur: ...]"
+
+STRING_GOTO_HELP1, "Dirige CMD vers une ligne nommée dans un script batch.\n\n\
+GOTO label\n\n\
+ label Spécifie un champ texte utilisé dans un script batch comme un label.\n\n\
+Vous écrivez un label seul sur une ligne commençant par un deux-points.\n"
+
+STRING_IF_HELP1, "Exécute un traitement conditionnel dans des programmes batch.\n\n\
+ IF [NOT] ERRORLEVEL nombre commande\n\
+ IF [NOT] chaine1==chaine2 commande\n\
+ IF [NOT] EXIST nomfichier commande\n\
+ IF [NOT] DEFINED variable commande\n\n\
+NOT CMD ne lancera la commande que si la condition est fausse.\n\
+ERRORLEVEL nombre La condition sera vraie si le dernier programme lancé\n\
+ a retourné un code sortie égal ou supérieur à celui indiqué.\n\
+commande Indique la commande à lancer si la condition est vérifiée.\n\
+chaine1==chaine2 La condition sera vraie si les deux chaines sont identiques.\n\
+EXIST nomfichier La condition sera vraie si le fichier spécifié existe.\n\
+DEFINED variable La condition sera vraie si la variable indiquée est définie."
+
+STRING_LABEL_HELP1, "Affiche ou change le nom de volume du disque.\n\nLABEL [disque:][nomdevolume]\n"
+
+STRING_LABEL_HELP2, "Le nom de volume du disque %c: est %s\n"
+STRING_LABEL_HELP3, "Le disque %c: n'a pas de nom de volume\n"
+STRING_LABEL_HELP4, "Le numéro de serie du volume est %04X-%04X\n"
+STRING_LABEL_HELP5, "Nom de volume (11 Caractères, ENTREE si aucun)? "
+
+STRING_LOCALE_HELP1, "L'heure actuelle est "
+
+STRING_MKDIR_HELP, "Crée un répertoire.\n\n\
+MKDIR [lecteur:]chemin\nMD [lecteur:]chemin"
+
+STRING_MEMMORY_HELP1, "Affiche la quantité de mémoire système.\n\nMEMORY"
+
+STRING_MEMMORY_HELP2, "\n %12s%% de charge mémoire.\n\n\
+ %13s octets de RAM physique au total.\n\
+ %13s octets de RAM physique disponible.\n\n\
+ %13s octets de fichier d'échange au total.\n\
+ %13s octets de fichier d'échange disponible.\n\n\
+ %13s octets de mémoire virtuelle au total.\n\
+ %13s octets de mémoire virtuelle disponible.\n"
+
+STRING_MISC_HELP1, "Appuyer sur une touche pour continuer...\n"
+
+STRING_MOVE_HELP1, "Ecraser %s (Oui/Non/Tous)? "
+
+STRING_MOVE_HELP2, "Déplace des fichiers ou renomme des fichiers et des répertoires.\n\n\
+Pouur déplacer un ou plusieurs fichiers:\n\
+MOVE [/N][lecteur:][nomfich1[,...] destination\n\n\
+Pour renommer un répertoire:\n\
+MOVE [/N][lecteur:][chemin]nomrep1 nomrep2\n\n\
+ [lecteur:][chemin]nomfich1 Indique l'endroit et le nom du ou des fichiers\n\
+ que vous voulez déplacer.\n\
+ /N Nothing. Do everything but move files or directories.\n\n\
+Limitations actuelles :\n\
+ - Vous ne pouvez pas déplacer un fichier/répertoire d'un disque à un autre.\n"
+
+STRING_MSGBOX_HELP, "Affiche une boite de dialogue et retourne la réponse de l'utilisateur\n\n\
+MSGBOX type ['titre'] prompt\n\n\
+type boutons affichés\n\
+ les valeurs possibles sont: OK, OKCANCEL,\n\
+ YESNO, YESNOCANCEL\n\
+titre titre de la boite de message\n\
+prompt texte affiché par la boite de dialogue \n\n\n\
+ERRORLEVEL est modifié suivant le bouton pressé:\n\n\
+YES : 10 | NO : 11\n\
+OK : 10 | CANCEL : 12\n"
+
+STRING_PATH_HELP1, "Affiche ou modifie le chemin de recherche pour les fichiers éxécutables.\n\n\
+PATH [[lecteur:][chemin;...]]\nPATH ;\n\n\
+Taper PATH ; pour effacer tous les réglages courants\n\
+et indiquer à l'interpréteur de commandes\n\
+de chercher seulement dans le répertoire courant.\n\
+Taper PATH sans paramètres pour afficher le chemin courant.\n"
+
+STRING_PAUSE_HELP1, "Stoppe l'éxécution d'un fichier batch et affiche le message suivant:\n\
+'Appuyer sur une touche pour continuer...' ou un message défini\n\
+par l'utilisateur.\n\n\
+PAUSE\n\
+PAUSE [message]"
+
+STRING_PROMPT_HELP1, "Change l'invite de commandes.\n\n\
+PROMPT [texte]\n\n\
+ texte Indique le nouvel invite de commandes.\n\n\
+L'invite de commandes peut être composé de caractères normaux et\n\
+des caractères spéciaux suivants:\n\n\
+ $A & (Et commercial)\n\
+ $B | (pipe)\n\
+ $C ( (parenthèse ouvrante)\n\
+ $D Date courante\n\
+ $E Code Escape (code ASCII 27)\n\
+ $F ) (parenthèse fermante)\n\
+ $G > (signe supérieur à)\n\
+ $H Backspace (efface le caractère précédent)\n\
+ $L < (signe inférieur à)\n\
+ $N Lecteur courant\n\
+ $P Lecteur et chemin courants\n\
+ $Q = (signe égale)\n\
+ $T Heure courante\n\
+ $V Numéro de version de ReactOS\n\
+ $_ Retour chariot/saut de ligne\n\
+ $$ $ (signe dollar)"
+
+STRING_PROMPT_HELP2, " $+ Affiche la hauteur de la pile de répertoires"
+
+STRING_PROMPT_HELP3, "\nTaper PROMPT sans paramètres pour changer l'invite à celui défini par défaut."
+
+STRING_REM_HELP, "Démarrer une ligne de commentaire dans un fichier batch.\n\nREM [Commentaire]"
+
+STRING_REN_HELP1, "Renomme un(des) fichier(s)/répertoire(s)\n\
+RENAME [/E /N /P /Q /S /T] ancien_nom ... nouveau_nom\n\
+REN [/E /N /P /Q /S /T] ancien_nom ... nouveau_nom\n\n\
+ /E Pas de messages d'erreur.\n\
+ /N Rien.\n\
+ /P Demande de confirmation avant de renommer chaque fichier.\n\
+ (Non implémenté!)\n\
+ /Q Silencieux.\n\
+ /S Renommer les sous-répertoires.\n\
+ /T Affiche le nombre total de fichiers renommés.\n\n\
+Vous ne pouvez indiquez un autre lecteur/chemin pour la destination.\n\
+Utiliser la commande MOVE dans ce but."
+
+STRING_REN_HELP2, " %lu fichier renommé\n"
+
+STRING_REN_HELP3, " %lu fichiers renommés\n"
+
+STRING_RMDIR_HELP, "Efface un répertoire.\n\n\
+RMDIR [lecteur:]chemin\nRD [lecteur:]chemin"
+
+STRING_SCREEN_HELP, "Déplace le curseur, optionnellement affiche du texte\n\n\
+SCREEN lig col [texte]\n\n\
+ lig ligne à laquelle déplacer le curseur\n\
+ col colonne à laquelle déplacer le curseur"
+
+STRING_SET_HELP, "Affiche, modifie ou efface des variables d'environnement.\n\n\
+SET [variable[=][chaine]]\n\n\
+ variable Indique le nom de la variable d'environnement.\n\
+ chaine Indique une série de caractères à assigner à la variable.\n\n\
+Taper SET sans paramètres pour afficher les variables d'environnement courantes.\n"
+
+STRING_SHIFT_HELP, "Change la position de paramètres remplaçables dans un fichier batch.\n\n\
+SHIFT [DOWN]"
+
+STRING_START_HELP1, "Lance une commande.\n\n\
+START commande\n\n\
+ commande Indique la commande à lancer.\n\n\
+Pour le moment toutes les commandes sont lancées de façon asynchrone.\n"
+
+STRING_TITLE_HELP, "Change le titre de la fenêtre de l'invite de commandes.\n\n\
+TITLE [chaine]\n\n\
+chaine Indique le titre de la fenêtre de l'invite de commandes."
+
+STRING_TIME_HELP1, "Affiche ou modifie l'heure système.\n\n\
+TIME [/T][heure]\n\n\
+ /T affiche seulement\n\n\
+Taper TIME sans paramètres pour afficher l'heure courante et une invite\n\
+pour la modifier. Presser la touche ENTREE pour garder la même heure."
+
+STRING_TIME_HELP2, "Entrer la nouvelle heure: "
+
+STRING_TIMER_HELP1, "Ecoulé %d msecs\n"
+
+STRING_TIMER_HELP2, "Ecoulé %02d%c%02d%c%02d%c%02d\n"
+
+STRING_TIMER_HELP3, "Permet l'utilisation de dix chronomètres.\n\n\
+TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
+ ON Démarre le chronomètre\n\
+ OFF Stoppe le chronomètre\n\
+ /S Split time. Return stopwach split\n\
+ time without changing its value\n\
+ /n Indique le numéro du chronomètre.\n\
+ Les chronomètres disponibles vont de 0 à 10.\n\
+ Si non spécifié, le chronomètre par défaut est 1\n\
+ /Fn Format de sortie\n\
+ n peut être :\n\
+ 0 millisecondes\n\
+ 1 hh%cmm%css%cdd\n\n\
+Si aucun de ON, OFF or /S n'est spécifié la commande\n\
+changera l'état du chronomètre sélectionné\n\n"
+
+STRING_TYPE_HELP1, "Affiche le contenu de fichiers textes.\n\nTYPE [lecteur:][chemin]nomfich"
+
+STRING_VERIFY_HELP1, "Cette commande ne fait rien!!\n\
+Spécifie s'il faut verifier que vos fichiers sont écrits correctement.\
+\n\n\
+VERIFY [ON | OFF]\n\n\
+Taper VERIFY sans paramètres pour afficher le réglage de VERIFY."
+
+STRING_VERIFY_HELP2, "VERIFY est %s.\n"
+
+STRING_VERIFY_HELP3, "Vous devez indiquer ON ou OFF."
+
+STRING_VERSION_HELP1, "Affiche les information de version du shell\n\n\
+VER [/C][/R][/W]\n\n\
+ /C Displays credits.\n\
+ /R Displays redistribution information.\n\
+ /W Displays warranty information."
+
+STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\
+type: `ver /w'. This is free software, and you are welcome to redistribute\n\
+it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\
+listing of credits."
+
+STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\
+ GNU General Public License for more details."
+
+STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\
+ it under the terms of the GNU General Public License as published by\n\
+ the Free Software Foundation; either version 2 of the License, or\n\
+ (at your option) any later version."
+
+STRING_VERSION_HELP5, "\nEnvoyer les rapports d'erreur à <ros-dev@reactos.org>.\n\
+Les mises à jour sont disponibles à : http://www.reactos.org"
+
+STRING_VERSION_HELP6, "\nVersion FreeDOS écrite par:\n"
+
+STRING_VERSION_HELP7, "\nVersion ReactOS écrite par:\n"
+
+STRING_VOL_HELP1, " Le nom de volume du lecteur %c: est %s\n"
+STRING_VOL_HELP2, " Le volume dans le lecteur %c: n'a pas de nom\n"
+STRING_VOL_HELP3, " Le numéro de série du volume est %04X-%04X\n"
+STRING_VOL_HELP4, "Affiche le nom de volume et le numéro de série du disque s'ils existent.\n\nVOL [lecteur:]\n"
+
+STRING_WINDOW_HELP1, "Change l'aspect de la fenêtre de la console\n\n\
+WINDOW [/POS[=]gauche,haut,largeur,hauteur]\n\
+ [MIN|MAX|RESTORE] ['titre']\n\n\
+/POS indique la position et les dimensions de la fenêtre\n\
+MIN minimise la fenêtre\n\
+MAX maximise la fenêtre\n\
+RESTORE restaure la fenêtre"
+
+STRING_WINDOW_HELP2, "Change l'aspect de la fenêtre de la console\n\n\
+WINDOW [/POS[=]gauche,haut,largeur,hauteur]\n\
+ [MIN|MAX|RESTORE] ['titre']\n\n\
+/POS indique la position et les dimensions de la fenêtre\n\
+MIN minimise la fenêtre\n\
+MAX maximise la fenêtre\n\
+RESTORE restaure la fenêtre\n\
+titre titre de la fenêtre"
+
+STRING_CHOICE_OPTION "ON"
+STRING_COPY_OPTION, "ONT"
+
+STRING_ALIAS_ERROR, "Ligne de commande trop longue après remplacement de l'alias!\n"
+STRING_BATCH_ERROR, "Erreur à l'ouverture du fichier batch\n"
+STRING_CHCP_ERROR1, "Page de codes actuelle : %u\n"
+STRING_ERROR_INVALID_PARAM_FORMAT, "Format de paramètre incorrect - %s\n"
+STRING_CHCP_ERROR4, "Page de code invalide \n"
+STRING_CHOICE_ERROR, "Option invalide. Format attendu: /C[:]options"
+STRING_CHOICE_ERROR_TXT, "Option invalide. Format attendu: /T[:]c,nn"
+STRING_CHOICE_ERROR_OPTION, "Option invalide : %s"
+STRING_CMD_ERROR1, "Ne peut rediriger l'entrée depuis le fichier %s\n"
+STRING_CMD_ERROR2, "Erreur à la création du fichier temporaire pour les données du pipe\n"
+STRING_CMD_ERROR3, "Ne peut rediriger vers le fichier %s\n"
+STRING_CMD_ERROR4, "Lance %s...\n"
+STRING_CMD_ERROR5, "Lance cmdexit.bat...\n"
+STRING_COLOR_ERROR1, "L'arrière plan et l'avant plan ne peuvent être de la même couleur"
+STRING_COLOR_ERROR2, "Erreur dans la spécification des couleurs"
+STRING_COLOR_ERROR3, "Couleur %x\n"
+STRING_COLOR_ERROR4, "Erreur: même couleur!"
+STRING_CONSOLE_ERROR, "Erreur inconnue: %d\n"
+STRING_COPY_ERROR1, "Erreur: Ne peut ouvrir la source - %s!\n"
+STRING_COPY_ERROR2, "Erreur: Ne peut copier le fichier sur lui-même!\n"
+STRING_COPY_ERROR3, "Erreur à l'écriture de la destination!\n"
+STRING_COPY_ERROR4, "Erreur: Non implémenté actuellement!\n"
+STRING_DATE_ERROR, "Date invalide."
+STRING_DEL_ERROR5, "Le fichier %s va être effacé ! "
+STRING_DEL_ERROR6, "Etes vous sûr (O/N)?"
+STRING_DEL_ERROR7, "Efface : %s\n"
+STRING_ERROR_ERROR1, "Erreur inconnue! Code d'erreur : 0x%lx\n"
+STRING_ERROR_ERROR2, "Erreur de syntaxe"
+STRING_FOR_ERROR1, "'in' manquant."
+STRING_FOR_ERROR2, "pas de parenthèse trouvée."
+STRING_FOR_ERROR3, "'do' manquant."
+STRING_FOR_ERROR4, "pas de commande après 'do'."
+STRING_FREE_ERROR1, "Lecteur invalide"
+STRING_FREE_ERROR2, "sans nom"
+STRING_GOTO_ERROR1, "Pas de label indiqué pour GOTO"
+STRING_GOTO_ERROR2, "Label '%s' non trouvé\n"
+
+STRING_MOVE_ERROR1, "[OK]\n"
+STRING_MOVE_ERROR2, "[Erreur]\n"
+
+STRING_PATH_ERROR, "CMD: Pas dans l'environnement '%s'\n"
+
+STRING_REN_ERROR1, "MoveFile() a échoué. Erreur: %lu\n"
+
+STRING_START_ERROR1, "No batch support at the moment!"
+
+STRING_TIME_ERROR1, "Heure invalide."
+
+STRING_TYPE_ERROR1, "Option invalide '/%s'\n"
+
+STRING_WINDOW_ERROR1, "Fenêtre non trouvée"
+
+
+STRING_ERROR_PARAMETERF_ERROR, "Format du paramètre incorrect - %c\n"
+STRING_ERROR_INVALID_SWITCH, "Paramètre invalide - /%c\n"
+STRING_ERROR_TOO_MANY_PARAMETERS, "Trop de paramètres - %s\n"
+STRING_ERROR_PATH_NOT_FOUND, "Chemin non trouvé\n"
+STRING_ERROR_FILE_NOT_FOUND, "Fichier non trouvé\n"
+STRING_ERROR_REQ_PARAM_MISSING, "Paramètre requis manquant\n"
+STRING_CMD_SHELLINFO, "\n Interpréteur de ligne de commandes ReactOS"
+STRING_VERSION_RUNVER, " tournant sur %s"
+STRING_COPY_FILE, " %d fichier(s) copié(s)\n"
+STRING_DELETE_WIPE, "effacé(s)"
+STRING_FOR_ERROR, "mauvaise variable spécifiée."
+STRING_SCREEN_COL, "valeur invalide pour col"
+STRING_SCREEN_ROW, "valeur invalide pour lig"
+STRING_TIMER_TIME "Le timer n°%d est %s: "
+}
--- /dev/null
+#include "resource.h"\r
+#include "windows.h"\r
+/*\r
+ * Moved all hardcoded strings to En.rc.\r
+ * By Magnus Olsen 2005\r
+ * Hungarian resource állomány for ntvdm\r
+ * Translation by Robert Horvath (talley at cubeclub.hu) 2005\r
+ */\r
+\r
+LANGUAGE LANG_HUNGARIAN, SUBLANG_NEUTRAL\r
+STRINGTABLE DISCARDABLE\r
+{\r
+\r
+STRING_ATTRIB_HELP, "Állományok attribútumok megjelenítése vagy beállításai.\n\n\\r
+ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] állomány ...\n\\r
+ [/S [/D]]\n\n\\r
+ + bekapcsol egy attribútumot\n\\r
+ - kikapcsol egy attribútumot\n\\r
+ R Írásvédett állomány\n\\r
+ A Archiválandó állomány\n\\r
+ S Rendszer állomány\n\\r
+ H Rejtett állomány\n\\r
+ /S Minden állomány módosítása a mappában és minden\n\\r
+ almappábanban\n\\r
+ /D Mappákra is érvényesíti\n\n\\r
+Ha ATTRIB-ot paraméter nélkül írod be, megjeleníti a mappában található összes állományt és annak attribútumát.\n"\r
+\r
+STRING_ALIAS_HELP, "Aliasok megjelenítése, hozzáadása és törlése\n\n\\r
+ALIAS [alias=[parancs]]\n\n\\r
+ alias Alias neve.\n\\r
+ parancs A szöveg amit behelyettesít.\n\n\\r
+Aliasok megjelenítése:\n\\r
+ ALIAS\n\n\\r
+Egy új hozzáadása vagy meglévõ helyettesítlse:\n\\r
+ ALIAS da=dir a:\n\n\\r
+Egy alias törlése:\n\\r
+ ALIAS da="\r
+\r
+STRING_BEEP_HELP, "Hangjelzés leadása a speakerbõl.\n\nBEEP\n"\r
+\r
+STRING_CALL_HELP, "Kötegelt parancsfájl meghívása egy másikból.\n\n\\r
+CALL [kötet:][elérési_út]állomány [paraméterek]\n\n\\r
+ paraméterek Itt adható meg a szükséges paraméterlista"\r
+\r
+STRING_CD_HELP, "Az aktuális mappa nevének a megjelenítése vagy váltás másikra\n\n\\r
+CHDIR [/D][meghajtó:][elérési_út]\n\\r
+CHDIR[..|.]\n\\r
+CD [/D][meghajtó:][elérési_út]\n\\r
+CD[..|.]\n\n\\r
+ .. Szülõ mappa\n\\r
+ /D Megváltoztatja az aktuális mappát és meghajtót is.\n\n\\r
+Írd be, hogy 'CD meghajtó:' hogy ki írja az aktuális mappát.\n\\r
+Írd be a CD-t paraméterek nélkül, hogy megjelenítse az aktuális meghajtót és mappát (ugyanaz mint az elõzõ).\n"\r
+\r
+STRING_CHCP_HELP, "Megjeleníti vagy megváltoztatja az aktív kódlapot.\n\n\\r
+CHCP [nnn]\n\n\\r
+ nnn A használni kívánt kódlap száma.\n\n\\r
+Írd be a CHCP paraméterek nélkül, hogy megjelenítse az aktív kódlapot.\n"\r
+\r
+STRING_CHOICE_HELP, "Vár a felhasználóra, hogy válasszon a felkínált lehetõségek közül.\n\n\\r
+CHOICE [/C[:]választási lehetõségek][/N][/S][/T[:]c,nn][szöveg]\n\n\\r
+ /C[:]választási lehetõségek Megengedett billentyûk. Alapértelmezett: YN. <-- Yes->Igen\n\\r
+ /N Elrejti a választási lehetõségeket és a kérdõjelet.\n\\r
+ /S Kis- és nagybetûk megkülönböztetése.\n\\r
+ /T[:]v,nn A v lehetõséget választja nn másodperc után.\n\\r
+ szöveg Megjelenítendõ szöveg.\n\n\\r
+Az ERRORLEVEL a válasz sorszámára lesz beállítva.\n"\r
+\r
+STRING_CLS_HELP, "Törli a képernyõt.\n\nCLS\n"\r
+\r
+STRING_CMD_HELP1, "\nElérhetõ belsõ parancsok:\n"\r
+\r
+STRING_CMD_HELP2, "\nElérhetõ lehetõségek:"\r
+\r
+STRING_CMD_HELP3," [aliasok]"\r
+\r
+STRING_CMD_HELP4," [elõzmények]"\r
+\r
+STRING_CMD_HELP5," [unix típusú állománynév kiegészítés]"\r
+\r
+STRING_CMD_HELP6," [mappa tár]"\r
+\r
+STRING_CMD_HELP7," [átirányítások és csõvezetékek]"\r
+\r
+STRING_CMD_HELP8, "Elindít egy új ReactOS parancssor értelmezõ.\n\n\\r
+CMD [/[C|K] parancs][/P][/Q][/T:eh]\n\n\\r
+ /C parancs Végrehajtja a parancsot, majd kilép.\n\\r
+ /K parancs Végrehajtja a parancsot, és tovább fut az értelmezõ.\n\\r
+ /P Értelmezi az autoexec.bat állományt és a memóriában marad.\n\\r
+ /T:eh COLOR parancs használata.\n"\r
+\r
+STRING_COLOR_HELP1, "A konzol elõ- és háttérszínét állítja be.\n\n\\r
+COLOR [eh [/-F]] \n\n\\r
+ eh A konzol elõ- és háttérszínét állítja be.\n\\r
+ /-F Nem frissíti az egész képernyõt\n\n\\r
+A színt két hexadecimális számjeggyel lehet beállítani\n\n\\r
+Az elérhetõ színek:\n\\r
+hex név hex név\n\\r
+0 Fekete 8 Szürke\n\\r
+1 Sötétkék 9 Kék\n\\r
+2 Sötétzöld A Zöld\n\\r
+3 Sötétlila B Türkízkék\n\\r
+4 Bordó C Vörös\n\\r
+5 Ciklámen D Ciklámen\n\\r
+6 Olíva E Sárga\n\\r
+7 Világos szürke F Fehér\n"\r
+\r
+STRING_COPY_HELP1, "Felülírja a következõt: %s (Igen/Nem/Mind)? "\r
+\r
+STRING_COPY_HELP2, "Egy vagy több állományt másol a megadott helyre.\n\n\\r
+COPY [/V][/Y|/-Y][/A|/B] forrás [/A|/B]\n\\r
+ [+ forrás [/A|/B] [+ ...]] [cél [/A|/B]]\n\n\\r
+ forrás Megadott állomány(ok)at fogja másolni.\n\\r
+ /A Ez ASCII szöveg állomány.\n\\r
+ /B Ez bináris állomány.\n\\r
+ cél Megadja a cél mappát és/vagy az (új) állománynevet.\n\\r
+ /V Ellenõrzi a másolást.\n\\r
+ /Y Igennel válaszol kérdésnél.\n\\r
+ /-Y Nemmel válaszol kérdésnél.\n\n\\r
+Az /Y kapcsolót a COPYCMD környezeti változóban is használható.\n"\r
+\r
+STRING_DATE_HELP1, "\nÚj dátum (hh%cnn%céééé): "\r
+\r
+STRING_DATE_HELP2, "\nÚj dátum (nn%chh%céééé): "\r
+\r
+STRING_DATE_HELP3, "\nÚj dátum (éééé%chh%cnn): "\r
+\r
+STRING_DATE_HELP4, "Megjeleníti vagy beállítja a rendszerdátumot.\n\n\\r
+DATE [/T][dátum]\n\n\\r
+ /T Csak megjeleníti\n\n\\r
+Írd be a DATE parancsot paraméter nélkül, hogy megjelenítse a rendszer dátumot és bekérjen egy újat.\n\\r
+Nyomj ENTERT-t, ha nem akarsz változtatni.\n"\r
+ \r
+STRING_DEL_HELP1, "Eltávolít egy vagy több állományt.\n\n\\r
+DEL [/N /P /T /Q /S /W /Y /Z /A[[:]attribútumok]] állomány ...\n\\r
+DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]attribútumok]] állomány ...\n\\r
+ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]attribútumok]] állomány ...\n\n\\r
+ állomány Törlésre kijelöl állomány(ok).\n\n\\r
+ /N Nem csinál semmit.\n\\r
+ /P Rákérdezés minden állománynál.\n\\r
+ /T Statisztika megjelenítése a végén.\n\\r
+ /Q Csendes üzemmód.\n\\r
+ /W Wipe. Overwrite the állomány with random numbers before deleting it.\n\\r
+ /Y Minden válaszra igen. Figyelem, *.*-ot is törli!!\n\\r
+ /F Rejtett, csak olvasható és rendszer állományokat is töröl.\n\\r
+ /S Almappákban is törli az állományokat\n\\r
+ /A Attribútumok alapján törli az állományokat.\n\\r
+ attributes\n\\r
+ R Csak olvasható állománys\n\\r
+ S Rendszer állomány\n\\r
+ A Archivált állomány\n\\r
+ H Rejtett állománys\n\\r
+ - ""Nem"" prefix\n"\r
+\r
+STRING_DEL_HELP2, "Minden állomány törölve lesz a mappában!\nBiztosan ezt akarod (I/N)?"\r
+STRING_DEL_HELP3, " %lu állomány törölve\n"\r
+STRING_DEL_HELP4, " %lu állomány törölve\n"\r
+\r
+STRING_DELAY_HELP, "pause for n seconds or milliseconds\n\\r
+DELAY [/m]n\n\n\\r
+ /m specifiy than n are milliseconds\n\\r
+ otherwise n are seconds\n"\r
+\r
+STRING_DIR_HELP1, "DIR [meghajtó:][elérési_út][állománynév] [/A[[:]attribútumok]] [/B] [/C] [/D] [/L] [/N]\n\\r
+ [/O[[:]rendezési_feltétel]] [/P] [/Q] [/S] [/T[[:]idõ]] [/W] [/X] [/4]\n\n\\r
+ [meghajtó:][elérési_út][állományname]\n\\r
+ Az adott hely állományait és mappáit jeleníti meg.\n\n\\r
+ /A A megadott attribútumu állományokat jeleníti csak meg.\n\\r
+ attributes D Mappák R Csak olvasható állomány\n\\r
+ H Rejtett állomány A Archiválandó állomány\n\\r
+ S Rendszer állomány - ""Nem"" prefix\n\\r
+ /B Fejléc és összefoglaló nélkül.\n\\r
+ /C Ezres elválasztó jel használata. Ez az alapértelmezett, /-C a kikapcsolása.\n\\r
+ /D Széles megjelenítés, oszlop szerint rendezve.\n\\r
+ /L Kisbetûk használata.\n\\r
+ /N New long list format where állománynames are on the far right.\n\\r
+ /O Rendezés az alábbiak szerint.\n\\r
+ sortorder N Név alapján (ABC sorrend) S Méret alapján (növekvõ)\n\\r
+ E Kiterjesztés alapján (ABC sorrend) D Dátum/idõ alapján (legrégebbi elején)\n\\r
+ G Mappák legelõl - ""Nem"" prefixel fordított rendezés\n\\r
+ /P Csak egy képernyõnyi adat megjelenítése egyszerre.\n\\r
+ /Q Állomány tulajdonsosának megjelenítése.\n\\r
+ /S Almappák tartalmát is megjeleníti.\n\\r
+ /T Controls which time field displayed or used for sorting\n\\r
+ timefield C Létrehozás\n\\r
+ A Utolsó megtekintés\n\\r
+ W Utolsó módosítás\n\\r
+ /W Széles megjelenítés.\n\\r
+ /X This displays the short names generated for non-8dot3 állomány\n\\r
+ names. The format is that of /N with the short name inserted\n\\r
+ before the long name. If no short name is present, blanks are\n\\r
+ displayed in its place.\n\\r
+ /4 Négy számjegyû év\n\n\\r
+A kapcsolók a DIRCMD környezeti változóban is lehetnek.\n"\r
+\r
+STRING_DIR_HELP2, " A (%c) meghajtóban található kötet %s\n"\r
+STRING_DIR_HELP3, " A (%c) meghajtóban található kötetnek nincs címkéje.\n"\r
+STRING_DIR_HELP4, " A kötet sorozatszáma: %04X-%04X\n"\r
+STRING_DIR_HELP5, "\n Összes állomány:\n%16i Állomány(ok)% 14s bájt\n"\r
+STRING_DIR_HELP6, "%16i Mappa %15s bájt"\r
+STRING_DIR_HELP7, "\n %s tartalma\n\n"\r
+STRING_DIR_HELP8, "%16i Állomány %14s bájt\n"\r
+\r
+STRING_DIRSTACK_HELP1, "Megjegyzi az aktuális mappát, majd átvált egy máasikra.\n\n\\r
+PUSHD [elérési_út | ..]\n\n\\r
+ elérési_út Ebbe a mappába fog átváltani\n"\r
+\r
+STRING_DIRSTACK_HELP2, "Visszalép a PUSHD által megjegyzett mappába.\n\nPOPD"\r
+\r
+STRING_DIRSTACK_HELP3, "Megjeleníti a megjegyzett mappákat.\n\nDIRS"\r
+\r
+STRING_DIRSTACK_HELP4, "Üres a tár"\r
+\r
+STRING_ECHO_HELP1, "Megjeleníti a szöveget új sor nélkül.\n\n\\r
+ ECHOS szöveg"\r
+\r
+STRING_ECHO_HELP2, "Displays a message to the standard error.\n\n\\r
+ ECHOERR szöveg\n\\r
+ ECHOERR. Új sor"\r
+\r
+STRING_ECHO_HELP3, "Prints a messages to standard error output without trailing carridge return and line feed.\n\n\\r
+ ECHOSERR message"\r
+\r
+STRING_ECHO_HELP4, "Megjelenít egy szöveget, vagy beállítja a visszhangot.\n\n\\r
+ ECHO [ON | OFF]\n\\r
+ ECHO [üzenet]\n\\r
+ ECHO. Új sor\n\n\\r
+Paraméter nélkül megjeleníti a visszang állapotát."\r
+\r
+STRING_ECHO_HELP5, "Az ECHO %s\n"\r
+\r
+STRING_EXIT_HELP, "Kilép a parancssor értelmezõbõl.\n\nEXIT\n"\r
+\r
+STRING_FOR_HELP1, "Végrehajt egy parancsot az összes fájlban a megadott mappákban\n\n\\r
+FOR %változó IN (csoport) DO parancs [paraméterek]\n\n\\r
+ %változó A cserélhetõ paraméter.\n\\r
+ (csoport) Állományok csoportja. Joker-karakterek megengedettek EZT KURVÁRA ÁTKELL FORDÍTANI :)) wildcardok helyett?.\n\\r
+ parancs Ezt a parancsot hajtja végre minden egyes állománnyal.\n\\r
+ paraméterek Ezeket a paramétereket adja meg a parancsnak.\n\n\\r
+A batch állományban való haszálathoz %%változó kell a %változó helyett.\n"\r
+\r
+STRING_FREE_HELP1, "\nA (%s) meghajtóban lévõ kötet címkéje %-11s\n\\r
+ Sorozatszám: %s\n\\r
+ %16s bájt a teljes hely\n\\r
+ %16s bájt használva\n\\r
+ %16s bájt szabad\n"\r
+\r
+STRING_FREE_HELP2, "Kötet méret információk.\n\nFREE [meghajtó: ...]\n"\r
+\r
+STRING_IF_HELP1, "Performs conditional processing in batch programs.\n\n\\r
+ IF [NOT] ERRORLEVEL number command\n\\r
+ IF [NOT] string1==string2 command\n\\r
+ IF [NOT] EXIST állományname command\n\\r
+ IF [NOT] DEFINED variable command\n\n\\r
+NOT Specifies that CMD should carry out the command only if\n\\r
+ the condition is false\n\\r
+ERRORLEVEL number Specifies a true condition if the last program run returned\n\\r
+ an exit code equal or greater than the number specified.\n\\r
+command Specifies the command to carry out if the condition is met.\n\\r
+string1==string2 Specifies a true condition if the specified text strings\n\\r
+ match.\n\\r
+EXIST állományname Specifies a true condition if the specified állományname exists.\n\\r
+DEFINED variable Specifies a true condition if the specified variable is\n\\r
+ defined.\n"\r
+\r
+STRING_GOTO_HELP1, "Átirányít egy másik címkére a batch állományban.\n\n\\r
+GOTO címke\n\n\\r
+ címke A megadott címkére fog ugrani az értelmezõ.\n\n\\r
+Egy címkét egy sorban lehet megadni, ':' -tal kezdve."\r
+\r
+STRING_LABEL_HELP1, "A kötet címkéjét megjeleníti, vagy megváltoztatja.\n\n\\r
+LABEL [meghajtó:] [új_címke]\n"\r
+\r
+STRING_LABEL_HELP2, "A (%c) meghajtóban lévõ kötet címkéje %s\n"\r
+STRING_LABEL_HELP3, "A (%c) megjajtóban lévõ kötetnek nincs címkéje.\n"\r
+STRING_LABEL_HELP4, "A kötet sorozatszáma %04X-%04X\n"\r
+STRING_LABEL_HELP5, "Új kötetcímke (11 betû, ENTER ha üres)? "\r
+\r
+STRING_LOCALE_HELP1, "Az aktuális idõ:"\r
+\r
+STRING_MKDIR_HELP, "Létrehoz egy új mappát.\n\n\\r
+MKDIR [meghajtó:]path\nMD [meghajtó:]path"\r
+\r
+STRING_MEMMORY_HELP1, "Megjeleníti a memória statisztikát.\n\nMEMORY"\r
+\r
+STRING_MEMMORY_HELP2, "\n A memória %12s%%-a foglalt.\n\n\\r
+ %13s bájtnyi teljes fizikai memória.\n\\r
+ %13s bájtnyi elérhetõ memória.\n\n\\r
+ %13s bájt a lapozóállomány.\n\\r
+ %13s bájtnyi elérhetõ a lapozóállományban.\n\n\\r
+ %13s bájt a teljes virtuális memória.\n\\r
+ %13s bájtnyi elérhetõ a virtuális memóriából.\n"\r
+\r
+STRING_MISC_HELP1, "A folytatáshoz nyomj meg egy billentyût . . .\n"\r
+\r
+STRING_MOVE_HELP1, "Felülírja %s (Igen/Nem/Mind)? "\r
+\r
+STRING_MOVE_HELP2, "Áthelyezi és átnevezi az állományokat a mappákban.\n\n\\r
+Egy vagy több állomány áthelyezéséhez:\n\\r
+MOVE [/N][meghajtó:][elérési_út]állomány1[,...] cél\n\n\\r
+Mappa átnevezése:\n\\r
+MOVE [/N][meghajtó:][elérési_út]mappa1 mappa2\n\n\\r
+ [meghajtó:][elérési_út]állomány1 Átnevezendõ állományok forrása.\n\\r
+ /N Nem helyez át semmit.\n\n\\r
+Hiányosságok:\n\\r
+ - Nem lehet meghajtók között áthelyezni állományokat.\n"\r
+\r
+STRING_MSGBOX_HELP, "display a message box and return user responce\n\n\\r
+MSGBOX type ['title'] prompt\n\n\\r
+type button displayed\n\\r
+ possible values are: OK, OKCANCEL,\n\\r
+ YESNO, YESNOCANCEL\n\\r
+title title of message box\n\\r
+prompt text displayed by the message box\n\n\n\\r
+ERRORLEVEL is set according the button pressed:\n\n\\r
+YES : 10 | NO : 11\n\\r
+OK : 10 | CANCEL : 12\n"\r
+\r
+STRING_PATH_HELP1, "Megjeleníti vagy beállítja a keresési útvonalakat.\n\n\\r
+PATH [[meghajtó:]elérési_út[;...]]\n\\r
+PATH ; Keresési útvonalak törlése\n\n\\r
+A PATH törléséhez a következõt írd be: PATH ;\n\\r
+Így csak az aktuális mappában fog keresni a CMD.\\r
+Paraméterek nélkül az érvényes keresési útvonalakat mutatja meg.\n"\r
+\r
+STRING_PROMPT_HELP1, "Parancssor beállítása.\n\n\\r
+PROMPT [szöveg]\n\n\\r
+ szöveg Az új parancssor megadása.\n\n\\r
+A parancssor speciális kódokat is tartalmazhat:\n\n\\r
+ $A & (és jel)\n\\r
+ $B | (csõ)\n\\r
+ $C ( (kezdõ rázójel)\n\\r
+ $D Aktuális dátum\n\\r
+ $E Escape-kód (ASCII 27-es kód)\n\\r
+ $F ) (záró zárójel)\n\\r
+ $G > ('nagyobb' jel)\n\\r
+ $H Törlés (elötte lévõ karaktert törli)\n\\r
+ $L < ('kissebb' jel)\n\\r
+ $N Aktuális meghajtó\n\\r
+ $P Aktuális meghajtó és mappa\n\\r
+ $Q = (egyenlõség jel)\n\\r
+ $T Aktuális idõ\n\\r
+ $V OS verziószám\n\\r
+ $_ Újsor\n\\r
+ $$ $ (dollár jel)\n"\r
+\r
+STRING_PAUSE_HELP1, "Felfüggeszti a futást, és vár a felhasználóra. A következõ üzenet jelenik meg:\n\\r
+'A folytatáshoz nyomj meg egy billentyût . . .' vagy egy általad választott üzenet.\n\n\\r
+PAUSE [message]"\r
+\r
+STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack"\r
+\r
+STRING_PROMPT_HELP3, "\nHa paraméter nélkül beírod a PROMPT parancsot, vissza áll az alapértelmezettre a kijelzés."\r
+\r
+STRING_REM_HELP, "Megjegyzést jelölõ sor batch fájlokban.\n\nREM [megjegyzés]"\r
+\r
+STRING_RMDIR_HELP, "Eltávolít egy mappát.\n\n\\r
+RMDIR [meghajtó:]elérési_út\nRD [meghajtó:]elérési_út"\r
+\r
+STRING_REN_HELP1, "Átnevez egy állományt.\n\n\\r
+RENAME [/E /N /P /Q /S /T] régi_név ... új_név\n\\r
+REN [/E /N /P /Q /S /T] régi_név ... új_név\n\n\\r
+ /E Hibaüzenetek elrejtése.\n\\r
+ /N Ne csináljon semmit .\n\\r
+ /P Minden állománynál rákérdez. (Még NEM mûködik!!)\n\\r
+ /Q Csendes mûködés.\n\\r
+ /S Almappákat is átnevez.\n\\r
+ /T Összes átnevezett fájl és állomány.\n\n\\r
+Csak az aktuális meghajtón és mappában fog mûködni.\n\\r
+Ha ez nem elég, használd a MOVE parancsot."\r
+\r
+STRING_REN_HELP2, " %lu állomány átnevezve\n"\r
+\r
+STRING_REN_HELP3, " %lu állomány átnevezve\n"\r
+ \r
+STRING_SHIFT_HELP, "Eltolja a helyettesíthetõ paraméterek pozícióját a batch állományban.\n\n\\r
+SHIFT [DOWN]"\r
+\r
+STRING_SCREEN_HELP, "Megváltoztatja a kurzos pozícióját, vagy megjelenít adott pozícióban egy szöveget.\n\n\\r
+SCREEN sor oszlop [szöveg]\n\n\\r
+ sor Ugrás sora\n\\r
+ oszlop Ugrás oszlopa"\r
+\r
+STRING_SET_HELP, "Megjeleníti vagy beállítja a környezeti változókat.\n\n\\r
+SET [változó[=][érték]]\n\n\\r
+ változó Környezeti változó neve.\n\\r
+ érték A beállítandó érték.\n\n\\r
+Paraméterek nélkül megjeleníti az összes környezetiváltozót.\n"\r
+\r
+STRING_START_HELP1, "Végrehajt egy parancsot.\n\n\\r
+START parancs\n\n\\r
+ parancs Végrehajtja a megadott parancsot.\n\n\\r
+Jelenleg minden parancs aszinkron hajtódik végre.\n"\r
+\r
+STRING_TITLE_HELP, "Beállítja az ablak címsorának szövegét.\n\n\\r
+TITLE [szöveg]\n\n\\r
+szöveg Beállítja az ablak címsorának szövegét.\n"\r
+\r
+STRING_TIME_HELP1, "Megjeleníti vagy beállítja a rendszeridõt.\n\n\\r
+TIME [/T][idõ]\n\n\\r
+ /T Csaj megjeleníti\n\n\\r
+Paraméterek nélkül megjeleníti az aktuális idõt és kér egy újat.\n\\r
+Csak egy ENTER megnyomásával nem állítja át.\n"\r
+\r
+STRING_TIME_HELP2, "Új idõ: "\r
+\r
+STRING_TIMER_HELP1, "Eltelt %d ezred másodperc\n"\r
+\r
+STRING_TIMER_HELP2, "Eltelt: %02d%c%02d%c%02d%c%02d\n"\r
+\r
+STRING_TIMER_HELP3, "allow the use of ten stopwaches.\n\n\\r
+TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\\r
+ ON Stopper bekapcsolása\n\\r
+ OFF Stopper kikapcsolása\n\\r
+ /S Split time. Return stopwatch split\n\\r
+ time without changing its value\n\\r
+ /n Stopper azonosító megadása.\n\\r
+ Stopwaches avaliable are 0 to 9\n\\r
+ If it is not specified default is 1\n\\r
+ /Fn Format for output\n\\r
+ n can be:\n\\r
+ 0 milliseconds\n\\r
+ 1 hh%cmm%css%cdd\n\n\\r
+if none of ON, OFF or /S is specified the command\n\\r
+will toggle stopwach state\n\n"\r
+\r
+STRING_TYPE_HELP1, "Megjeleníti az állományok tartalmát.\n\n\\r
+TYPE [meghajtó:][elérési_út]állománynév \n\\r
+ /P Csak egy képernyõnyi tartalmat jelenít meg egyszerre.\n"\r
+\r
+STRING_VERIFY_HELP1, "Ez a parancs még nem mûködik!!\n\\r
+Lemezre írás utáni ellenõrzést állítja be.\n\n\\r
+VERIFY [ON | OFF]\n\n\\r
+Írd be a VERIFY-t paraméterek nélkül, hogy megjelenítse aktuális állapotát.\n"\r
+\r
+STRING_VERIFY_HELP2, "Az ellenõrzés jelenleg %s.\n"\r
+\r
+STRING_VERIFY_HELP3, "Csak az ON vagy OFF elfogadott."\r
+\r
+STRING_VERSION_HELP1, "A ReactOS verzióinformációit jeleníti meg\n\n\\r
+VER [/C][/R][/W]\n\n\\r
+ /C Készítõk névsora.\n\\r
+ /R Terjesztési információk.\n\\r
+ /W Jótállási információk."\r
+\r
+STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\\r
+type: `ver /w'. This is free software, and you are welcome to redistribute\n\\r
+it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\\r
+listing of credits."\r
+\r
+STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\\r
+ GNU General Public License for more details."\r
+\r
+STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\\r
+ it under the terms of the GNU General Public License as published by\n\\r
+ the Free Software Foundation; either version 2 of the License, or\n\\r
+ (at your option) any later version.\n"\r
+\r
+STRING_VERSION_HELP5, "\nHibákról E-Maileket ide küldhetsz: <ros-dev@reactos.org>.\n\\r
+Frissítések és egyéb információk: http://www.reactos.org"\r
+\r
+STRING_VERSION_HELP6, "\nA FreeDOS készítõi:\n"\r
+\r
+STRING_VERSION_HELP7, "\nA ReactOS készítõi:\n"\r
+\r
+STRING_VOL_HELP1, " A (%c) meghajtóban lévõ kötet: %s\n"\r
+STRING_VOL_HELP2, " A (%c) meghajtóban lévõ kötetnek nincs címkéje"\r
+STRING_VOL_HELP3, " A kötet sorozatszáma %04X-%04X\n"\r
+STRING_VOL_HELP4, "A kötet címkéjének és sorozatszámának megjelenítése, ha léteznek.\n\nVOL [meghajtó:]"\r
+\r
+STRING_WINDOW_HELP1, "change console window aspect\n\n\\r
+WINDOW [/POS[=]left,top,width,heigth]\n\\r
+ [MIN|MAX|RESTORE] ['title']\n\n\\r
+/POS specify window placement and dimensions\n\\r
+MIN minimize the window\n\\r
+MAX maximize the window\n\\r
+RESTORE restore the window"\r
+\r
+STRING_WINDOW_HELP2, "change console window aspect\n\n\\r
+ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\\r
+ [MIN|MAX|RESTORE] ['title']\n\n\\r
+window tile of window on wich perform actions\n\\r
+/POS specify window placement and dimensions\n\\r
+MIN minimize the window\n\\r
+MAX maximize the window\n\\r
+RESTORE restore the window\n\\r
+title new title\n"\r
+\r
+\r
+STRING_HELP1, "Támogatott parancsok megjelenítése\n\n\\r
+ parancs /? Több (részletes) információ megtekintéséhez használd ezt.\n\n\\r
+? Minden támogatott parancs megjelenítése (részletek nélkül).\n\\r
+ALIAS Megjeleníti, vagy megváltoztatja az aliasokat.\n\\r
+ATTRIB Megjeleníti vagy megváltoztatja az állományok attribútumát.\n\\r
+BEEP Megszólaltatja a hangszórót.\n\\r
+CALL Batch állományból egy másik batch állomány meghívása.\n\\r
+CD Megjeleníti vagy átvált egy másik mappába.\n\\r
+CHCP Megjeleníti vagy megváltoztatja az aktív kódlapot.\n\\r
+CHOICE Vár a felhasználóra, hogy válasszon a felkínált lehetõségek közül.\n\\r
+CLS Letörli a képernyõt.\n\\r
+CMD Egy új példányt indít a ReactOS parancsértelmezõjébõl.\n\\r
+COLOR A konzol elõ- és háttérszínét állítja be.\n\\r
+COPY Egy vagy több állományt másol a megadott helyre.\n\\r
+DATE Megjeleníti vagy beállítja a rendszerdátumot.\n\\r
+DELETE Eltávolít egy vagy több állományt.\n\\r
+DIR Megjeleníti a mappában található almappákat és állományokat.\n\\r
+ECHO Megjelenít egy szöveget, vagy beállítja a visszhangot.\n\\r
+ERASE Eltávolít egy vagy több fájlt.\n\\r
+EXIT Kilép a parancssor értelmezõbõl.\n\\r
+FOR Végrehajt egy parancsot az összes fájlban a megadott mappákban.\n\\r
+FREE Megjeleníti a szabad hely méretét.\n\\r
+GOTO Átirányít egy másik címkére a batch állományban.\n\\r
+HELP Segítséget ad a ReactOS parancsairól.\n\\r
+HISTORY Megjeleníti az ebben az ablakban kiadott parancsok listáját.\n\\r
+IF Feltételes végrehajtás batch állományokban.\n\\r
+LABEL Beállítja egy kötet címkéjét.\n\\r
+MD Létrehoz egy új mappát.\n\\r
+MKDIR Létrehoz egy új mappát.\n\\r
+MOVE Áthelyez egy vagy több állományt az egyik mappából a másikba.\n\\r
+PATH Megjeleníti vagy beállítja a keresési útvonalakat.\n\\r
+PAUSE Felfüggeszti a futást, és vár a felhasználóra.\n\\r
+POPD Visszalép a PUSHD által megjegyzett mappába.\n\\r
+PROMPT Parancssor beállítása.\n\\r
+PUSHD Megjegyzi az aktuális mappát, majd átvált egy máasikra.\n\\r
+RD Töröl egy mappát.\n\\r
+REM Megjegyzést jelölõ sor batch fájlokban.\n\\r
+REN Átnevez egy állományt.\n\\r
+RENAME Átnevez egy állományt.\n\\r
+RMDIR Töröl egy mappát.\n\\r
+SCREEN Megváltoztatja a kurzos pozícióját, vagy megjelenít adott pozícióban egy szöveget.\n\\r
+SET Megjeleníti vagy beállítja a környezeti változókat.\n\\r
+SHIFT Eltolja a helyettesíthetõ paraméterek pozícióját a batch állományban.\n"\r
+STRING_HELP2, "START Egy új ablakban hajtha végre a parancsot.\n\\r
+TIME Megjeleníti vagy beállítja a rendszeridõt.\n\\r
+TIMER Idõzítõk kezelését teszi lehetõve.\n\\r
+TITLE Beállítja az ablak címsorának szövegét.\n\\r
+TYPE Megjeleníti egy állomány tartalmát.\n\\r
+VER Megjeleníti a ReactOS verzió információját.\n\\r
+VERIFY Írási mûveletek ellenõrzését vezérli\n\\r
+VOL Megjeleníti egy kötet címkéjét és sorozatszámát.\n"\r
+\r
+\r
+STRING_CHOICE_OPTION, "IN"\r
+STRING_COPY_OPTION, "INM"\r
+\r
+\r
+STRING_ALIAS_ERROR, "A parancssor túl hosszú az alias kibontásakor!\n"\r
+STRING_BATCH_ERROR, "Hiba a batch állomány megnyitásakor\n"\r
+STRING_CHCP_ERROR1, "Aktív kódlap: %u\n"\r
+STRING_CHCP_ERROR4, "Érvénytelen kódlap\n"\r
+STRING_CHOICE_ERROR, "Érvénytelen paraméter. Várt formátum: /C[:]választási lehetõségek"\r
+STRING_CHOICE_ERROR_TXT, "Érvénytelen paraméter. Várt formátum: /T[:]v,nn"\r
+STRING_CHOICE_ERROR_OPTION, "Érvénytelen paraméter: %s"\r
+STRING_CMD_ERROR1, "Nem lehet átirányítani a bevitelt a(z) %s állományból\n"\r
+STRING_CMD_ERROR2, "Hiba a csõvezetékhez tartozó ideiglenes állomány létrehozásakor\n"\r
+STRING_CMD_ERROR3, "Nem lehet a(z) %s állományba átirányítani\n"\r
+STRING_CMD_ERROR4, "%s futtatása...\n"\r
+STRING_CMD_ERROR5, "cmdexit.bat futtatása...\n"\r
+STRING_COLOR_ERROR1, "Ugyanaz a szín nem lehet! (Az elõ- és háttérszín nem lehet ugyanolyan)"\r
+STRING_COLOR_ERROR2, "Hibás szín megadás"\r
+STRING_COLOR_ERROR3, "Szín %x\n"\r
+STRING_COLOR_ERROR4, "Ugyanaz a szín nem lehet!"\r
+STRING_CONSOLE_ERROR, "Ismeretlen hiba: %d\n"\r
+STRING_COPY_ERROR1, "Hiba: a forrás nem nyitható meg - %s!\n"\r
+STRING_COPY_ERROR2, "Hiba: nem másolhatod önmagára az állományt!\n"\r
+STRING_COPY_ERROR3, "Hiba a cél írása közben!\n"\r
+STRING_COPY_ERROR4, "Hiba: ez még nem mûködik!\n"\r
+STRING_DATE_ERROR, "Érvénytelen dátum."\r
+STRING_DEL_ERROR5, "A(z) %s állomány törölve lesz! "\r
+STRING_DEL_ERROR6, "Biztos vagy benne (I/N)?"\r
+STRING_DEL_ERROR7, "Törlés: %s\n"\r
+STRING_ERROR_ERROR1, "Ismeretlen hiba! Hiba kód: 0x%lx\n"\r
+STRING_ERROR_ERROR2, "Szintaxis hiba"\r
+STRING_FOR_ERROR1, "az 'in' után hiányzik a feltétel."\r
+STRING_FOR_ERROR2, "nincs zárójel megadva."\r
+STRING_FOR_ERROR3, "a 'do' hiányzik." \r
+STRING_FOR_ERROR4, "nincs parancs a 'do' után."\r
+STRING_FREE_ERROR1, "Érvénytelen meghajtó"\r
+STRING_FREE_ERROR2, "nincs cimkézve"\r
+STRING_GOTO_ERROR1, "Nem lett cimke megadva a GOTO után"\r
+STRING_GOTO_ERROR2, "A '%s' cimke nem található\n"\r
+\r
+STRING_MOVE_ERROR1, "[OK]\n"\r
+STRING_MOVE_ERROR2, "[HIBA]\n"\r
+\r
+STRING_REN_ERROR1, "MoveÁllomány() sikertelen. Hiba: %lu\n"\r
+\r
+STRING_START_ERROR1, "Nincs batch támogatás jelenleg!"\r
+\r
+STRING_TIME_ERROR1, "Érvénytelen idõ."\r
+\r
+STRING_TYPE_ERROR1, "Érvénytelen beállítás '/%s'\n"\r
+\r
+STRING_WINDOW_ERROR1, "Az ablak nem található"\r
+\r
+\r
+STRING_ERROR_PARAMETERF_ERROR, "A paraméter megadás hibás - %c\n"\r
+STRING_ERROR_INVALID_SWITCH, "Érvénytelen kapcsoló - /%c\n"\r
+STRING_ERROR_TOO_MANY_PARAMETERS, "Túl sok paraméter - %s\n"\r
+STRING_ERROR_PATH_NOT_FOUND, "Az elérési_út nem halálható\n"\r
+STRING_ERROR_FILE_NOT_FOUND, "Az állomány nem található\n"\r
+STRING_ERROR_REQ_PARAM_MISSING, "Egy szükséges paraméter hiányzik\n"\r
+STRING_ERROR_INVALID_DRIVE, "Érvénytelen meghajtó\n"\r
+STRING_ERROR_INVALID_PARAM_FORMAT, "Érvénytelen paraméter megadás - %s\n"\r
+STRING_ERROR_BADCOMMAND, "Ismeretlen parancs vagy állomány név\n"\r
+STRING_ERROR_OUT_OF_MEMORY, "Nincs elég memória.\n"\r
+STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary állomány!\n"\r
+STRING_ERROR_D_PAUSEMSG, "A folytatáshoz nyomj meg egy billentyût . . ."\r
+STRING_ERROR_DRIVER_NOT_READY, "A meghajtó nem áll készen"\r
+\r
+STRING_PATH_ERROR, "CMD: Not in environment '%s'\n"\r
+\r
+STRING_CMD_SHELLINFO, "\nReactOS Parancssor értelmezõ"\r
+STRING_VERSION_RUNVER, " running on %s"\r
+STRING_COPY_FILE , " %d állomány másolva\n"\r
+STRING_DELETE_WIPE, "wiped"\r
+STRING_FOR_ERROR, "Hibás változó."\r
+STRING_SCREEN_COL, "Érvénytelen érték oszlopnak"\r
+STRING_SCREEN_ROW, "Érvénytelen érték sornak"\r
+STRING_TIMER_TIME "Idõzítõ %d értéke %s: "\r
+}\r
--- /dev/null
+#include "windows.h"
+#include "resource.h"
+/*
+ * Moved all hardcoded strings to En.rc.
+ * By Magnus Olsen 2005
+ */
+
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+STRINGTABLE DISCARDABLE
+{
+
+STRING_ATTRIB_HELP, "\83t\83@\83C\83\8b\91®\90«\82ð\95\\\8e¦\82Ü\82½\82Í\95Ï\8dX\82µ\82Ü\82·\81B\n\n\
+ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [\83t\83@\83C\83\8b] ...\n\
+ [/S [/D]]\n\n\
+ + \91®\90«\82ð\90Ý\92è\82µ\82Ü\82·\81B\n\
+ - \91®\90«\82ð\89ð\8f\9c\82µ\82Ü\82·\81B\n\
+ R \93Ç\82Ý\82Æ\82è\90ê\97p\91®\90«\81B\n\
+ A \83A\81[\83J\83C\83u\91®\90«\81B\n\
+ S \83V\83X\83e\83\80 \83t\83@\83C\83\8b\91®\90«\81B\n\
+ H \89B\82µ\83t\83@\83C\83\8b\91®\90«\81B\n\
+ /S \8c»\8dÝ\82Ì\83t\83H\83\8b\83_\82Æ\82·\82×\82Ä\82Ì\83T\83u\83t\83H\83\8b\83_\82Ì\88ê\92v\82·\82é\83t\83@\83C\83\8b\82ð\n\
+ \8f\88\97\9d\82µ\82Ü\82·\81B\n\
+ /D \83t\83H\83\8b\83_\82à\8f\88\97\9d\82µ\82Ü\82·\81B\n\n\
+\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82µ\82È\82¢\82Å ATTRIB \82Æ\93ü\97Í\82·\82é\82Æ\81A\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b\82Ì\91®\90«\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n"
+
+STRING_ALIAS_HELP, "\83G\83C\83\8a\83A\83X\82Ì\90Ý\92è\82â\89ð\8f\9c\82ð\82µ\82½\82è\81A\83G\83C\83\8a\83A\83X\82ð\95\\\8e¦\82µ\82½\82è\82µ\82Ü\82·\81B\n\n\
+ALIAS [\83G\83C\83\8a\83A\83X=[\83R\83}\83\93\83h]]\n\n\
+ \83G\83C\83\8a\83A\83X \83G\83C\83\8a\83A\83X\82Æ\82µ\82Ä\82Â\82¯\82é\96¼\91O\81B\n\
+ \83R\83}\83\93\83h \83G\83C\83\8a\83A\83X\82Æ\82µ\82Ä\90Ý\92è\82·\82é\95¶\8e\9a\97ñ\81B\n\n\
+\82·\82×\82Ä\82Ì\83G\83C\83\8a\83A\83X\82ð\88ê\97\97\95\\\8e¦\82·\82é\82É\82Í:\n\
+ ALIAS\n\n\
+\90V\82½\82É\83G\83C\83\8a\83A\83X\82ð\90Ý\92è\82µ\82½\82è\81A\8aù\91¶\82Ì\83G\83C\83\8a\83A\83X\82ð\92u\82«\8a·\82¦\82é\82É\82Í:\n\
+ ALIAS da=dir a:\n\n\
+\83G\83C\83\8a\83A\83X\82Ì\83\8a\83X\83g\82©\82ç\83G\83C\83\8a\83A\83X\82ð\8eæ\82è\8f\9c\82\82É\82Í:\n\
+ ALIAS da="
+
+STRING_BEEP_HELP, "\83X\83s\81[\83J\82©\82ç\83r\81[\83v\89¹\82ð\96Â\82ç\82µ\82Ü\82·\81B\n\nBEEP\n"
+
+STRING_CALL_HELP, "\83o\83b\83` \83v\83\8d\83O\83\89\83\80\82ð\95Ê\82Ì\83o\83b\83` \83v\83\8d\83O\83\89\83\80\82©\82ç\8cÄ\82Ñ\8fo\82µ\82Ü\82·\81B\n\n\
+CALL [\83h\83\89\83C\83u:][\83p\83X]\83t\83@\83C\83\8b\96¼ [\83o\83b\83`\83p\83\89\83\81\81[\83^]\n\n\
+ \83o\83b\83`\83p\83\89\83\81\81[\83^ \83o\83b\83` \83v\83\8d\83O\83\89\83\80\82Å\95K\97v\82È\83R\83}\83\93\83h \83\89\83C\83\93\8fî\95ñ\82ð\n\
+ \8ew\92è\82µ\82Ü\82·\81B"
+
+STRING_CD_HELP, "\8c»\8dÝ\82Ì\83f\83B\83\8c\83N\83g\83\8a\82ð\95Ï\8dX\82µ\82½\82è\81A\83f\83B\83\8c\83N\83g\83\8a\96¼\82ð\95\\\8e¦\82µ\82½\82è\82µ\82Ü\82·\81B\n\n\
+CHDIR [/D][\83h\83\89\83C\83u:][\83p\83X]\n\
+CHDIR[..|.]\n\
+CD [/D][\83h\83\89\83C\83u:]\83p\83X]\n\
+CD[..|.]\n\n\
+ .. \90e\83f\83B\83\8c\83N\83g\83\8a\n\
+ . \8c»\8dÝ\82Ì\83f\83B\83\8c\83N\83g\83\8a\n\
+ /D \8c»\8dÝ\82Ì\83h\83\89\83C\83u\82Æ\83f\83B\83\8c\83N\83g\83\8a\82Ì\97¼\95û\82ð\95Ï\8dX\82µ\82Ü\82·\81B\n\n\
+CD \83h\83\89\83C\83u: \82Æ\93ü\97Í\82·\82é\82Æ\8ew\92è\82³\82ê\82½\83h\83\89\83C\83u\82Ì\8c»\8dÝ\82Ì\83f\83B\83\8c\83N\83g\83\8a\82ª\95\\\8e¦\82³\82ê\82Ü\82·\81B\n\
+\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82µ\82È\82¢\82Å CD \82Æ\93ü\97Í\82·\82é\82Æ\81A\8c»\8dÝ\82Ì\83h\83\89\83C\83u\82Æ\83f\83B\83\8c\83N\83g\83\8a\82ª\95\\\8e¦\82³\82ê\82Ü\82·\81B\n"
+
+STRING_CHCP_HELP, "\8c»\8dÝ\82Ì\83R\81[\83h \83y\81[\83W\94Ô\8d\86\82ð\95\\\8e¦\82Ü\82½\82Í\90Ý\92è\82µ\82Ü\82·\81B\n\n\
+CHCP [nnn]\n\n\
+ nnn \83R\81[\83h \83y\81[\83W\94Ô\8d\86\82ð\8ew\92è\82µ\82Ü\82·\81B\n\n\
+\8c»\8dÝ\82Ì\83R\81[\83h \83y\81[\83W\94Ô\8d\86\82ð\95\\\8e¦\82·\82é\82Æ\82«\82Í\81A\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82¹\82¸\82É CHCP \82Æ\93ü\97Í\82µ\82Ä\82\82¾\82³\82¢\81B\n"
+
+STRING_CHOICE_HELP, "\83\86\81[\83U\81[\82ª\91I\91ð\8e\88\82©\82ç\88ê\82Â\82ð\91I\91ð\82·\82é\82Ì\82ð\91Ò\82¿\82Ü\82·\81B\n\n\
+CHOICE [/C[:]\91I\91ð\8e\88][/N][/S][/T[:]c,nn][\95¶\8e\9a\97ñ]\n\n\
+ /C[:]\91I\91ð\8e\88 \8b\96\82³\82ê\82é\83L\81[\93ü\97Í\82ð\8ew\92è\82µ\82Ü\82·\81B\83f\83t\83H\83\8b\83g\82Í YN \82Å\82·\81B\n\
+ /N \83v\83\8d\83\93\83v\83g\82Ì\95¶\8e\9a\97ñ\82Ì\8dÅ\8cã\82É\81A\91I\91ð\8e\88\82Æ ? \82ð\95\\\8e¦\82µ\82Ü\82¹\82ñ\81B\n\
+ /S \83L\81[\93ü\97Í\82Ì\91å\95¶\8e\9a\81E\8f¬\95¶\8e\9a\82ð\8bæ\95Ê\82µ\82Ü\82·\81B\n\
+ /T[:]c,nn nn \95b\8co\89ß\82·\82é\82Æ\8e©\93®\93I\82É c \82ð\91I\91ð\82µ\82Ü\82·\81B\n\
+ \95¶\8e\9a\97ñ \95\\\8e¦\82·\82é\83v\83\8d\83\93\83v\83g\82Ì\95¶\8e\9a\97ñ\82Å\82·\81B\n\n\
+\83\86\81[\83U\81[\82ª\91I\91ð\8e\88\82É\82 \82é\83L\81[\82ð\89\9f\82·\82Æ\81A\82»\82Ì\83I\83t\83Z\83b\83g\82ª ERRORLEVEL \82É\83Z\83b\83g\82³\82ê\82Ü\82·\81B\n"
+
+STRING_CLS_HELP, "\89æ\96Ê\82ð\8fÁ\8b\8e\82µ\82Ü\82·\81B\n\nCLS\n"
+
+STRING_CMD_HELP1, "\n\97\98\97p\82Å\82«\82é\93à\95\94\83R\83}\83\93\83h:\n"
+
+STRING_CMD_HELP2, "\n\97\98\97p\82Å\82«\82é\8b@\94\\:"
+
+STRING_CMD_HELP3," [\83G\83C\83\8a\83A\83X]"
+
+STRING_CMD_HELP4," [\83q\83X\83g\83\8a]"
+
+STRING_CMD_HELP5," [UNIX \83t\83@\83C\83\8b\96¼\95â\8a®]"
+
+STRING_CMD_HELP6," [\83f\83B\83\8c\83N\83g\83\8a \83X\83^\83b\83N]"
+
+STRING_CMD_HELP7," [\83\8a\83_\83C\83\8c\83N\83g\82Æ\83p\83C\83v]"
+
+STRING_CMD_HELP8, "ReactOS \83R\83}\83\93\83h \83\89\83C\83\93 \83C\83\93\83^\81[\83v\83\8a\83^\82Ì\90V\82µ\82¢\83C\83\93\83X\83^\83\93\83X\82ð\8aJ\8en\82µ\82Ü\82·\81B\n\n\
+CMD [/[C|K] \83R\83}\83\93\83h][/P][/Q][/T:bf]\n\n\
+ /C \83R\83}\83\93\83h \8ew\92è\82³\82ê\82½\83R\83}\83\93\83h\82ð\8eÀ\8ds\82µ\82½\8cã\81A\8fI\97¹\82µ\82Ü\82·\81B\n\
+ /K \83R\83}\83\93\83h \8ew\92è\82³\82ê\82½\83R\83}\83\93\83h\82ð\8eÀ\8ds\82µ\82Ü\82·\82ª\81A\8fI\97¹\82µ\82Ü\82¹\82ñ\81B\n\
+ /P CMD \82Í\89i\91±\93I\82É\93®\8dì\82ð\82µ\81Aautoexec.bat \82ð\8eÀ\8ds\82µ\82Ü\82·\n\
+ (\8fI\97¹\82³\82¹\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ)\81B\n\
+ /T:bf \91O\8ci\90F\82¨\82æ\82Ñ\94w\8ci\90F\82ð\90Ý\92è\82µ\82Ü\82· (\8fÚ\8d×\82Í COLOR /? \82ð\8eQ\8fÆ\82µ\82Ä\n\
+ \82\82¾\82³\82¢)\81B\n"
+
+STRING_COLOR_HELP1, "\83R\83\93\83\\\81[\83\8b\82Ì\83f\83t\83H\83\8b\83g\82Ì\91O\8ci\90F\82¨\82æ\82Ñ\94w\8ci\90F\82ð\90Ý\92è\82µ\82Ü\82·\81B\n\n\
+COLOR [\91®\90« [/-F]] \n\n\
+ \91®\90« \83R\83\93\83\\\81[\83\8b\8fo\97Í\82Ì\90F\91®\90«\82ð\8ew\92è\82µ\82Ü\82·\81B\n\
+ /-F \83R\83\93\83\\\81[\83\8b\82Ì\8bó\82¢\82Ä\82¢\82é\8bó\8aÔ\82É\82Í\90F\91®\90«\82ð\93K\97p\82µ\82È\82¢\81B\n\n\
+\90F\82Í\8e\9f\82Ì 3 \8eí\97Þ\82Ì\95û\96@\82Å\8ew\92è\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B\n\
+1) [\90F\96¼] on [\90F\96¼] (\95K\97v\82È\82Ì\82Í\8dÅ\8f\89\82Ì 3 \95¶\8e\9a\82¾\82¯\82Å\82·)\n\
+2) [10 \90i\90\94] on [10 \90i\90\94]\n\
+3) 2 \8c\85\82Ì 16 \90i\90\94\n\n\
+\90F\96¼:\n\
+10\90i 16\90i \90F\96¼ 10\90i 16\90i \90F\96¼\n\
+0 0 \8d\95 8 8 \8aD\90F (\96¾\82é\82¢\8d\95)\n\
+1 1 \90Â 9 9 \96¾\82é\82¢\90Â\n\
+2 2 \97Î 10 A \96¾\82é\82¢\97Î\n\
+3 3 \90\85\90F 11 B \96¾\82é\82¢\90\85\90F\n\
+4 4 \90Ô 12 C \96¾\82é\82¢\90Ô\n\
+5 5 \8e\87 13 D \96¾\82é\82¢\8e\87\n\
+6 6 \89©\90F 14 E \96¾\82é\82¢\89©\90F\n\
+7 7 \94\92 15 F \8bP\82\94\92\n"
+
+STRING_COPY_HELP1, "%s \82ð\8fã\8f\91\82«\82µ\82Ü\82·\82ª\81A\82æ\82ë\82µ\82¢\82Å\82·\82©? (Yes/No/All)? "
+
+STRING_COPY_HELP2, "1 \82Â\82Ü\82½\82Í\95¡\90\94\82Ì\83t\83@\83C\83\8b\82ð\95Ê\82Ì\8fê\8f\8a\82É\83R\83s\81[\82µ\82Ü\82·\81B\n\n\
+COPY [/V][/Y|/-Y][/A|/B] \83R\83s\81[\8c³ [/A|/B]\n\
+ [+ \83R\83s\81[\8c³ [/A|/B] [+ ...]] [\83R\83s\81[\90æ [/A|/B]]\n\n\
+ \83R\83s\81[\8c³ \83R\83s\81[\82·\82é\83t\83@\83C\83\8b (\95¡\90\94\89Â) \82ð\8ew\92è\82µ\82Ü\82·\81B\n\
+ /A ASCII \83e\83L\83X\83g \83t\83@\83C\83\8b\82Æ\82µ\82Ä\88µ\82¢\82Ü\82·\81B\n\
+ /B \83o\83C\83i\83\8a \83t\83@\83C\83\8b\82Æ\82µ\82Ä\88µ\82¢\82Ü\82·\81B\n\
+ \83R\83s\81[\90æ \90V\82µ\82¢\83t\83@\83C\83\8b\82Ì\83f\83B\83\8c\83N\83g\83\8a\82Ü\82½\82Í\83t\83@\83C\83\8b\96¼ (\95¡\90\94\89Â) \82ð\n\
+ \8ew\92è\82µ\82Ü\82·\81B\n\
+ /V \90V\82µ\82¢\83t\83@\83C\83\8b\82ª\90³\82µ\82\8f\91\82«\8d\9e\82Ü\82ê\82½\82©\8c\9f\8d¸\82µ\82Ü\82·\81B\n\
+ /Y \8eó\82¯\91¤\82Ì\8aù\91¶\82Ì\83t\83@\83C\83\8b\82ð\8fã\8f\91\82«\82·\82é\91O\82É\8am\94F\82Ì\83\81\83b\83Z\81[\83W\82ð\n\
+ \95\\\8e¦\82µ\82Ü\82¹\82ñ\81B\n\
+ /-Y \8eó\82¯\91¤\82Ì\8aù\91¶\82Ì\83t\83@\83C\83\8b\82ð\8fã\8f\91\82«\82·\82é\91O\82É\8am\94F\82Ì\83\81\83b\83Z\81[\83W\82ð\n\
+ \95\\\8e¦\82µ\82Ü\82·\81B\n\n\
+T\8aÂ\8b«\95Ï\90\94 COPYCMD \82Å\83X\83C\83b\83` /Y \82ª\90Ý\92è\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B\n\
+...\n"
+
+STRING_DATE_HELP1, "\n\90V\82µ\82¢\93ú\95t\82ð\93ü\97Í\82µ\82Ä\82\82¾\82³\82¢ (mm%cdd%cyyyy): "
+
+STRING_DATE_HELP2, "\n\90V\82µ\82¢\93ú\95t\82ð\93ü\97Í\82µ\82Ä\82\82¾\82³\82¢ (dd%cmm%cyyyy): "
+
+STRING_DATE_HELP3, "\n\90V\82µ\82¢\93ú\95t\82ð\93ü\97Í\82µ\82Ä\82\82¾\82³\82¢ (yyyy%cmm%cdd): "
+
+STRING_DATE_HELP4, "\93ú\95t\82ð\95\\\8e¦\82Ü\82½\82Í\90Ý\92è\82µ\82Ü\82·\81B\n\n\
+DATE [/T][\93ú\95t]\n\n\
+ /T \93ú\95t\82Ì\95\\\8e¦\82Ì\82Ý\8ds\82¢\82Ü\82·\81B\n\n\
+\83p\83\89\83\81\81[\83^\82Ì\8ew\92è\82ª\82È\82¢\8fê\8d\87\82Í\81A\8c»\8dÝ\82Ì\93ú\95t\82ª\95\\\8e¦\82³\82ê\81A\90V\82µ\82¢\93ú\95t\82Ì\93ü\97Í\82ð\n\
+\8b\81\82ß\82ç\82ê\82Ü\82·\81B\95Ï\8dX\82µ\82È\82¢\8fê\8d\87\82Í\81AEnter \83L\81[\82ð\89\9f\82µ\82Ü\82·\81B\n"
+
+STRING_DEL_HELP1, "1 \82Â\82Ü\82½\82Í\95¡\90\94\82Ì\83t\83@\83C\83\8b\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\n\n\
+DEL [/N /P /T /Q /S /W /Y /Z /A[[:]\91®\90«]] \83t\83@\83C\83\8b\96¼ ...\n\
+DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]\91®\90«]] \83t\83@\83C\83\8b\96¼ ...\n\
+ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]\91®\90«]] \83t\83@\83C\83\8b\96¼ ...\n\n\
+ \83t\83@\83C\83\8b\96¼\n\
+ \8dí\8f\9c\82·\82é\83t\83@\83C\83\8b (\95¡\90\94\89Â) \82ð\8ew\92è\82µ\82Ü\82·\81B\n\n\
+ /N Nothing. \89½\82à\82µ\82Ü\82¹\82ñ\81B\n\
+ /P Prompt. \8ae\83t\83@\83C\83\8b\82ð\8dí\8f\9c\82·\82é\91O\82É\8am\94F\82Ì\83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ /T Total. \8dí\8f\9c\82³\82ê\82½\83t\83@\83C\83\8b\82Ì\91\8d\90\94\82Æ\89ð\95ú\82³\82ê\82½\83f\83B\83X\83N\97Ì\88æ\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ /Q Quiet.\n\
+ /W Wipe. \8dí\8f\9c\82·\82é\91O\82É\81A\83t\83@\83C\83\8b\82ð\97\90\90\94\82Å\8fã\8f\91\82«\82µ\82Ü\82·\81B\n\
+ /Y Yes. \83\8f\83C\83\8b\83h\83J\81[\83h\82ð\8eg\97p\82µ\82Ä\88ê\8a\87\8dí\8f\9c\82·\82é\82Æ\82«\82à\81A\8am\94F\82Ì\83\81\83b\83Z\81[\83W\82ð\n\
+ \95\\\8e¦\82¹\82¸\82É\8dí\8f\9c\82µ\82Ü\82·\81B\n\
+ /F \93Ç\82Ý\82Æ\82è\90ê\97p\83t\83@\83C\83\8b\82â\83V\83X\83e\83\80 \83t\83@\83C\83\8b\82ð\8b\90§\93I\82É\8dí\8f\9c\82µ\82Ü\82·\81B\n\
+ /S \8ew\92è\82³\82ê\82½\83t\83@\83C\83\8b\82ð\82·\82×\82Ä\82Ì\83T\83u\83f\83B\83\8c\83N\83g\83\8a\82©\82ç\8dí\8f\9c\82µ\82Ü\82·\81B\n\
+ /A \91®\90«\82É\82æ\82è\8dí\8f\9c\82·\82é\83t\83@\83C\83\8b\82ð\91I\91ð\82µ\82Ü\82·\81B\n\
+ \91®\90«\n\
+ R \93Ç\82Ý\8eæ\82è\90ê\97p\n\
+ S \83V\83X\83e\83\80 \83t\83@\83C\83\8b\n\
+ A \83A\81[\83J\83C\83u\n\
+ H \89B\82µ\83t\83@\83C\83\8b\n\
+ - \82»\82Ì\91®\90«\88È\8aO\n"
+
+STRING_DEL_HELP2, "\83f\83B\83\8c\83N\83g\83\8a\82Ì\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b\82ª\8dí\8f\9c\82³\82ê\82Ü\82·!\n\82æ\82ë\82µ\82¢\82Å\82·\82© (Y/N)?"
+STRING_DEL_HELP3, " %lu \8cÂ\82Ì\83t\83@\83C\83\8b\82ð\8dí\8f\9c\82µ\82Ü\82µ\82½\n"
+STRING_DEL_HELP4, " %lu \8cÂ\82Ì\83t\83@\83C\83\8b\82ð\8dí\8f\9c\82µ\82Ü\82µ\82½\n"
+
+STRING_DELAY_HELP, "n \95b\81A\82Ü\82½\82Í n \83~\83\8a\95b\91Ò\8b@\82µ\82Ü\82·\81B\n\
+DELAY [/m]n\n\n\
+ /m \92P\88Ê\82ð\83~\83\8a\95b\82É\8ew\92è\82µ\82Ü\82·\81B\n\
+ \8ew\92è\82µ\82È\82¢\8fê\8d\87\81A\92P\88Ê\82É\82Í\95b\82ª\8eg\82í\82ê\82Ü\82·\81B\n"
+
+STRING_DIR_HELP1, "\83f\83B\83\8c\83N\83g\83\8a\92\86\82Ì\83t\83@\83C\83\8b\82Æ\83T\83u\83f\83B\83\8c\83N\83g\83\8a\82ð\88ê\97\97\95\\\8e¦\82µ\82Ü\82·\81B\n\n\
+DIR [\83h\83\89\83C\83u:][\83p\83X][\83t\83@\83C\83\8b\96¼] [/A[[:]\91®\90«]] [/B] [/C] [/D] [/L] [/N]\n\
+ [/O[[:]\83\\\81[\83g\8f\87]] [/P] [/Q] [/S] [/T[[:]\83^\83C\83\80\83t\83B\81[\83\8b\83h]] [/W] [/X] [/4]\n\n\
+ [\83h\83\89\83C\83u:][\83p\83X][\83t\83@\83C\83\8b\96¼]\n\
+ \88ê\97\97\95\\\8e¦\82·\82é\83h\83\89\83C\83u\81A\83f\83B\83\8c\83N\83g\83\8a\81A\82Ü\82½\82Í\83t\83@\83C\83\8b\82ð\8ew\92è\82µ\82Ü\82·\81B\n\
+ /A \8ew\92è\82³\82ê\82½\91®\90«\82Ì\83t\83@\83C\83\8b\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ \91®\90« D \83f\83B\83\8c\83N\83g\83\8a R \93Ç\82Ý\8eæ\82è\90ê\97p\n\
+ H \89B\82µ\83t\83@\83C\83\8b A \83A\81[\83J\83C\83u\n\
+ S \83V\83X\83e\83\80 \83t\83@\83C\83\8b - \82»\82Ì\91®\90«\88È\8aO\n\
+ /B \83t\83@\83C\83\8b\96¼\82Ì\82Ý\82ð\95\\\8e¦\82µ\82Ü\82· (\8c©\8fo\82µ\82â\97v\96ñ\82ª\95t\82«\82Ü\82¹\82ñ)\81B\n\
+ /C \83t\83@\83C\83\8b \83T\83C\83Y\82ð\8c\85\8bæ\90Ø\82è\95\\\8e¦\82µ\82Ü\82·\81B\82±\82ê\82Í\n\
+ \83f\83t\83H\83\8b\83g\82Ì\90Ý\92è\82Å\82·\81B/-C \82Æ\82·\82é\82Æ\8c\85\8bæ\90Ø\82è\95\\\8e¦\82³\82ê\82Ü\82¹\82ñ\81B\n\
+ /D /W \82Æ\93¯\82¶\82Å\82·\82ª\81A\83t\83@\83C\83\8b\82ð\97ñ\82Å\95À\82×\91Ö\82¦\82½\88ê\97\97\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ /L \8f¬\95¶\8e\9a\82Å\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ /N \83t\83@\83C\83\8b\96¼\82ð\89E\92[\82É\95\\\8e¦\82·\82é\90V\82µ\82¢\88ê\97\97\8c`\8e®\82ð\8eg\97p\82µ\82Ü\82·\81B\n\
+ /O \83t\83@\83C\83\8b\82ð\95À\82×\91Ö\82¦\82Ä\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ \83\\\81[\83g\8f\87 N \96¼\91O\8f\87 (\83A\83\8b\83t\83@\83x\83b\83g) S \83T\83C\83Y\8f\87 (\8f¬\82³\82¢\82Ù\82¤\82©\82ç)\n\
+ E \8ag\92£\8eq\8f\87 (\83A\83\8b\83t\83@\83x\83b\83g) D \93ú\8e\9e\8f\87 (\8cÃ\82¢\82Ù\82¤\82©\82ç)\n\
+ G \83O\83\8b\81[\83v (\83f\83B\83\8c\83N\83g\83\8a\82©\82ç) - \8d~\8f\87\n\
+ /P 1 \89æ\96Ê\82²\82Æ\82É\92â\8e~\82µ\82Ä\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ /Q \83t\83@\83C\83\8b\82Ì\8f\8a\97L\8eÒ\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ /S \8ew\92è\82³\82ê\82½\83f\83B\83\8c\83N\83g\83\8a\82¨\82æ\82Ñ\82»\82Ì\83T\83u\83f\83B\83\8c\83N\83g\83\8a\82Ì\82·\82×\82Ä\82Ì\n\
+ \83t\83@\83C\83\8b\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ /T \82Ç\82Ì\83^\83C\83\80\83t\83B\81[\83\8b\83h\82ð\95\\\8e¦\82·\82é\82©\81A\82Ü\82½\82Í\95À\82×\91Ö\82¦\82É\8eg\97p\82·\82é\82©\82ð\n\
+ \8ew\92è\82µ\82Ü\82·\81B\n\
+ \83^\83C\83\80\83t\83B\81[\83\8b\83h C \8dì\90¬n\n\
+ A \8dÅ\8fI\83A\83N\83Z\83X\n\
+ W \8dÅ\8fI\8dX\90V\n\
+ /W \83\8f\83C\83h\88ê\97\97\8c`\8e®\82Å\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ /X \82±\82Ì\83I\83v\83V\83\87\83\93\82Í MS-DOS \8c`\8e® (8.3) \88È\8aO\82Ì\83t\83@\83C\83\8b\96¼\82É\91Î\82·\82é\92Z\82¢\n\
+ \96¼\91O\82ð\95\\\8e¦\82µ\82Ü\82·\81B\92·\82¢\96¼\91O\82Ì\91O\82É\92Z\82¢\96¼\91O\82ð\95\\\8e¦\82·\82é\93_\82ð\8f\9c\82¯\82Î\81A\n\
+ /N \83I\83v\83V\83\87\83\93\82Æ\93¯\82¶\82Å\82·\81B\92Z\82¢\96¼\91O\82ª\82È\82¢\8fê\8d\87\82Í\81A\83u\83\89\83\93\83N\82É\n\
+ \82È\82è\82Ü\82·\81B\n\
+ /4 4 \82Â\82Ì\90\94\8e\9a\82Å\94N\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\n\
+\8aÂ\8b«\95Ï\90\94 DIRCMD \82É\83X\83C\83b\83`\82ð\90Ý\92è\82Å\82«\82Ü\82·\81B\n\
+/-W \82Ì\82æ\82¤\82É - (\83n\83C\83t\83\93) \82ð\91O\82É\82Â\82¯\82é\82Æ\81A\82»\82Ì\83X\83C\83b\83`\82Í\96³\8cø\82É\82È\82è\82Ü\82·\81B\n"
+
+STRING_DIR_HELP2, " \83h\83\89\83C\83u %c \82Ì\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82Í %s \82Å\82·\n"
+STRING_DIR_HELP3, " \83h\83\89\83C\83u %c \82É\82Í\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82ª\82 \82è\82Ü\82¹\82ñ\81B\n"
+STRING_DIR_HELP4, " \83{\83\8a\83\85\81[\83\80 \83V\83\8a\83A\83\8b\94Ô\8d\86\82Í %04X-%04X \82Å\82·\n"
+STRING_DIR_HELP5, "\n \83t\83@\83C\83\8b\82Ì\91\8d\90\94:\n%16i \8cÂ\82Ì\83t\83@\83C\83\8b% 14s \83o\83C\83g\n"
+STRING_DIR_HELP6, "%16i \8cÂ\82Ì\83f\83B\83\8c\83N\83g\83\8a% 15s \83o\83C\83g\n"
+STRING_DIR_HELP7, "\n %s \82Ì\83f\83B\83\8c\83N\83g\83\8a\n\n"
+STRING_DIR_HELP8, "%16i \8cÂ\82Ì\83t\83@\83C\83\8b% 14s \83o\83C\83g\n"
+
+STRING_DIRSTACK_HELP1, "POPD \83R\83}\83\93\83h\82Å\8eg\97p\82·\82é\82½\82ß\82É\8c»\8dÝ\82Ì\83f\83B\83\8c\83N\83g\83\8a\82ð\95Û\91¶\82µ\81A\n\
+\8ew\92è\82µ\82½\83f\83B\83\8c\83N\83g\83\8a\82É\95Ï\8dX\82µ\82Ü\82·\81B\n\n\
+PUSHD [\83p\83X | ..]\n\n\
+ \83p\83X \8c»\8dÝ\82Ì\83f\83B\83\8c\83N\83g\83\8a\82Æ\82µ\82Ä\90Ý\92è\82·\82é\83f\83B\83\8c\83N\83g\83\8a\82ð\8ew\92è\82µ\82Ü\82·\81B\n"
+
+STRING_DIRSTACK_HELP2, "PUSHD \83R\83}\83\93\83h\82Å\8bL\89¯\82³\82ê\82½\83f\83B\83\8c\83N\83g\83\8a\82É\95Ï\8dX\82µ\82Ü\82·\81B\n\nPOPD"
+
+STRING_DIRSTACK_HELP3, "\83f\83B\83\8c\83N\83g\83\8a \83X\83^\83b\83N\82Ì\88ê\97\97\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\nDIRS"
+
+STRING_DIRSTACK_HELP4, "\83f\83B\83\8c\83N\83g\83\8a \83X\83^\83b\83N\82Í\8bó\82Å\82·\81B"
+
+STRING_ECHO_HELP1, "\83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82Ü\82·\82ª\81A\91O\82É\83L\83\83\83\8a\83b\83W \83\8a\83^\81[\83\93\82Æ\83\89\83C\83\93\83t\83B\81[\83h\82ð\82Â\82¯\82Ü\82¹\82ñ\81B\n\n\
+ ECHOS \83\81\83b\83Z\81[\83W"
+
+STRING_ECHO_HELP2, "\95W\8f\80\83G\83\89\81[\82É\83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\n\
+ ECHOERR \83\81\83b\83Z\81[\83W\n\
+ ECHOERR. \8bó\8ds\82ð\8fo\97Í\82µ\82Ü\82·\81B"
+
+STRING_ECHO_HELP3, "\95W\8f\80\83G\83\89\81[\82É\83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82Ü\82·\82ª\81A\91O\82É\83L\83\83\83\8a\83b\83W \83\8a\83^\81[\83\93\82Æ\n\
+\83\89\83C\83\93\83t\83B\81[\83h\82ð\82Â\82¯\82Ü\82¹\82ñ\81B\n\n\
+ ECHOSERR \83\81\83b\83Z\81[\83W"
+
+STRING_ECHO_HELP4, "\83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82½\82è\81A\83R\83}\83\93\83h \83G\83R\81[\82Ì ON \82Æ OFF \82ð\90Ø\82è\91Ö\82¦\82Ü\82·\81B\n\n\
+ ECHO [ON | OFF]\n\
+ ECHO [\83\81\83b\83Z\81[\83W]\n\
+ ECHO. \8bó\8ds\82ð\8fo\97Í\82µ\82Ü\82·\81B\n\n\
+\8c»\8dÝ\82Ì\83G\83R\81[\90Ý\92è\82ð\95\\\8e¦\82·\82é\82É\82Í\81A\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82¹\82¸\82É ECHO \82Æ\93ü\97Í\82µ\82Ä\82\82¾\82³\82¢\81B"
+
+STRING_ECHO_HELP5, "ECHO \82Í %s \82Å\82·\81B\n"
+
+STRING_EXIT_HELP, "\83R\83}\83\93\83h \83C\83\93\83^\81[\83v\83\8a\83^\82ð\8fI\97¹\82µ\82Ü\82·\81B\n\nEXIT\n"
+
+STRING_FOR_HELP1, "\8ew\92è\82³\82ê\82½\83R\83}\83\93\83h\82ð\83t\83@\83C\83\8b \83Z\83b\83g\82Ì\8ae\83t\83@\83C\83\8b\82É\91Î\82µ\82Ä\8eÀ\8ds\82µ\82Ü\82·\81B\n\n\
+FOR %%\95Ï\90\94 IN (\83Z\83b\83g) DO \83R\83}\83\93\83h [\83p\83\89\83\81\81[\83^]\n\n\
+ %%\95Ï\90\94 \92P\88ê\95¶\8e\9a\82Ì\92u\82«\8a·\82¦\89Â\94\\\82È\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82µ\82Ü\82·\81B\n\
+ (\83Z\83b\83g) \83t\83@\83C\83\8b \83Z\83b\83g\82ð\8ew\92è\82µ\82Ü\82·\81B\83\8f\83C\83\8b\83h\83J\81[\83h\82ð\8eg\97p\82Å\82«\82Ü\82·\81B\n\
+ \83R\83}\83\93\83h \8ae\83t\83@\83C\83\8b\82²\82Æ\82É\8eÀ\8ds\82·\82é\83R\83}\83\93\83h\82ð\8ew\92è\82µ\82Ü\82·\81B\n\
+ \83p\83\89\83\81\81[\83^ \8ew\92è\82³\82ê\82½\83R\83}\83\93\83h\82Ì\83p\83\89\83\81\81[\83^\82Ü\82½\82Í\83X\83C\83b\83`\82ð\8ew\92è\82µ\82Ü\82·\81B\n\n\
+\83o\83b\83` \83v\83\8d\83O\83\89\83\80\82Å FOR \83R\83}\83\93\83h\82ð\8eg\97p\82·\82é\82Æ\82«\82Í\81A%%\95Ï\90\94\82Ì\91ã\82í\82è\82É\81A\n\
+%%%%\95Ï\90\94\82ð\8eg\97p\82µ\82Ä\82\82¾\82³\82¢\81B\n"
+
+STRING_FREE_HELP1, "\n\83h\83\89\83C\83u %c \82Ì\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82Í %-11s \82Å\82·\n\
+ \83V\83\8a\83A\83\8b\94Ô\8d\86\82Í %s \82Å\82·\n\
+ %16s \83o\83C\83g: \91S\83f\83B\83X\83N\97e\97Ê\n\
+ %16s \83o\83C\83g: \8eg\97p\92\86\n\
+ %16s \83o\83C\83g: \8bó\82«\97e\97Ê\n"
+
+STRING_FREE_HELP2, "\83h\83\89\83C\83u\82É\8aÖ\82·\82é\8fî\95ñ\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\nFREE [\83h\83\89\83C\83u: ...]\n"
+
+STRING_IF_HELP1, "\83o\83b\83` \83v\83\8d\83O\83\89\83\80\92\86\82Å\8fð\8c\8f\8f\88\97\9d\82ð\8eÀ\8ds\82µ\82Ü\82·\81B\n\n\
+ IF [NOT] ERRORLEVEL \94Ô\8d\86 \83R\83}\83\93\83h\n\
+ IF [NOT] \95¶\8e\9a\97ñ1==\95¶\8e\9a\97ñ2 \83R\83}\83\93\83h\n\
+ IF [NOT] EXIST \83t\83@\83C\83\8b\96¼ \83R\83}\83\93\83h\n\
+ IF [NOT] DEFINED \95Ï\90\94 \83R\83}\83\93\83h\n\n\
+NOT \8fð\8c\8f\82ª\8bU\82Ì\8fê\8d\87\82É\82¾\82¯\81ACMD \82ª\83R\83}\83\93\83h\82ð\8eÀ\8ds\82·\82é\82±\82Æ\82ð\n\
+ \8ew\92è\82µ\82Ü\82·\81B\n\
+ERRORLEVEL \94Ô\8d\86 \8dÅ\8cã\82Ì\83v\83\8d\83O\83\89\83\80\82Ì\8eÀ\8ds\82Å\8ew\92è\82³\82ê\82½\94Ô\8d\86\88È\8fã\82Ì\8fI\97¹\83R\81[\83h\n\
+ \82ª\95Ô\82³\82ê\82½\82Æ\82«\82É\81A\8fð\8c\8f\82ª\90^\82É\82È\82é\82æ\82¤\82É\8ew\92è\82µ\82Ü\82·\81B\n\
+\83R\83}\83\93\83h \8fð\8c\8f\82ª\90^\82Ì\82Æ\82«\82É\8eÀ\8ds\82·\82é\83R\83}\83\93\83h\82ð\8ew\92è\82µ\82Ü\82·\81B\n\
+\95¶\8e\9a\97ñ1==\95¶\8e\9a\97ñ2 \83e\83L\83X\83g\95¶\8e\9a\97ñ\82ª\88ê\92v\82·\82é\82Æ\82«\82É\8fð\8c\8f\82ª\90^\82É\82È\82é\82æ\82¤\82É\8ew\92è\n\
+ \82µ\82Ü\82·\81B\n\
+EXIST \83t\83@\83C\83\8b\96¼ \8ew\92è\82µ\82½\83t\83@\83C\83\8b\96¼\82ª\91¶\8dÝ\82·\82é\82Æ\82«\82É\8fð\8c\8f\82ª\90^\82É\82È\82é\82æ\82¤\82É\n\
+ \8ew\92è\82µ\82Ü\82·\81B\n\
+DEFINED \95Ï\90\94 \8ew\92è\82µ\82½\95Ï\90\94\82ª\92è\8b`\82³\82ê\82Ä\82¢\82é\82Æ\82«\82É\8fð\8c\8f\82ª\90^\82É\82È\82é\82æ\82¤\82É\n\
+ \8ew\92è\82µ\82Ü\82·\81B\n"
+
+STRING_GOTO_HELP1, "\83o\83b\83` \83v\83\8d\83O\83\89\83\80\93à\82Ì\81A\83\89\83x\83\8b\82Å\8ew\92è\82³\82ê\82Ä\82¢\82é\8ds\82Ö\90§\8cä\82ð\88Ú\93®\82µ\82Ü\82·\81B\n\n\
+GOTO \83\89\83x\83\8b\n\n\
+ \83\89\83x\83\8b \83o\83b\83` \83v\83\8d\83O\83\89\83\80\82Å\83\89\83x\83\8b\82Æ\82µ\82Ä\8eg\97p\82·\82é\83e\83L\83X\83g\95¶\8e\9a\97ñ\82ð\8ew\92è\82µ\82Ü\82·\81B\n\n\
+\83\89\83x\83\8b\82Ì\90æ\93ª\82É\82Í : (\83R\83\8d\83\93) \82ð\8ew\92è\82µ\81A\83\89\83x\83\8b\82¾\82¯\82ð\92P\93Æ\82Å 1 \8ds\82É\93ü\97Í\82µ\82Ä\82\82¾\n\
+\82³\82¢\81B"
+
+STRING_LABEL_HELP1, "\83f\83B\83X\83N\82Ì\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82ð\95\\\8e¦\82Ü\82½\82Í\95Ï\8dX\82µ\82Ü\82·\81B\n\nLABEL [\83h\83\89\83C\83u:][\83\89\83x\83\8b]\n"
+
+STRING_LABEL_HELP2, "\83h\83\89\83C\83u %c: \82Ì\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82Í %s \82Å\82·\n"
+STRING_LABEL_HELP3, "\83h\83\89\83C\83u %c: \82É\82Í\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82ª\82 \82è\82Ü\82¹\82ñl\n"
+STRING_LABEL_HELP4, "\83{\83\8a\83\85\81[\83\80 \83V\83\8a\83A\83\8b\94Ô\8d\86\82Í %04X-%04X\n \82Å\82·"
+STRING_LABEL_HELP5, "\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82ð 11 \95¶\8e\9a\88È\93à\82Å\93ü\97Í\82µ\82Ä\82\82¾\82³\82¢\81B\n\95K\97v\82È\82¯\82ê\82Î Enter \83L\81[\82ð\89\9f\82µ\82Ä\82\82¾\82³\82¢: "
+
+STRING_LOCALE_HELP1, "\8c»\8dÝ\8e\9e\8d\8f\82Í"
+
+STRING_MKDIR_HELP, "\83f\83B\83\8c\83N\83g\83\8a\82ð\8dì\90¬\82µ\82Ü\82·\81B\n\n\
+MKDIR [\83h\83\89\83C\83u:]\83p\83X\n\
+MD [\83h\83\89\83C\83u:]\83p\83X"
+
+STRING_MEMMORY_HELP1, "\83V\83X\83e\83\80 \83\81\83\82\83\8a\82Ì\97Ê\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\nMEMORY"
+
+STRING_MEMMORY_HELP2, "\n %12s%% \82Ì\83\81\83\82\83\8a\82ª\8eg\97p\82³\82ê\82Ä\82¢\82Ü\82·\81B\n\n\
+ %13s \83o\83C\83g: \91S\95¨\97\9d\83\81\83\82\83\8a\n\
+ %13s \83o\83C\83g: \97\98\97p\89Â\94\\\82È\95¨\97\9d\83\81\83\82\83\8a\n\n\
+ %13s \83o\83C\83g: \91S\83y\81[\83W\83t\83@\83C\83\8b\n\
+ %13s \83o\83C\83g: \97\98\97p\89Â\94\\\82È\83y\81[\83W\83t\83@\83C\83\8b\n\n\
+ %13s \83o\83C\83g: \91S\89¼\91z\83\81\83\82\83\8a\n\
+ %13s \83o\83C\83g: \97\98\97p\89Â\94\\\82È\89¼\91z\83\81\83\82\83\8a\n"
+
+STRING_MISC_HELP1, "\91±\8ds\82·\82é\82É\82Í\89½\82©\83L\81[\82ð\89\9f\82µ\82Ä\82\82¾\82³\82¢ ...\n"
+
+STRING_MOVE_HELP1, "%s \82ð\8fã\8f\91\82«\82µ\82Ü\82·\82ª\82æ\82ë\82µ\82¢\82Å\82·\82© (Yes/No/All)? "
+
+STRING_MOVE_HELP2, "\83t\83@\83C\83\8b\82ð\88Ú\93®\82¨\82æ\82Ñ\83t\83@\83C\83\8b\82Æ\83f\83B\83\8c\83N\83g\83\8a\96¼\82ð\95Ï\8dX\82µ\82Ü\82·\81B\n\n\
+1 \82Â\82Ü\82½\82Í\95¡\90\94\82Ì\83t\83@\83C\83\8b\82ð\88Ú\93®\82·\82é\82É\82Í:\n\
+MOVE [/N][\83h\83\89\83C\83u:][\83p\83X]\83t\83@\83C\83\8b\96¼1[,...] \88Ú\93®\90æ\n\n\
+\83f\83B\83\8c\83N\83g\83\8a\96¼\82ð\95Ï\8dX\82·\82é\82É\82Í:\n\
+MOVE [/N][\83h\83\89\83C\83u:][\83p\83X]\95Ï\8dX\91O \95Ï\8dX\8cã\n\n\
+ [\83h\83\89\83C\83u:][\83p\83X]\83t\83@\83C\83\8b\96¼1\n\
+ \88Ú\93®\82·\82é\83t\83@\83C\83\8b\82Ì\8fê\8f\8a\82Æ\96¼\91O\82ð\8ew\92è\82µ\82Ü\82·\81B\n\
+ /N Nothing. \83t\83@\83C\83\8b\82Æ\83f\83B\83\8c\83N\83g\83\8a\82Ì\88Ú\93®\88È\8aO\82Ì\82·\82×\82Ä\82ð\8ds\82¢\82Ü\82·\81B\n\n\
+\8c»\92i\8aK\82Å\82Ì\90§\8cÀ:\n\
+ - \83t\83@\83C\83\8b\82â\83f\83B\83\8c\83N\83g\83\8a\82ð\81A\88Ù\82È\82é\83h\83\89\83C\83u\82ð\82Ü\82½\82ª\82Á\82Ä\88Ú\93®\82·\82é\82±\82Æ\82Í\n\
+ \82Å\82«\82Ü\82¹\82ñ\81B\n"
+
+STRING_MSGBOX_HELP, "\83\81\83b\83Z\81[\83W \83{\83b\83N\83X\82ð\95\\\8e¦\82µ\81A\83\86\81[\83U\81[\82É\95Ô\93\9a\82ð\8b\81\82ß\82Ü\82·\81B\n\n\
+MSGBOX \83^\83C\83v ['\83^\83C\83g\83\8b'] \83\81\83b\83Z\81[\83W\n\n\
+\83^\83C\83v \95\\\8e¦\82³\82ê\82é\83{\83^\83\93\82Ì\83^\83C\83v\82Å\82·\81B\n\
+ \8e\9f\82Ì\92l\82ª\8eg\97p\82Å\82«\82Ü\82·: OK, OKCANCEL,\n\
+ YESNO, YESNOCANCEL\n\
+\83^\83C\83g\83\8b \83\81\83b\83Z\81[\83W \83{\83b\83N\83X\82Ì\83^\83C\83g\83\8b\82Å\82·\81B\n\
+\83\81\83b\83Z\81[\83W \83\81\83b\83Z\81[\83W \83{\83b\83N\83X\82É\95\\\8e¦\82³\82ê\82é\83\81\83b\83Z\81[\83W\82Å\82·\81B\n\n\n\
+\89\9f\82³\82ê\82½\83{\83^\83\93\82É\82æ\82è\81A\8e\9f\82Ì ERRORLEVEL \82ª\90Ý\92è\82³\82ê\82Ü\82·:\n\n\
+YES : 10 | NO : 11\n\
+OK : 10 | CANCEL : 12\n"
+
+STRING_PATH_HELP1, "\8eÀ\8ds\89Â\94\\\83t\83@\83C\83\8b\82Ì\8c\9f\8dõ\83p\83X\82ð\95\\\8e¦\82Ü\82½\82Í\90Ý\92è\82µ\82Ü\82·\81B\n\n\
+PATH [[\83h\83\89\83C\83u:]\83p\83X[;...]]\nPATH ;\n\n\
+\83p\83\89\83\81\81[\83^\82Æ\82µ\82Ä ; (\83Z\83~\83R\83\8d\83\93) \82¾\82¯\82ð\8ew\92è\82·\82é\82Æ\81A\82·\82×\82Ä\82Ì\8c\9f\8dõ\83p\83X\82Í\n\
+\83N\83\8a\83A\82³\82ê\82Ä\8c»\8dÝ\82Ì\83f\83B\83\8c\83N\83g\83\8a\82¾\82¯\82ª\8c\9f\8dõ\82³\82ê\82Ü\82·\81B\n\
+\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82¹\82¸\82É PATH \82Æ\93ü\97Í\82·\82é\82Æ\81A\8c»\8dÝ\82Ì\83p\83X\82ª\95\\\8e¦\82³\82ê\82Ü\82·\81B\n"
+
+STRING_PROMPT_HELP1, "\83R\83}\83\93\83h \83v\83\8d\83\93\83v\83g\82ð\95Ï\8dX\82µ\82Ü\82·\81B\n\n\
+PROMPT [\95¶\8e\9a\97ñ]\n\n\
+ \95¶\8e\9a\97ñ \90V\82µ\82¢\83R\83}\83\93\83h \83v\83\8d\83\93\83v\83g\82ð\8ew\92è\82µ\82Ü\82·\81B\n\n\
+PROMPT \82É\82Í\92Ê\8fí\82Ì\95¶\8e\9a\82Æ\8e\9f\82É\8e¦\82·\93Á\8eê\83R\81[\83h\82ð\8eg\97p\82Å\82«\82Ü\82·:\n\n\
+ $A & (\83A\83\93\83p\83T\83\93\83h)\n\
+ $B | (\83p\83C\83v)\n\
+ $C ( (\8d¶\82©\82Á\82±)\n\
+ $D \8c»\8dÝ\82Ì\93ú\95t\n\
+ $E \83G\83X\83P\81[\83v \83R\81[\83h (ASCII \83R\81[\83h\82Ì 27)\n\
+ $F ) (\89E\82©\82Á\82±)\n\
+ $G > (\95s\93\99\8d\86 (\91å\82È\82è))\n\
+ $H \83o\83b\83N\83X\83y\81[\83X (\92¼\91O\82Ì\95¶\8e\9a\82ð\8dí\8f\9c\82µ\82Ü\82·)\n\
+ $L < (\95s\93\99\8d\86 (\8f¬\82È\82è))\n\
+ $N \8c»\8dÝ\82Ì\83h\83\89\83C\83u\n\
+ $P \8c»\8dÝ\82Ì\83h\83\89\83C\83u\82Æ\83p\83X\n\
+ $Q = (\93\99\8d\86)\n\
+ $T \8c»\8dÝ\82Ì\8e\9e\8d\8f\n\
+ $V OS \82Ì\83o\81[\83W\83\87\83\93\94Ô\8d\86\n\
+ $_ \83L\83\83\83\8a\83b\83W \83\8a\83^\81[\83\93\82Æ\83\89\83C\83\93\83t\83B\81[\83h\n\
+ $$ $ (\83h\83\8b\8bL\8d\86)\n"
+
+STRING_PAUSE_HELP1, "\83o\83b\83` \83v\83\8d\83O\83\89\83\80\82Ì\8f\88\97\9d\82ð\88ê\8e\9e\92â\8e~\82µ\81A\8e\9f\82Ì\83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82Ü\82·\81B:\n\
+'\91±\8ds\82·\82é\82É\82Í\89½\82©\83L\81[\82ð\89\9f\82µ\82Ä\82\82¾\82³\82¢ ...' \82Ü\82½\82Í\83\86\81[\83U\81[\82ª\92è\8b`\82µ\82½\83\81\83b\83Z\81[\83W\81B\n\n\
+PAUSE [\83\81\83b\83Z\81[\83W]"
+
+STRING_PROMPT_HELP2, " $+ \8c»\8dÝ\82Ì\83f\83B\83\8c\83N\83g\83\8a \83X\83^\83b\83N\82Ì\90[\82³\82ð\95\\\8e¦\82µ\82Ü\82·"
+
+STRING_PROMPT_HELP3, "\n\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82¹\82¸\82É PROMPT \82Æ\93ü\97Í\82·\82é\82Æ\81A\83v\83\8d\83\93\83v\83g\82Ì\90Ý\92è\82ª\83f\83t\83H\83\8b\83g\82É\83\8a\83Z\83b\83g\82³\82ê\82Ü\82·\81B"
+
+STRING_REM_HELP, "\83o\83b\83` \83t\83@\83C\83\8b\82É\83R\83\81\83\93\83g (\92\8d\8eß) \82ð\8bL\98^\82µ\82Ü\82·\81B\n\nREM [\83R\83\81\83\93\83g]"
+
+STRING_RMDIR_HELP, "\83f\83B\83\8c\83N\83g\83\8a\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\n\n\
+RMDIR [\83h\83\89\83C\83u:]\83p\83X\nRD [\83h\83\89\83C\83u:]\83p\83X\n\
+ /S \8ew\92è\82³\82ê\82½\83f\83B\83\8c\83N\83g\83\8a\93à\82É\82 \82é\83t\83@\83C\83\8b\82â\83t\83H\83\8b\83_\82à\82·\82×\82Ä\8dí\8f\9c\82µ\82Ü\82·\81B\n\
+ /Q \8am\94F\82Ì\83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82Ü\82¹\82ñ\81B\n"
+STRING_RMDIR_HELP2, "\83f\83B\83\8c\83N\83g\83\8a\82ª\8bó\82Å\82Í\82 \82è\82Ü\82¹\82ñ!\n"
+
+STRING_REN_HELP1, "\83t\83@\83C\83\8b\82â\83f\83B\83\8c\83N\83g\83\8a (\95¡\90\94\89Â) \82Ì\96¼\91O\82ð\95Ï\8dX\82µ\82Ü\82·\81B\n\n\
+RENAME [/E /N /P /Q /S /T] \8c³\82Ì\83t\83@\83C\83\8b\96¼ ... \90V\83t\83@\83C\83\8b\96¼\n\
+REN [/E /N /P /Q /S /T] \8c³\82Ì\83t\83@\83C\83\8b\96¼ ... \90V\83t\83@\83C\83\8b\96¼\n\n\
+ /E \83G\83\89\81[\83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82Ü\82¹\82ñ\81B\n\
+ /N \89½\82à\82µ\82Ü\82¹\82ñ\81B\n\
+ /P \83t\83@\83C\83\8b\82Ì\96¼\91O\82ð\95Ï\8dX\82·\82é\91O\82É\82»\82ê\82¼\82ê\8am\94F\82ð\8b\81\82ß\82Ü\82·\81B\n\
+ (\82Ü\82¾\8eÀ\91\95\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ!)\n\
+ /Q Quiet.\n\
+ /S \83T\83u\83f\83B\83\8c\83N\83g\83\8a\82Ì\96¼\91O\82ð\95Ï\8dX\82·\82é\81B\n\
+ /T \96¼\91O\82ð\95Ï\8dX\82µ\82½\83t\83@\83C\83\8b\82Ì\91\8d\90\94\82ð\95ñ\8d\90\82·\82é\81B\n\n\
+\90V\83t\83@\83C\83\8b\96¼ \82É\82Í\90V\82µ\82¢\83h\83\89\83C\83u\82à\83p\83X\82à\8ew\92è\82Å\82«\82È\82¢\82Ì\82Å\92\8d\88Ó\82µ\82Ä\82\82¾\82³\82¢\81B\n\
+\82»\82¤\82¢\82Á\82½\96Ú\93I\82É\82Í MOVE \83R\83}\83\93\83h\82ð\97p\82¢\82Ä\82\82¾\82³\82¢\81B\n"
+
+STRING_REN_HELP2, " %lu \8cÂ\82Ì\83t\83@\83C\83\8b\82Ì\96¼\91O\82ª\95Ï\8dX\82³\82ê\82Ü\82µ\82½\n"
+
+STRING_REN_HELP3, " %lu \8cÂ\82Ì\83t\83@\83C\83\8b\82Ì\96¼\91O\82ª\95Ï\8dX\82³\82ê\82Ü\82µ\82½\n"
+
+STRING_SHIFT_HELP, "\83o\83b\83` \83t\83@\83C\83\8b\92\86\82Ì\92u\82«\8a·\82¦\89Â\94\\\82È\83p\83\89\83\81\81[\83^\82Ì\88Ê\92u\82ð\95Ï\8dX\82µ\82Ü\82·\81B\n\n\
+SHIFT [DOWN]"
+
+STRING_SCREEN_HELP, "\83J\81[\83\\\83\8b\82ð\88Ú\93®\82³\82¹\82Ü\82·\81B\88Ú\93®\8cã\81A\95¶\8e\9a\97ñ\82ð\93ü\97Í\82·\82é\82±\82Æ\82à\82Å\82«\82Ü\82·\81B\n\n\
+SCREEN \97ñ \8ds [\83e\83L\83X\83g]\n\n\
+ \97ñ \83J\81[\83\\\83\8b\82ð\88Ú\93®\82³\82¹\82é\97ñ\82Å\82·\81B\n\
+ \8ds \83J\81[\83\\\83\8b\82ð\88Ú\93®\82³\82¹\82é\8ds\82Å\82·\81B"
+
+STRING_SET_HELP, "\8aÂ\8b«\95Ï\90\94\82ð\95\\\8e¦\81A\90Ý\92è\81A\82Ü\82½\82Í\8dí\8f\9c\82µ\82Ü\82·\81B\n\n\
+SET [\95Ï\90\94\96¼[=]\95¶\8e\9a\97ñ]]\n\n\
+ \95Ï\90\94\96¼ \8aÂ\8b«\95Ï\90\94\96¼\82ð\8ew\92è\82µ\82Ü\82·\81B\n\
+ \95¶\8e\9a\97ñ \95Ï\90\94\82É\8a\84\82è\93\96\82Ä\82é\95¶\8e\9a\97ñ\82ð\8ew\92è\82µ\82Ü\82·\81B\n\n\
+\8c»\8dÝ\82Ì\8aÂ\8b«\95Ï\90\94\82ð\95\\\8e¦\82·\82é\82É\82Í\81A\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82¹\82¸\82É SET \82Æ\93ü\97Í\82µ\82Ä\82\82¾\82³\82¢\81B\n"
+
+STRING_START_HELP1, "\95Ê\82Ì\83E\83B\83\93\83h\83E\82ð\8bN\93®\82µ\81A\8ew\92è\82µ\82½\83v\83\8d\83O\83\89\83\80\82Ü\82½\82Í\83R\83}\83\93\83h\82ð\8eÀ\8ds\82µ\82Ü\82·\81B\n\n\
+START \83R\83}\83\93\83h\n\n\
+ \83R\83}\83\93\83h \8eÀ\8ds\82·\82é\83R\83}\83\93\83h\82ð\8ew\92è\82µ\82Ü\82·\81B\n\n\
+\8c»\8e\9e\93_\82Å\82Í\81A\83R\83}\83\93\83h\82Í\82·\82×\82Ä\93¯\8aú\82¹\82¸\82É\8aJ\8en\82³\82ê\82Ü\82·\81B\n"
+
+STRING_TITLE_HELP, "\83R\83}\83\93\83h \83v\83\8d\83\93\83v\83g \83E\83B\83\93\83h\83E\82Ì\83E\83B\83\93\83h\83E \83^\83C\83g\83\8b\82ð\90Ý\92è\82µ\82Ü\82·\81B\n\n\
+TITLE [\95¶\8e\9a\97ñ]\n\n\
+\95¶\8e\9a\97ñ \83R\83}\83\93\83h \83v\83\8d\83\93\83v\83g \83E\83B\83\93\83h\83E\82Ì\83^\83C\83g\83\8b\82ð\8ew\92è\82µ\82Ü\82·\81B\n"
+
+STRING_TIME_HELP1, "\83V\83X\83e\83\80\8e\9e\8d\8f\82ð\95\\\8e¦\82Ü\82½\82Í\90Ý\92è\82µ\82Ü\82·\81B\n\n\
+TIME [/T][\8e\9e\8d\8f]\n\n\
+ /T \8c»\8dÝ\8e\9e\8d\8f\82Ì\95\\\8e¦\82Ì\82Ý\8ds\82¢\82Ü\82·\81B\n\n\
+\83p\83\89\83\81\81[\83^\82Ì\8ew\92è\82ª\82È\82¯\82ê\82Î\81A\8c»\8dÝ\82Ì\90Ý\92è\82ª\95\\\8e¦\82³\82ê\81A\90V\82µ\82¢\8e\9e\8d\8f\82ð\93ü\97Í\82Å\82«\82é\n\
+\83v\83\8d\83\93\83v\83g\82É\82È\82è\82Ü\82·\81B\95Ï\8dX\82µ\82È\82¢\8fê\8d\87\82Í\81AEnter \83L\81[\82ð\89\9f\82µ\82Ä\82\82¾\82³\82¢\81B\n"
+
+STRING_TIME_HELP2, "\90V\82µ\82¢\8e\9e\8d\8f\82ð\93ü\97Í\82µ\82Ä\82\82¾\82³\82¢: "
+
+STRING_TIMER_HELP1, "%d \83~\83\8a\95b\82ª\8co\89ß\81B\n"
+
+STRING_TIMER_HELP2, "%02d%c%02d%c%02d%c%02d \82ª\8co\89ß\81B\n"
+
+STRING_TIMER_HELP3, "10 \8cÂ\82Ü\82Å\82Ì\83X\83g\83b\83v\83E\83H\83b\83`\82ð\8eg\82¤\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B\n\n\
+TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
+ ON \83X\83g\83b\83v\83E\83H\83b\83`\82ð ON \82É\82µ\82Ü\82·\81B\n\
+ OFF \83X\83g\83b\83v\83E\83H\83b\83`\82ð OFF \82É\82µ\82Ü\82·\81B\n\
+ /S Split time. \83X\83g\83b\83v\83E\83H\83b\83`\82Ì\92l\82ð\95Ï\8dX\82·\82é\82±\82Æ\82È\82\81A\n\
+ \8c»\8dÝ\8d\8f\82ñ\82Å\82¢\82é\8e\9e\8aÔ\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ /n \83X\83g\83b\83v\83E\83H\83b\83`\94Ô\8d\86\82ð\8ew\92è\82µ\82Ü\82·\81B\n\
+ \83X\83g\83b\83v\83E\83H\83b\83`\82Í 0 \82©\82ç 9 \82Ü\82Å\82ª\97\98\97p\82Å\82«\82Ü\82·\81B\n\
+ \8ew\92è\82µ\82È\82¢\8fê\8d\87\81A\83f\83t\83H\83\8b\83g\82Æ\82µ\82Ä 1 \82ð\8eg\82¢\82Ü\82·\81B\n\
+ /Fn \8fo\97Í\82Ì\8f\91\8e®\n\
+ n \82É\82Í\8e\9f\82Ì\93ñ\82Â\82Ì\92l\82ð\97p\82¢\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·:\n\
+ 0 \83~\83\8a\95b\n\
+ 1 hh%cmm%css%cdd\n\n\
+ON\81AOFF\81A/S \82Ì\82¢\82¸\82ê\82à\8ew\92è\82µ\82È\82©\82Á\82½\8fê\8d\87\82É\82Í\81A\83X\83g\83b\83v\83E\83H\83b\83`\82Ì\n\
+\8fó\91Ô\82ð\90Ø\82è\91Ö\82¦\82Ü\82·\81B\n\n"
+
+STRING_TYPE_HELP1, "\83e\83L\83X\83g \83t\83@\83C\83\8b\82Ü\82½\82Í\83t\83@\83C\83\8b\82Ì\93à\97e\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\nTYPE [\83h\83\89\83C\83u:][\83p\83X]\83t\83@\83C\83\8b\96¼ \n\
+ /P 1 \93x\82É 1 \89æ\96Ê\82¸\82Â\95\\\8e¦\82µ\82Ü\82·\81B\n"
+
+STRING_VERIFY_HELP1, "\82±\82Ì\83R\83}\83\93\83h\82Í\83_\83~\81[\82Å\82·!!\n\
+\83t\83@\83C\83\8b\82ª\83f\83B\83X\83N\82É\90³\82µ\82\8f\91\82«\8d\9e\82Ü\82ê\82½\82±\82Æ\82ð\8fÆ\8d\87\82·\82é\82©\82Ç\82¤\82©\82ð\8ew\8e¦\82µ\82Ü\82·\81B\n\n\
+VERIFY [ON | OFF]\n\n\
+\8c»\8dÝ\82Ì\90Ý\92è\82ð\95\\\8e¦\82·\82é\82Æ\82«\82Í\81A\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82¹\82¸\82É VERIFY \82Æ\93ü\97Í\82µ\82Ä\82\82¾\82³\82¢\81B\n"
+
+STRING_VERIFY_HELP2, "VERIFY \82Í %s \82Å\82·\81B\n"
+
+STRING_VERIFY_HELP3, "ON \82© OFF \82Ì\82Ç\82¿\82ç\82©\82ð\8ew\92è\82µ\82Ä\82\82¾\82³\82¢\81B"
+
+STRING_VERSION_HELP1, "\83V\83F\83\8b\82Ì\83o\81[\83W\83\87\83\93\8fî\95ñ\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\n\
+VER [/C][/R][/W]\n\n\
+ /C \83N\83\8c\83W\83b\83g\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ /R \8dÄ\94z\95z\82É\8aÖ\82·\82é\8fî\95ñ\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ /W \95Û\8fØ\82É\8aÖ\82·\82é\8fî\95ñ\82ð\95\\\8e¦\82µ\82Ü\82·\81B"
+
+STRING_VERSION_HELP2, " \82Í *\91S\82\82Ì\96³\95Û\8fØ* \82Å\92ñ\8b\9f\82³\82ê\82Ü\82·\81B\8fÚ\82µ\82\82Í\n\
+'ver /w' \82Æ\83^\83C\83v\82µ\82Ä\89º\82³\82¢\81B\82±\82ê\82Í\83t\83\8a\81[\83\\\83t\83g\83E\83F\83A\82Å\82 \82è\81A\82 \82é\8fð\8c\8f\82Ì\89º\82Å\n\
+\8dÄ\94Ð\95z\82·\82é\82±\82Æ\82ª\8f§\97ã\82³\82ê\82Ä\82¢\82Ü\82·\81B\8fÚ\82µ\82\82Í 'ver /r' \82Æ\83^\83C\83v\82µ\82Ä\89º\82³\82¢\81B\n\
+\83N\83\8c\83W\83b\83g\82Ì\88ê\97\97\82ð\8c©\82é\82É\82Í 'ver /c' \82Æ\83^\83C\83v\82µ\82Ä\89º\82³\82¢\81B"
+
+STRING_VERSION_HELP3, "\n \82±\82Ì\83v\83\8d\83O\83\89\83\80\82Í\97L\97p\82Å\82 \82é\82±\82Æ\82ð\8aè\82Á\82Ä\94Ð\95z\82³\82ê\82Ü\82·\82ª\81A*\91S\82\82Ì\96³\95Û\8fØ*\n\
+ \82Å\82·\81B\8f¤\8bÆ\89Â\94\\\90«\82Ì\95Û\8fØ\82â\93Á\92è\82Ì\96Ú\93I\82Ö\82Ì\93K\8d\87\90«\82Í\81A\8c¾\8aO\82É\8e¦\82³\82ê\82½\82à\82Ì\82à\8aÜ\n\
+ \82ß\91S\82\91¶\8dÝ\82µ\82Ü\82¹\82ñ\81B\8fÚ\82µ\82\82Í GNU General Public License \82ð\82²\97\97\82\82¾\82³\82¢\81B"
+
+STRING_VERSION_HELP4, "\n \82±\82Ì\83v\83\8d\83O\83\89\83\80\82Í\83t\83\8a\81[\83\\\83t\83g\83E\83F\83A\82Å\82·\81B\82 \82È\82½\82Í\82±\82ê\82ð\81A\83t\83\8a\81[\83\\\83t\83g\83E\83F\n\
+ \83A\8dà\92c\82É\82æ\82Á\82Ä\94\8ds\82³\82ê\82½ GNU General Public License (\83o\81[\83W\83\87\83\93 2 \82©\81A\n\
+ \8aó\96]\82É\82æ\82Á\82Ä\82Í\82»\82ê\88È\8d~\82Ì\83o\81[\83W\83\87\83\93\82Ì\82¤\82¿\82Ç\82ê\82©) \82Ì\92è\82ß\82é\8fð\8c\8f\82Ì\89º\82Å\8dÄ\94Ð\n\
+ \95z\82Ü\82½\82Í\89ü\95Ï\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B\n"
+
+STRING_VERSION_HELP5, "\n\83o\83O\95ñ\8d\90\82Í <ros-dev@reactos.org> \82Ö\91\97\82Á\82Ä\82\82¾\82³\82¢\81B\n\
+\8dÅ\90V\82Ì\83o\81[\83W\83\87\83\93\82Í\8e\9f\82Ì\83y\81[\83W\82©\82ç\93ü\8eè\82Å\82«\82Ü\82·: http://www.reactos.org"
+
+STRING_VERSION_HELP6, "\nFreeDOS version written by:\n"
+
+STRING_VERSION_HELP7, "\nReactOS version written by:\n"
+
+STRING_VOL_HELP1, " \83h\83\89\83C\83u %c: \82Ì\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82Í %s \82Å\82·\81B\n"
+STRING_VOL_HELP2, " \83h\83\89\83C\83u %c: \82É\82Í\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82ª\82 \82è\82Ü\82¹\82ñ\81B\n"
+STRING_VOL_HELP3, " \83{\83\8a\83\85\81[\83\80 \83V\83\8a\83A\83\8b\94Ô\8d\86\82Í %04X-%04X \82Å\82·\81B\n"
+STRING_VOL_HELP4, "\91¶\8dÝ\82·\82é\82È\82ç\82Î\81A\83f\83B\83X\83N\82Ì\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82Æ\83V\83\8a\83A\83\8b\94Ô\8d\86\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\nVOL [\83h\83\89\83C\83u:]"
+
+STRING_WINDOW_HELP1, "\83R\83\93\83\\\81[\83\8b \83E\83B\83\93\83h\83E\82Ì\8aO\8c©\82ð\95Ï\8dX\82µ\82Ü\82·\81B\n\n\
+WINDOW [/POS[=]\8d¶,\8fã,\95\9d,\8d\82\82³]\n\
+ [MIN|MAX|RESTORE] ['title']\n\n\
+/POS \83E\83B\83\93\83h\83E\82Ì\88Ê\92u\82Æ\91å\82«\82³\82ð\8ew\92è\82µ\82Ü\82·\81B\n\
+MIN \83E\83B\83\93\83h\83E\82ð\8dÅ\8f¬\89»\82µ\82Ü\82·\81B\n\
+MAX \83E\83B\83\93\83h\83E\82ð\8dÅ\91å\89»\82µ\82Ü\82·\81B\n\
+RESTORE \83E\83B\83\93\83h\83E\82ð\8c³\82Ì\83T\83C\83Y\82É\96ß\82µ\82Ü\82·\81B"
+
+STRING_WINDOW_HELP2, "\83R\83\93\83\\\81[\83\8b \83E\83B\83\93\83h\83E\82Ì\8aO\8c©\82ð\95Ï\8dX\82µ\82Ü\82·\81B\n\n\
+ACTIVATE '\83E\83B\83\93\83h\83E' [/POS[=]\8d¶,\8fã,\95\9d,\8d\82\82³]\n\
+ [MIN|MAX|RESTORE] ['\83^\83C\83g\83\8b']\n\n\
+\83E\83B\83\93\83h\83E \8aO\8c©\82ð\95Ï\8dX\82·\82é\83E\83B\83\93\83h\83E\82Ì\83^\83C\83g\83\8b\82Å\82·\81B\n\
+/POS \83E\83B\83\93\83h\83E\82Ì\88Ê\92u\82Æ\91å\82«\82³\82ð\8ew\92è\82µ\82Ü\82·\81B\n\
+MIN \83E\83B\83\93\83h\83E\82ð\8dÅ\8f¬\89»\82µ\82Ü\82·\81B\n\
+MAX \83E\83B\83\93\83h\83E\82ð\8dÅ\91å\89»\82µ\82Ü\82·\81B\n\
+RESTORE \83E\83B\83\93\83h\83E\82ð\8c³\82Ì\83T\83C\83Y\82É\96ß\82µ\82Ü\82·\81B\n\
+\83^\83C\83g\83\8b \90V\82µ\82¢\83^\83C\83g\83\8b\82Å\82·\81B\n"
+
+
+STRING_HELP1, "\97\98\97p\89Â\94\\\82È\82·\82×\82Ä\82Ì\83R\83}\83\93\83h\82Ì\88ê\97\97\82Æ\81A\82»\82Ì\90à\96¾\81B\n\n\
+ \83R\83}\83\93\83h /? \93Á\92è\82Ì\83R\83}\83\93\83h\82É\8aÖ\82·\82é\8fÚ\8d×\8fî\95ñ\n\n\
+? \97\98\97p\89Â\94\\\82È\82·\82×\82Ä\82Ì\83R\83}\83\93\83h\82Ì\88ê\97\97 (\90à\96¾\82È\82µ)\81B\n\
+ALIAS \83G\83C\83\8a\83A\83X\82Ì\90Ý\92è\82â\89ð\8f\9c\82ð\82µ\82½\82è\81A\83G\83C\83\8a\83A\83X\82ð\95\\\8e¦\82µ\82½\82è\82µ\82Ü\82·\81B\n\
+ATTRIB \83t\83@\83C\83\8b\91®\90«\82ð\95\\\8e¦\82Ü\82½\82Í\95Ï\8dX\82µ\82Ü\82·\81B\n\
+BEEP \83X\83s\81[\83J\82©\82ç\83r\81[\83v\89¹\82ð\96Â\82ç\82µ\82Ü\82·\81B\n\
+CALL \83o\83b\83` \83v\83\8d\83O\83\89\83\80\82ð\95Ê\82Ì\83o\83b\83` \83v\83\8d\83O\83\89\83\80\82©\82ç\8cÄ\82Ñ\8fo\82µ\82Ü\82·\81B\n\
+CD \8c»\8dÝ\82Ì\83f\83B\83\8c\83N\83g\83\8a\82ð\95Ï\8dX\82µ\82½\82è\81A\83f\83B\83\8c\83N\83g\83\8a\96¼\82ð\95\\\8e¦\82µ\82½\82è\82µ\82Ü\82·\81B\n\
+CHCP \8c»\8dÝ\82Ì\83R\81[\83h \83y\81[\83W\94Ô\8d\86\82ð\95\\\8e¦\82Ü\82½\82Í\90Ý\92è\82µ\82Ü\82·\81B\n\
+CHOICE \83\86\81[\83U\81[\82ª\91I\91ð\8e\88\82©\82ç\88ê\82Â\82ð\91I\91ð\82·\82é\82Ì\82ð\91Ò\82¿\82Ü\82·\81B\n\
+CLS \89æ\96Ê\82ð\8fÁ\8b\8e\82µ\82Ü\82·\81B\n\
+CMD ReactOS \83R\83}\83\93\83h \83C\83\93\83^\81[\83v\83\8a\83^\82Ì\90V\82µ\82¢\83C\83\93\83X\83^\83\93\83X\82ð\8aJ\8en\82µ\82Ü\82·\81B\n\
+COLOR \83R\83\93\83\\\81[\83\8b\82Ì\83f\83t\83H\83\8b\83g\82Ì\91O\8ci\90F\82¨\82æ\82Ñ\94w\8ci\90F\82ð\90Ý\92è\82µ\82Ü\82·\81B\n\
+COPY 1 \82Â\82Ü\82½\82Í\95¡\90\94\82Ì\83t\83@\83C\83\8b\82ð\95Ê\82Ì\8fê\8f\8a\82É\83R\83s\81[\82µ\82Ü\82·\81B\n\
+DATE \93ú\95t\82ð\95\\\8e¦\82Ü\82½\82Í\90Ý\92è\82µ\82Ü\82·\81B\n\
+DELAY n \95b\81A\82Ü\82½\82Í n \83~\83\8a\95b\91Ò\8b@\82µ\82Ü\82·\81B\n\
+DELETE 1 \82Â\82Ü\82½\82Í\95¡\90\94\82Ì\83t\83@\83C\83\8b\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\n\
+DIR \83f\83B\83\8c\83N\83g\83\8a\92\86\82Ì\83t\83@\83C\83\8b\82Æ\83T\83u\83f\83B\83\8c\83N\83g\83\8a\82ð\88ê\97\97\95\\\8e¦\82µ\82Ü\82·\81B\n\
+ECHO \83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82½\82è\81A\83R\83}\83\93\83h \83G\83R\81[\82Ì ON \82Æ OFF \82ð\90Ø\82è\91Ö\82¦\82Ü\82·\81B\n\
+ERASE 1 \82Â\82Ü\82½\82Í\95¡\90\94\82Ì\83t\83@\83C\83\8b\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\n\
+EXIT CMD.exe (\83R\83}\83\93\83h \83\89\83C\83\93 \83C\83\93\83^\81[\83v\83\8a\83^) \82ð\8fI\97¹\82µ\82Ü\82·\81B\n\
+FOR \8ew\92è\82³\82ê\82½\83R\83}\83\93\83h\82ð\83t\83@\83C\83\8b \83Z\83b\83g\82Ì\8ae\83t\83@\83C\83\8b\82É\91Î\82µ\82Ä\8eÀ\8ds\82µ\82Ü\82·\81B\n\
+FREE \83f\83B\83X\83N\82Ì\8bó\82«\97e\97Ê\n\
+GOTO \83o\83b\83` \83v\83\8d\83O\83\89\83\80\93à\82Ì\81A\83\89\83x\83\8b\82Å\8ew\92è\82³\82ê\82Ä\82¢\82é\8ds\82Ö\90§\8cä\82ð\88Ú\93®\82µ\82Ü\82·\81B\n\
+HELP ReactOS \83R\83}\83\93\83h\82Ì\83w\83\8b\83v\8fî\95ñ\82ð\92ñ\8b\9f\82µ\82Ü\82·\81B\n\
+HISTORY \8eg\97p\82³\82ê\82½\82·\82×\82Ä\82Ì\83R\83}\83\93\83h\82ð\88ê\97\97\95\\\8e¦\82µ\82Ü\82·\81B\n\
+IF \83o\83b\83` \83v\83\8d\83O\83\89\83\80\92\86\82Å\8fð\8c\8f\8f\88\97\9d\82ð\8eÀ\8ds\82µ\82Ü\82·\81B\n\
+LABEL \83f\83B\83X\83N\82Ì\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82ð\95\\\8e¦\82Ü\82½\82Í\95Ï\8dX\82µ\82Ü\82·\81B\n\
+MD \83f\83B\83\8c\83N\83g\83\8a\82ð\8dì\90¬\82µ\82Ü\82·\81B\n\
+MKDIR \83f\83B\83\8c\83N\83g\83\8a\82ð\8dì\90¬\82µ\82Ü\82·\81B\n\
+MOVE \83t\83@\83C\83\8b\82ð\88Ú\93®\82¨\82æ\82Ñ\83t\83@\83C\83\8b\82Æ\83f\83B\83\8c\83N\83g\83\8a\96¼\82ð\95Ï\8dX\82µ\82Ü\82·\81B\n\
+PATH \8eÀ\8ds\89Â\94\\\83t\83@\83C\83\8b\82Ì\8c\9f\8dõ\83p\83X\82ð\95\\\8e¦\82Ü\82½\82Í\90Ý\92è\82µ\82Ü\82·\81B\n\
+PAUSE \83o\83b\83` \83v\83\8d\83O\83\89\83\80\82Ì\8f\88\97\9d\82ð\88ê\8e\9e\92â\8e~\82µ\81A\83\81\83b\83Z\81[\83W\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+POPD \8c»\8dÝ\82Ì\83f\83B\83\8c\83N\83g\83\8a\82ð PUSHD \83R\83}\83\93\83h\82Å\8bL\89¯\82³\82ê\82½\83f\83B\83\8c\83N\83g\83\8a\82É\n\
+ \95Ï\8dX\82µ\82Ü\82·\81B\n\
+PROMPT \83R\83}\83\93\83h \83v\83\8d\83\93\83v\83g\82ð\95Ï\8dX\82µ\82Ü\82·\81B\n\
+PUSHD \8c»\8dÝ\82Ì\83f\83B\83\8c\83N\83g\83\8a\82ð\95Û\91¶\82µ\81A\8ew\92è\82µ\82½\83f\83B\83\8c\83N\83g\83\8a\82É\95Ï\8dX\82µ\82Ü\82·\81B\n\
+RD \83f\83B\83\8c\83N\83g\83\8a\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\n\
+REM \83o\83b\83` \83t\83@\83C\83\8b\82É\83R\83\81\83\93\83g (\92\8d\8eß) \82ð\8bL\98^\82µ\82Ü\82·\81B\n\
+REN 1 \82Â\82Ü\82½\82Í\95¡\90\94\82Ì\83t\83@\83C\83\8b\82Ì\96¼\91O\82ð\95Ï\8dX\82µ\82Ü\82·\81B\n\
+RENAME 1 \82Â\82Ü\82½\82Í\95¡\90\94\82Ì\83t\83@\83C\83\8b\82Ì\96¼\91O\82ð\95Ï\8dX\82µ\82Ü\82·\81B\n\
+RMDIR \83f\83B\83\8c\83N\83g\83\8a\82ð\8dí\8f\9c\82µ\82Ü\82·\81B\n\
+SCREEN \83J\81[\83\\\83\8b\82ð\88Ú\93®\82³\82¹\82Ü\82·\81B\88Ú\93®\8cã\81A\95¶\8e\9a\97ñ\82ð\93ü\97Í\82·\82é\82±\82Æ\82à\82Å\82«\82Ü\82·\81B\n\
+SET \8aÂ\8b«\95Ï\90\94\82ð\95\\\8e¦\81A\90Ý\92è\81A\82Ü\82½\82Í\8dí\8f\9c\82µ\82Ü\82·\81B\n\
+SHIFT \83J\81[\83\\\83\8b\82ð\88Ú\93®\82³\82¹\82Ü\82·\81B\88Ú\93®\8cã\81A\95¶\8e\9a\97ñ\82ð\93ü\97Í\82·\82é\82±\82Æ\82à\82Å\82«\82Ü\82·\81B\n"
+STRING_HELP2, "START \95Ê\82Ì\83E\83B\83\93\83h\83E\82ð\8bN\93®\82µ\81A\8ew\92è\82µ\82½\83v\83\8d\83O\83\89\83\80\82Ü\82½\82Í\83R\83}\83\93\83h\82ð\8eÀ\8ds\82µ\82Ü\82·\81B\n\
+TIME \83V\83X\83e\83\80\8e\9e\8d\8f\82ð\95\\\8e¦\82Ü\82½\82Í\90Ý\92è\82µ\82Ü\82·\81B\n\
+TIMER 10 \8cÂ\82Ü\82Å\82Ì\83X\83g\83b\83v\83E\83H\83b\83`\82ð\8eg\82¤\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B\n\
+TITLE \83R\83}\83\93\83h \83v\83\8d\83\93\83v\83g \83E\83B\83\93\83h\83E\82Ì\83E\83B\83\93\83h\83E \83^\83C\83g\83\8b\82ð\90Ý\92è\82µ\82Ü\82·\81B\n\
+TYPE \83e\83L\83X\83g \83t\83@\83C\83\8b\82Ü\82½\82Í\83t\83@\83C\83\8b\82Ì\93à\97e\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+VER ReactOS \82Ì\83o\81[\83W\83\87\83\93\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n\
+VERIFY \83t\83@\83C\83\8b\82ª\83f\83B\83X\83N\82É\90³\82µ\82\8f\91\82«\8d\9e\82Ü\82ê\82½\82±\82Æ\82ð\8fÆ\8d\87\82·\82é\82©\82Ç\82¤\82©\82ð\n\
+ \8ew\8e¦\82µ\82Ü\82·\81B\n\
+VOL \83f\83B\83X\83N\82Ì\83{\83\8a\83\85\81[\83\80 \83\89\83x\83\8b\82Æ\83V\83\8a\83A\83\8b\94Ô\8d\86\82ð\95\\\8e¦\82µ\82Ü\82·\81B\n"
+
+
+STRING_CHOICE_OPTION, "YN"
+STRING_COPY_OPTION, "YNA"
+
+
+STRING_ALIAS_ERROR, "\83G\83C\83\8a\83A\83X\93W\8aJ\8cã\82Ì\83R\83}\83\93\83h \83\89\83C\83\93\82ª\92·\82·\82¬\82Ü\82·!\n"
+STRING_BATCH_ERROR, "\83o\83b\83` \83t\83@\83C\83\8b\82ð\8aJ\82\82Æ\82«\82É\83G\83\89\81[\82ª\94\90¶\82µ\82Ü\82µ\82½\81B\n"
+STRING_CHCP_ERROR1, "\8c»\8dÝ\82Ì\83R\81[\83h \83y\81[\83W: %u\n"
+STRING_CHCP_ERROR4, "\96³\8cø\82È\83R\81[\83h \83y\81[\83W\82Å\82·\n"
+STRING_CHOICE_ERROR, "\96³\8cø\82È\83I\83v\83V\83\87\83\93\82Å\82·\81B\8aú\91Ò\82³\82ê\82é\8f\91\8e®: /C[:]\83I\83v\83V\83\87\83\93"
+STRING_CHOICE_ERROR_TXT, "\96³\8cø\82È\83I\83v\83V\83\87\83\93\82Å\82·\81B\8aú\91Ò\82³\82ê\82é\8f\91\8e®: /T[:]c,nn"
+STRING_CHOICE_ERROR_OPTION, "\96³\8cø\82È\83I\83v\83V\83\87\83\93\82Å\82·: %s"
+STRING_CMD_ERROR1, "\83t\83@\83C\83\8b %s \82©\82ç\83\8a\83_\83C\83\8c\83N\83g\93ü\97Í\82Å\82«\82Ü\82¹\82ñ\81B\n"
+STRING_CMD_ERROR2, "\83f\81[\83^\82ð\83p\83C\83v\82·\82é\82½\82ß\82Ì\88ê\8e\9e\83t\83@\83C\83\8b\8dì\90¬\82Ì\82Æ\82«\82É\83G\83\89\81[\82ª\94\90¶\82µ\82Ü\82µ\82½\81B\n"
+STRING_CMD_ERROR3, "\83t\83@\83C\83\8b %s \82Ö\82Æ\83\8a\83_\83C\83\8c\83N\83g\82Å\82«\82Ü\82¹\82ñ\81B\n"
+STRING_CMD_ERROR4, "%s \82ð\8eÀ\8ds\82µ\82Ä\82¢\82Ü\82·...\n"
+STRING_CMD_ERROR5, "cmdexit.bat \82ð\8eÀ\8ds\82µ\82Ä\82¢\82Ü\82·...\n"
+STRING_COLOR_ERROR1, "\83G\83\89\81[! \93¯\82¶\90F\82ª\8ew\92è\82³\82ê\82Ü\82µ\82½\81B\n (\91O\8ci\90F\82Æ\94w\8ci\90F\82ð\93¯\82¶\90F\82É\82·\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ)"
+STRING_COLOR_ERROR2, "\90F\82Ì\8ew\92è\82É\96â\91è\82ª\82 \82è\82Ü\82·\81B"
+STRING_COLOR_ERROR3, "Color %x\n"
+STRING_COLOR_ERROR4, "\83G\83\89\81[! \93¯\82¶\90F\82ª\8ew\92è\82³\82ê\82Ü\82µ\82½\81B"
+STRING_CONSOLE_ERROR, "\95s\96¾\82È\83G\83\89\81[: %d\n"
+STRING_COPY_ERROR1, "\83G\83\89\81[: \8c³\82Ì\83t\83@\83C\83\8b %s \82ð\8aJ\82¯\82Ü\82¹\82ñ!\n"
+STRING_COPY_ERROR2, "\83G\83\89\81[: \83R\83s\81[\8c³\82Æ\83R\83s\81[\90æ\82ª\88ê\8f\8f\82Å\82·!\n"
+STRING_COPY_ERROR3, "\8ew\92è\90æ\82Ö\82Ì\8f\91\82«\8d\9e\82Ý\82Å\83G\83\89\81[\82ª\94\90¶\82µ\82Ü\82µ\82½!\n"
+STRING_COPY_ERROR4, "\83G\83\89\81[: \82Ü\82¾\8eÀ\91\95\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ!\n"
+STRING_DATE_ERROR, "\96³\8cø\82È\93ú\95t\82Å\82·\81B"
+STRING_DEL_ERROR5, "\83t\83@\83C\83\8b %s \82Í\8dí\8f\9c\82³\82ê\82Ü\82·! "
+STRING_DEL_ERROR6, "\82æ\82ë\82µ\82¢\82Å\82·\82© (Y/N)?"
+STRING_DEL_ERROR7, "\8dí\8f\9c\82µ\82Ä\82¢\82Ü\82·: %s\n"
+STRING_ERROR_ERROR1, "\95s\96¾\82È\83G\83\89\81[\82Å\82·! \83G\83\89\81[ \83R\81[\83h: 0x%lx\n"
+STRING_ERROR_ERROR2, "\8d\\\95¶\83G\83\89\81["
+STRING_FOR_ERROR1, "\96½\97ß\95¶\92\86\82É 'in' \82ª\95s\91«\82µ\82Ä\82¢\82Ü\82·\81B"
+STRING_FOR_ERROR2, "\8a\87\8cÊ\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B"
+STRING_FOR_ERROR3, "'do' \82ª\95s\91«\82µ\82Ä\82¢\82Ü\82·\81B"
+STRING_FOR_ERROR4, "'do' \82Ì\8cã\82É\83R\83}\83\93\83h\82ª\82 \82è\82Ü\82¹\82ñ\81B"
+STRING_FREE_ERROR1, "\96³\8cø\82È\83h\83\89\83C\83u\82Å\82·\81B"
+STRING_FREE_ERROR2, "\83\89\83x\83\8b\82ª\82 \82è\82Ü\82¹\82ñ\81B"
+STRING_GOTO_ERROR1, "GOTO \82É\83\89\83x\83\8b\82ª\8ew\92è\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B"
+STRING_GOTO_ERROR2, "\83\89\83x\83\8b '%s' \82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\82Å\82µ\82½\81B\n"
+
+STRING_MD_ERROR, "\82·\82Å\82É\83f\83B\83\8c\83N\83g\83\8a\93à\82É\83T\83u\83f\83B\83\8c\83N\83g\83\8a\82©\83t\83@\83C\83\8b\82ª\91¶\8dÝ\82µ\82Ä\82¢\82Ü\82·\81B\n"
+STRING_MD_ERROR2, "\90V\82µ\82¢\83t\83H\83\8b\83_\82Ö\82Ì\83p\83X\82ª\91¶\8dÝ\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B\n"
+STRING_MOVE_ERROR1, "[OK]\n"
+STRING_MOVE_ERROR2, "[\83G\83\89\81[]\n"
+
+STRING_REN_ERROR1, "MoveFile() failed. \83G\83\89\81[: %lu\n"
+
+STRING_START_ERROR1, "\8c»\8e\9e\93_\82Å\82Í\83o\83b\83`\82Í\83T\83|\81[\83g\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ!"
+
+STRING_TIME_ERROR1, "\96³\8cø\82È\8e\9e\8d\8f\82Å\82·\81B"
+
+STRING_TYPE_ERROR1, "'/%s' \82Í\96³\8cø\82È\83I\83v\83V\83\87\83\93\82Å\82·\n"
+
+STRING_WINDOW_ERROR1, "\83E\83B\83\93\83h\83E\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B"
+
+
+STRING_ERROR_PARAMETERF_ERROR, "\83p\83\89\83\81\81[\83^\82Ì\8f\91\8e®\82ª\8aÔ\88á\82Á\82Ä\82¢\82Ü\82·\81B - %c\n"
+STRING_ERROR_INVALID_SWITCH, "\96³\8cø\82È\83X\83C\83b\83`\82Å\82·\81B - /%c\n"
+STRING_ERROR_TOO_MANY_PARAMETERS, "\83p\83\89\83\81\81[\83^\82ª\91½\82·\82¬\82Ü\82·\81B - %s\n"
+STRING_ERROR_PATH_NOT_FOUND, "\83p\83X\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B\n"
+STRING_ERROR_FILE_NOT_FOUND, "\83t\83@\83C\83\8b\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ\81B\n"
+STRING_ERROR_REQ_PARAM_MISSING, "\95K\97v\82È\83p\83\89\83\81\81[\83^\82ª\95s\91«\82µ\82Ä\82¢\82Ü\82·\81B\n"
+STRING_ERROR_INVALID_DRIVE, "\96³\8cø\82È\83h\83\89\83C\83u\8ew\92è\82Å\82·\81B\n"
+STRING_ERROR_INVALID_PARAM_FORMAT, "\96³\8cø\82È\83p\83\89\83\81\81[\83^\82Ì\8f\91\8e®\82Å\82·\81B - %s\n"
+STRING_ERROR_BADCOMMAND, "\83R\83}\83\93\83h\82Ü\82½\82Í\83t\83@\83C\83\8b\96¼\82ª\8aÔ\88á\82Á\82Ä\82¢\82Ü\82·\81B\n"
+STRING_ERROR_OUT_OF_MEMORY, "\83\81\83\82\83\8a\95s\91«\83G\83\89\81[\81B\n"
+STRING_ERROR_CANNOTPIPE, "\83G\83\89\81[! \83p\83C\83v\82Å\82«\82Ü\82¹\82ñ! \88ê\8e\9e\83t\83@\83C\83\8b\82ð\8aJ\82¯\82Ü\82¹\82ñ!\n"
+STRING_ERROR_D_PAUSEMSG, "\91±\8ds\82·\82é\82É\82Í\89½\82©\83L\81[\82ð\89\9f\82µ\82Ä\82\82¾\82³\82¢ . . ."
+STRING_ERROR_DRIVER_NOT_READY, "\83h\83\89\83C\83u\82Ì\8f\80\94õ\82ª\82Å\82«\82Ä\82¢\82Ü\82¹\82ñ\81B"
+
+STRING_PATH_ERROR, "CMD: Not in environment '%s'\n"
+
+STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter"
+STRING_VERSION_RUNVER, " running on %s"
+STRING_COPY_FILE , " %d \8cÂ\82Ì\83t\83@\83C\83\8b\82ª\83R\83s\81[\82³\82ê\82Ü\82µ\82½\n"
+STRING_DELETE_WIPE, "\8a®\91S\82É\8fÁ\8b\8e\82³\82ê\82Ü\82µ\82½\81B"
+STRING_FOR_ERROR, "\96³\8cø\82È\95Ï\90\94\82ª\8ew\92è\82³\82ê\82Ü\82µ\82½\81B"
+STRING_SCREEN_COL, "\8ds\82Ì\92l\82ª\96³\8cø\82Å\82·\81B"
+STRING_SCREEN_ROW, "\97ñ\82Ì\92l\82ª\96³\8cø\82Å\82·\81B"
+STRING_TIMER_TIME "\83^\83C\83}\81[ %d \82Í %s \82Å\82·\81B: "
+
+STRING_INVALID_OPERAND, "\96³\8cø\82È\83I\83y\83\89\83\93\83h\82Å\82·\81B"
+STRING_EXPECTED_CLOSE_PAREN, "Expected ')'"
+STRING_EXPECTED_NUMBER_OR_VARIABLE,"Expected number or variable name."
+STRING_SYNTAX_COMMAND_INCORRECT, "\83R\83}\83\93\83h\82Ì\8d\\\95¶\82ª\8aÔ\88á\82Á\82Ä\82¢\82Ü\82·\81B"
+
+}
--- /dev/null
+#include "windows.h"
+#include "resource.h"
+/*
+ * Russian language file by
+ * Andrey Korotaev (unC0Rr@inbox.ru)
+ * and
+ * Aleksey Bragin (aleksey@reactos.com)
+ * Copyright 2005
+ */
+
+
+LANGUAGE LANG_RUSSIAN, SUBLANG_NEUTRAL
+STRINGTABLE DISCARDABLE
+{
+
+STRING_ATTRIB_HELP, "Âûâîä è èçìåíåíèå àòðèáóòîâ ôàéëîâ.\n\n\
+ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] ôàéë ...\n\
+ [/S [/D]]\n\n\
+ + Óñòàíîâêà àòðèáóòà.\n\
+ - Ñíÿòèå àòðèáóòà.\n\
+ R Àòðèáóò ""Òîëüêî ÷òåíèå"".\n\
+ A Àòðèáóò ""Àðõèâíûé"".\n\
+ S Àòðèáóò ""Ñèñòåìíûé"".\n\
+ H Àòðèáóò ""Ñêðûòûé"".\n\
+ /S Îáðàáîòêà ôàéëîâ ñ óêàçàííûìè èìåíàìè â òåêóùåé ïàïêå\n\
+è âî âñåõ åå ïîäïàïêàõ.\n\
+ /D Îáðàáîòêà è ôàéëîâ, è ïàïîê.\n\n\
+ATTRIB áåç ïàðàìåòðîâ âûâîäèò àòðèáóòû âñåõ ôàéëîâ.\n"
+
+STRING_ALIAS_HELP, "Âûâîä, óñòàíîâêà èëè óäàëåíèå ïñåâäîíèìîâ.\n\n\
+ALIAS [ïñåâäîíèì=[êîìàíäà]]\n\n\
+ ïñåâäîíèì Íàèìåíîâàíèå ïñåâäîíèìà.\n\
+ êîìàíäà Òåêñò, ïîäñòàâëÿåìûé âìåñòî ïñåâäîíèìà.\n\n\
+Âûâîä ñïèñêà âñåõ ïñåâäîíèìîâ:\n\
+ ALIAS\n\n\
+Óñòàíîâêà èëè èçìåíåíèå ñóùåñòâóþùåãî ïñåâäîíèìà:\n\
+ ALIAS da=dir a:\n\n\
+Óäàëåíèå ïñåâäîíèìà èç ñïèñêà:\n\
+ ALIAS da="
+
+STRING_BEEP_HELP, "Çâóêîâîé ñèãíàë.\n\nBEEP\n"
+
+STRING_CALL_HELP, "Âûçîâ îäíîãî ïàêåòíîãî ôàéëà èç äðóãîãî.\n\n\
+CALL [äèñê:][ïóòü]èìÿ_ôàéëà [ïàðàìåòðû]\n\n\
+ ïàðàìåòðû Íàáîð ïàðàìåòðîâ êîìàíäíîé ñòðîêè, íåîáõîäèìûõ\n\
+ ïàêåòíîìó ôàéëó."
+
+STRING_CD_HELP, "Âûâîä èìåíè ëèáî ñìåíà òåêóùåãî êàòàëîãà.\n\n\
+CHDIR [/D][äèñê:][ïóòü]\n\
+CHDIR[..|.]\n\
+CD [/D][äèñê:][ïóòü]\n\
+CD[..|.]\n\n\
+ .. îáîçíà÷àåò ðîäèòåëüñêèé êàòàëîã\n\
+ . îáîçíà÷àåò òåêóùèé êàòàëîã\n\
+ /D Îäíîâðåìåííàÿ ñìåíà òåêóùèõ äèñêà è êàòàëîãà.\n\n\
+Êîìàíäà CD äèñê: îòîáðàæàåò èìÿ òåêóùåãî êàòàëîãà óêàçàííîãî äèñêà.\n\
+Êîìàíäà CD áåç ïàðàìåòðîâ îòîáðàæàåò èìåíà òåêóùèõ äèñêà è êàòàëîãà.\n"
+
+STRING_CHCP_HELP, "Âûâîä èëè ñìåíà òåêóùåãî íîìåðà êîäîâîé ñòðàíèöû.\n\n\
+CHCP [nnn]\n\n\
+ nnn Íîìåð êîäîâîé ñòðàíèöû.\n\n\
+Êîìàíäà CHCP áåç ïàðàìåòðà âûâîäèò òåêóùèé íîìåð êîäîâîé ñòðàíèöû.\n"
+
+STRING_CHOICE_HELP, "Æä¸ò, ïîêà ïîëüçîâàòåëü íå âûáåðåò îäèí èç óêàçàííûõ â ñïèñêå ñèìâîëîâ.\n\n\
+CHOICE [/C[:]ñïèñîê_ñèìâîëîâ][/N][/S][/T[:]c,nn][òåêñò]\n\n\
+ /C[:]ñïèñîê_ñèìâîëîâ Óêàçûâàåò äîïóñòèìûå ñèìâîëû. Ïî óìîë÷àíèþ ýòî YN.\n\
+ /N Íå âûâîäèòü ñïèñîê ñèìâîëîâ è ? ïîñëå ïîäñêàçêè.\n\
+ /S Òðàêòîâàòü ñèìâîëû êàê ÷óâñòâèòåëüíûå ê ðåãèñòðó.\n\
+ /T[:]c,nn Ïî óìîë÷àíèþ âûáîð c ïî èñòå÷åíèè nn ñåêóíä.\n\
+ text Ïîäñêàçêà.\n\n\
+ERRORLEVEL óñòàíàâëèâàåòñÿ ðàâíûì íîìåðó âûáðàííîãî ñèìâîëà.\n"
+
+STRING_CLS_HELP, "Î÷èñòêà ýêðàíà.\n\nCLS\n"
+
+STRING_CMD_HELP1, "\nÄîñòóïíûå âíóòðåííèå êîìàíäû:\n"
+
+STRING_CMD_HELP2, "\nÄîñòóïíûå âîçìîæíîñòè:"
+
+STRING_CMD_HELP3," [ïñåâäîíèìû]"
+
+STRING_CMD_HELP4," [èñòîðèÿ]"
+
+STRING_CMD_HELP5," [çàâåðøåíèå èìåí ôàéëîâ unix]"
+
+STRING_CMD_HELP6," [ñòåê äèðåêòîðèé]"
+
+STRING_CMD_HELP7," [ïåðåíàïðàâëåíèå è piping]"
+
+STRING_CMD_HELP8, "Çàïóñê íîâîé êîïèè èíòåðïðåòàòîðà êîìàíä ReactOS.\n\n\
+CMD [/[C|K] êîìàíäà][/P][/Q][/T:bf]\n\n\
+ /C êîìàíäà Âûïîëíåíèå óêàçàííîé êîìàíäû ñ ïîñëåäóþùèì çàâåðøåíèåì.\n\
+ /K êîìàíäà Âûïîëíåíèå óêàçàííîé êîìàíäû áåç ïîñëåäóþùåãî çàâåðøåíèÿ.\n\
+ /P CMD ñòàíîâèòñÿ ïåðìàíåíòíûì è çàïóñêàåò autoexec.bat\n\
+ (ïðîöåññ íåìîæåò áûòü çàâåðøåí).\n\
+ /T:öâ Âûáîð öâåòà òåêñòà/ôîíà (áîëåå ïîäðîáíî ñì. COLOR /?).\n"
+
+STRING_COLOR_HELP1, "Óñòàíîâêà öâåòîâ ïî óìîë÷àíèþ äëÿ òåêñòà è ôîíà.\n\n\
+COLOR [öâåòà [/-F]] \n\n\
+ öâåòà Àòðèáóòû öâåòîâ äëÿ òåêñòîâûõ îêîí\n\
+ /-F Íå çàëèâàòü íåçàïîëíåííûå ìåñòà öâåòîì\n\n\
+Åñòü òðè ñïîñîáà îáîçíà÷àòü öâåòà:\n\
+1) ïî íàçâàíèþ íà àíãëèéñêîì ÿçûêå (òðåáóþòñÿ òîëüêî ïåðâûå òðè áóêâû öâåòà)\n\
+2) â âèäå äåñÿòè÷íûõ ÷èñåë (decimal on decimal)\n\
+3) äâà øåñòíàäöàòåðè÷íûõ ÷èñëà\n\n\
+Òàáëèöà öâåòîâ:\n\
+äåñ. øåñò.íàçâàíèå äåñ. øåñò.íàçâàíèå\n\
+ 0 0 = ×åðíûé 8 8 = Ñåðûé\n\
+ 1 1 = Ñèíèé 9 9 = Ñâåòëî-ñèíèé\n\
+ 2 2 = Çåëåíûé 10 A = Ñâåòëî-çåëåíûé\n\
+ 3 3 = Ãîëóáîé 11 B = Ñâåòëî-ãîëóáîé\n\
+ 4 4 = Êðàñíûé 12 C = Ñâåòëî-êðàñíûé\n\
+ 5 5 = Ëèëîâûé 13 D = Ñâåòëî-ëèëîâûé\n\
+ 6 6 = Æåëòûé 14 E = Ñâåòëî-æåëòûé\n\
+ 7 7 = Áåëûé 15 F = ßðêî-áåëûé\n"
+
+STRING_COPY_HELP1, "Ïåðåçàïèñàòü %s (Yes/No/All)? "
+
+STRING_COPY_HELP2, "Êîïèðîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ â äðóãîå ìåñòî.\n\n\
+COPY [/V][/Y|/-Y][/A|/B] èñòî÷íèê [/A|/B]\n\
+ [+ èñòî÷íèê [/A|/B] [+ ...]] [ðåçóëüòàò [/A|/B]]\n\n\
+ èñòî÷íèê Èìåíà îäíîãî èëè íåñêîëüêèõ êîïèðóåìûõ ôàéëîâ.\n\
+ /A Ôàéë ÿâëÿåòñÿ òåêñòîâûì ôàéëîì ASCII.\n\
+ /B Ôàéë ÿâëÿåòñÿ äâîè÷íûì ôàéëîì.\n\
+ ðåçóëüòàò Êàòàëîã è/èëè èìÿ äëÿ êîíå÷íûõ ôàéëîâ.\n\
+ /V Ïðîâåðêà ïðàâèëüíîñòè êîïèðîâàíèÿ ôàéëîâ.\n\
+ /Y Ïîäàâëåíèå çàïðîñà ïîäòâåðæäåíèÿ íà ïåðåçàïèñü ñóùåñòâóþùåãî\n\
+ ðåçóëüòèðóþùåãî ôàéëà.\n\
+ /-Y Îáÿçàòåëüíûé çàïðîñ ïîäòâåðæäåíèÿ íà ïåðåçàïèñü ñóùåñòâóþùåãî\n\
+ ðåçóëüòèðóþùåãî ôàéëà.\n\n\
+Êëþ÷ /Y ìîæíî óñòàíîâèòü ÷åðåç ïåðåìåííóþ ñðåäû COPYCMD.\n\
+...\n"
+
+STRING_DATE_HELP1, "\nÂâåäèòå íîâóþ äàòó (ìì%cää%cãããã): "
+
+STRING_DATE_HELP2, "\nÂâåäèòå íîâóþ äàòó (ää%cìì%cãããã): "
+
+STRING_DATE_HELP3, "\nÂâåäèòå íîâóþ äàòó (ãããã%cìì%cää): "
+
+STRING_DATE_HELP4, "Âûâîä èëè èçìåíåíèå äàòû.\n\n\
+DATE [/T][äàòà]\n\n\
+ /T Íå çàïðàøèâàòü ââîä íîâîé äàòû\n\n\
+Êîìàíäà DATE áåç ïàðàìåòðîâ îòîáðàæàåò òåêóùóþ äàòó è çàïðàøèâàåò ââîä\n\
+íîâîé äàòû. Äëÿ ñîõðàíåíèÿ òåêóùåé äàòû íàæìèòå êëàâèøó ENTER.\n"
+
+STRING_DEL_HELP1, "Óäàëåíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\n\
+DEL [/N /P /T /Q /S /W /Y /Z /A[[:]àòðèáóòû]] èìåíà_ôàéëîâ ...\n\
+DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]àòðèáóòû]] èìåíà_ôàéëîâ ...\n\
+ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]àòðèáóòû]] èìåíà_ôàéëîâ ...\n\n\
+ èìåíà_ôàéëîâ Èìåíà îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\n\
+ /N Íåâûïîëíÿòü íåïîñðåäñòâåííî îïåðàöèþ óäàëåíèÿ ôàéëà.\n\
+ /P Çàïðîñ íà ïîäòâåðæäåíèå ïåðåä óäàëåíèåì êàæäîãî ôàéëà.\n\
+ /T Ïîêàçûâàåò êîëè÷åñòâî óäàë¸ííûõ ôàéëîâ è îñâîáîäèâøåãîñÿ\n\
+ äèñêîâîãî ïðîñòðàíñòâà.\n\
+ /Q Îòêëþ÷åíèå çàïðîñà íà ïîäòâåðæäåíèå ïðè óäàëåíèè ôàéëîâ.\n\
+ /W Ïåðåïèñàòü ôàéë ñëó÷àéíûìè äàííûìè ïåðåä óäàëåíèåì.\n\
+ /Y Îòêëþ÷åíèå çàïðîñà íà ïîäòâåðæäåíèå ïðè óäàëåíèè ôàéëîâ\n\
+ äàæå äëÿ ìàñêè *.*.\n\
+ /F Ïðèíóäèòåëüíîå óäàëåíèå ôàéëîâ, äîñòóïíûõ òîëüêî äëÿ ÷òåíèÿ.\n\
+ /S Óäàëÿòü ôàéë èç âñåõ ïîääèðåêòîðèé\n\
+ /A Îòáîð ôàéëîâ äëÿ óäàëåíèÿ ïî àòðèáóòàì.\n\
+ R Äîñòóïíûé òîëüêî äëÿ ÷òåíèÿ\n\
+ S Ñèñòåìíûå ôàéëû\n\
+ A Ôàéëû äëÿ àðõèâèðîâàíèÿ\n\
+ H Ñêðûòûå ôàéëû\n\
+ Ïðåôèêñ ""-"" èìååò çíà÷åíèå ÍÅ\n"
+
+STRING_DEL_HELP2, "Âñå ôàéëû â êàòàëîãå áóäóò óäàëåíû!\nÂû óâåðåíû (Y/N)?"
+STRING_DEL_HELP3, " %lu ôàéë óäàë¸í\n"
+STRING_DEL_HELP4, " %lu ôàéëîâ óäàëåíî\n"
+
+STRING_DELAY_HELP, "ïàóçà íà n ñåêóíä èëè ìèëëèñåêóíä\n\
+DELAY [/m]n\n\n\
+ /m óêàçûâàåò, ÷òî n îçíà÷àåò êîëè÷åñòâî ìèëëèñåêóíä\n\
+ èíà÷å n îçíà÷àåò êîëè÷åñòâî ñåêóíä\n"
+
+STRING_DIR_HELP1, "DIR [äèñê:][ïóòü][èìÿ_ôàéëà] [/A[[:]àòðèáóòû]] [/B] [/C] [/D] [/L] [/N]\n\
+ [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
+ [äèñê:][ïóòü][èìÿ_ôàéëà]\n\
+ Äèñê, êàòàëîã è/èëè ôàéëû, êîòîðûå ñëåäóåò âêëþ÷èòü â ñïèñîê.\n\n\
+ /A Âûâîä ôàéëîâ ñ óêàçàííûìè àòðèáóòàìè.\n\
+ àòðèáóòû D Êàòàëîãè R Äîñòóïíûå òîëüêî äëÿ ÷òåíèÿ\n\
+ H Ñêðûòûå ôàéëû A Ôàéëû äëÿ àðõèâèðîâàíèÿ\n\
+ S Ñèñòåìíûå ôàéëû Ïðåôèêñ ""-"" èìååò çíà÷åíèå ÍÅ\n\
+ /B Âûâîä òîëüêî èìåí ôàéëîâ.\n\
+ /C Ïðèìåíåíèå ðàçäåëèòåëÿ ãðóïï ðàçðÿäîâ äëÿ âûâîäà ðàçìåðîâ ôàéëîâ\n\
+ (ïî óìîë÷àíèþ). Äëÿ îòêëþ÷åíèÿ ýòîãî ðåæèìà ñëóæèò êëþ÷ /-C.\n\
+ /D Âûâîä ñïèñêà â íåñêîëüêî ñòîëáöîâ ñ ñîðòèðîâêîé ïî ñòîëáöàì.\n\
+ /L Èñïîëüçîâàíèå íèæíåãî ðåãèñòðà äëÿ èìåí ôàéëîâ.\n\
+ /N Îòîáðàæåíèå èìåí ôàéëîâ â êðàéíåì ïðàâîì ñòîëáöå.\n\
+ /O Ñîðòèðîâêà ñïèñêà îòîáðàæàåìûõ ôàéëîâ.\n\
+ ïîðÿäîê N Ïî èìåíè (àëôàâèòíàÿ) S Ïî ðàçìåðó (ñïåðâà ìåíüøèå)\n\
+ E Ïî ðàñøèðåíèþ (àëôàâèòíàÿ) D Ïî äàòå (ñïåðâà áîëåå ñòàðûå)\n\
+ G Íà÷àòü ñïèñîê ñ êàòàëîãîâ Ïðåôèêñ ""-"" îáðàùàåò ïîðÿäîê\n\
+ /P Ïàóçà ïîñëå çàïîëíåíèÿ êàæäîãî ýêðàíà.\n\
+ /Q Âûâîä ñâåäåíèé î âëàäåëüöå ôàéëà.\n\
+ /S Âûâîä ñïèñêà ôàéëîâ èç óêàçàííîãî êàòàëîãà è åãî ïîäêàòàëîãîâ.\n\
+ /T Âûáîð ïîëÿ âðåìåíè äëÿ îòîáðàæåíèÿ è ñîðòèðîâêè\n\
+ âðåìÿ C Ñîçäàíèå\n\
+ A Ïîñëåäíåå èñïîëüçîâàíèå\n\
+ W Ïîñëåäíåå èçìåíåíèå\n\
+ /W Âûâîä ñïèñêà â íåñêîëüêî ñòîëáöîâ.\n\
+ /X Îòîáðàæåíèå êîðîòêèõ èìåí äëÿ ôàéëîâ, ÷üè èìåíà íå ñîîòâåòñòâóþò\n\
+ ñòàíäàðòó 8.3. Ôîðìàò àíàëîãè÷åí âûâîäó ñ êëþ÷îì /N, íî êîðîòêèå\n\
+ èìåíà ôàéëîâ âûâîäÿòñÿ ñëåâà îò äëèííûõ. Åñëè êîðîòêîãî èìåíè ó\n\
+ ôàéëà íåò, âìåñòî íåãî âûâîäÿòñÿ ïðîáåëû.\n\
+ /4 Âûâîä íîìåðà ãîäà â ÷åòûðåõçíà÷íîì ôîðìàòå\n"
+
+STRING_DIR_HELP2, " Òîì â óñòðîéñòâå %c èìååò ìåòêó %s\n"
+STRING_DIR_HELP3, " Òîì â óñòðîéñòâå %c íå èìååò ìåòêè.\n"
+STRING_DIR_HELP4, " Ñåðèéíûé íîìåð òîìà: %04X-%04X\n"
+STRING_DIR_HELP5, "\n Âñåãî:\n%16i Ôàéë(îâ)% 14s áàéò\n"
+STRING_DIR_HELP6, "%16i Dir(s)% 15s áàéò\n"
+STRING_DIR_HELP7, "\n Êàòàëîã of %s\n\n"
+STRING_DIR_HELP8, "%16i ôàéë(îâ)% 14s áàéò\n"
+
+STRING_DIRSTACK_HELP1, "Ñîõðàíÿåò òåêóùóþ äèðåêòîðèþ äëÿ èñïîëüçîâàíèÿ êîìàíäîé POPD, çàòåì\n\
+èçìåíÿåò å¸ íà óêàçàííóþ.\n\n\
+PUSHD [path | ..]\n\n\
+ path Óêàçûâàåò äèðåêòîðèþ, êîòîðóþ íàäî ñäåëàòü òåêóùåé\n"
+
+STRING_DIRSTACK_HELP2, "Èçìåíÿåò òåêóùóþ äèðåêòîðèþ íà òó, êîòîðàÿ ñîõðàíåíà êîìàíäîé PUSHD.\n\nPOPD"
+
+STRING_DIRSTACK_HELP3, "Ïå÷àòàåò ñîäåðæèìîå ñòåêà äèðåêòîðèé.\n\nDIRS"
+
+STRING_DIRSTACK_HELP4, "Ñòåê äèðåêòîðèé ïóñò"
+
+STRING_ECHO_HELP1, "Âûäàåò ñîîáùåíèå áåç ïåðåâîäà ñòðîêè.\n\n\
+ ECHOS message"
+
+STRING_ECHO_HELP2, "Âûäàåò ñîîáùåíèå â ñòàíäàðòíûé êàíàë âûâîäà îøèáîê.\n\n\
+ ECHOERR message\n\
+ ECHOERR. ïå÷àòàåò ïóñòóþ ñòðîêó"
+
+STRING_ECHO_HELP3, "Ïå÷àòàåò ñîîáùåíèå â ñòàíäàðòíûé êàíàë âûâîäà îøèáîê áåç ïåðåâîäà ñòðîêè è âîçâðàòà êàðåòêè.\n\n\
+ ECHOSERR message"
+
+STRING_ECHO_HELP4, "Âûâîä ñîîáùåíèé è ïåðåêëþ÷åíèå ðåæèìà îòîáðàæåíèÿ êîìàíä íà ýêðàíå.\n\n\
+ ECHO [ON | OFF]\n\
+ ECHO [ñîîáùåíèå]\n\
+ ECHO. âûâîä ïóñòîé ñòðîêè\n\n\
+ECHO áåç ïàðàìåòðà âûâîäèò òåêóùèé ðåæèì îòîáðàæåíèÿ êîìàíä."
+
+STRING_ECHO_HELP5, "ECHO is %s\n"
+
+STRING_EXIT_HELP, "Çàâåðøàåò èíòåðïðåòàòîð êîìàíä.\n\nEXIT\n"
+
+STRING_FOR_HELP1, "Çàïóñêàåò óêàçàííóþ êîìàíäó äëÿ êàæäîãî ôàéëà èç íàáîðà ôàéëîâ\n\n\
+FOR %ïåðåìåííàÿ IN (íàáîð) DO êîìàíäà [ïàðàìåòðû]\n\n\
+ %ïåðåìåííàÿ Ïîäñòàâëÿåìûé ïàðàìåòð.\n\
+ (íàáîð) Íàáîð èç îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\
+ Äîïóñêàåòñÿ èñïîëüçîâàíèå ïîäñòàíîâî÷íûõ çíàêîâ.\n\
+ êîìàíäà Êîìàíäà, êîòîðóþ ñëåäóåò âûïîëíèòü äëÿ êàæäîãî ôàéëà.\n\
+ ïàðàìåòðû Ïàðàìåòðû è êëþ÷è äëÿ óêàçàííîé êîìàíäû.\n\n\
+Â ïàêåòíûõ ôàéëàõ äëÿ êîìàíäû FOR èñïîëüçóåòñÿ çàïèñü\n\
+%%ïåðåìåííàÿ âìåñòî %ïåðåìåííàÿ.\n"
+
+STRING_FREE_HELP1, "\nÒîì äèñêà %s: %-11s\n\
+ Ñåðèéíûé íîìåð: %s\n\
+ %16s áàéò îáùåãî äèñêîâîãî ïðîñòðàíñòâà\n\
+ %16s áàéò çàíÿòî\n\
+ %16s áàéò ñâîáîäíî\n"
+
+STRING_FREE_HELP2, "Âûâîäèò èíôîðìàöèþ î òîìå.\n\nFREE [drive: ...]\n"
+
+STRING_IF_HELP1, "Îïåðàòîð óñëîâíîãî âûïîëíåíèÿ êîìàíä â ïàêåòíîì ôàéëå.\n\n\
+ IF [NOT] ERRORLEVEL ÷èñëî êîìàíäà\n\
+ IF [NOT] ñòðîêà1==ñòðîêà2 êîìàíäà\n\
+ IF [NOT] EXIST èìÿ_ôàéëà êîìàíäà\n\
+ IF [NOT] DEFINED ïåðåìåííàÿ êîìàíäà\n\n\
+ NOT Îáðàùàåò èñòèííîñòü óñëîâèÿ: èñòèííîå óñëîâèå\n\
+ ñòàíîâèòñÿ ëîæíûì, à ëîæíîå - èñòèííûì.\n\
+ ERRORLEVEL ÷èñëî Óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè êîä âîçâðàòà ïîñëåäíåé\n\
+ âûïîëíåííîé ïðîãðàììû íå ìåíüøå óêàçàííîãî ÷èñëà.\n\
+ ñòðîêà1==ñòðîêà2 Ýòî óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè óêàçàííûå ñòðîêè\n\
+ ñîâïàäàþò.\n\
+ EXIST èìÿ_ôàéëà Ýòî óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè ôàéë ñ óêàçàííûì\n\
+ èìåíåì ñóùåñòâóåò.\n\
+DEFINED ïåðåìåííàÿ Ýòî óñëîâèå ÿâëÿåòñÿ èñòèííûì, åñëè óêàçàííàÿ ïåðåìåííàÿ\n\
+ çàäàíà\n\
+ êîìàíäà Çàäàåò êîìàíäó, âûïîëíÿåìóþ ïðè èñòèííîñòè óñëîâèÿ.\n\
+ Çà ýòîé êîìàíäîé ìîæåò ñëåäîâàòü êëþ÷åâîå ñëîâî ELSE,\n\
+ ñëóæàùåå äëÿ óêàçàíèÿ êîìàíäû, êîòîðàÿ äîëæíà\n\
+ âûïîëíÿòüñÿ â òîì ñëó÷àå, åñëè óñëîâèå ëîæíî.\n"
+
+STRING_GOTO_HELP1, "Ïåðåäà÷à óïðàâëåíèÿ ñîäåðæàùåé ìåòêó ñòðîêå ïàêåòíîãî ôàéëà.\n\n\
+GOTO ìåòêà\n\n\
+ label Ñòðîêà ïàêåòíîãî ôàéëà, îôîðìëåííàÿ êàê ìåòêà.\n\n\
+Ìåòêà äîëæíà íàõîäèòüñÿ â îòäåëüíîé ñòðîêå è íà÷èíàòüñÿ ñ äâîåòî÷èÿ."
+
+STRING_LABEL_HELP1, "Ñîçäàíèå, èçìåíåíèå è óäàëåíèå ìåòîê òîìà.\n\nLABEL [äèñê:][ìåòêà]\n"
+
+STRING_LABEL_HELP2, "Òîì â óñòðîéñòâå %c èìååò ìåòêó %s\n"
+STRING_LABEL_HELP3, "Òîì â óñòðîéñòâå %c: íå èìååò ìåòêè\n"
+STRING_LABEL_HELP4, "Ñåðèéíûé íîìåð òîìà: %04X-%04X\n"
+STRING_LABEL_HELP5, "Ìåòêà òîìà (11 áóêâ, ÂÂÎÄ äëÿ ïóñòîé ìåòêè)? "
+
+STRING_LOCALE_HELP1, "Òåêóùåå âðåìÿ: "
+
+STRING_MKDIR_HELP, "Ñîçäàíèå êàòàëîãà.\n\n\
+MKDIR [äèñê:]ïóòü\nMD [äèñê:]ïóòü"
+
+STRING_MEMMORY_HELP1, "Âûâîä îáú¸ìà ñèñòåìíîé ïàìÿòè.\n\nMEMORY"
+
+STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\
+ %13s áàéò âñåãî ôèçè÷åñêîé ïàìÿòè.\n\
+ %13s áàéò äîñòóïíî ôèçè÷åñêîé ïàìÿòè.\n\n\
+ %13s áàéò âñåãî â ôàéëå ïîäêà÷êè.\n\
+ %13s áàéò äîñòóïíî â ôàéëå ïîäêà÷êè.\n\n\
+ %13s áàéò âñåãî âèðòóàëüíîé ïàìÿòè.\n\
+ %13s áàéò äîñòóïíî âèðòóàëüíî ïàìÿòè.\n"
+
+STRING_MISC_HELP1, "Íàæìèòå êëàâèøó äëÿ ïðîäîëæåíèÿ...\n"
+
+STRING_MOVE_HELP1, "Ïåðåïèñàòü %s (Yes/No/All)? "
+
+STRING_MOVE_HELP2, "Ïåðåìåùåíèå ôàéëîâ è ïåðåèìåíîâàíèå ôàéëîâ è êàòàëîãîâ.\n\n\
+Ïåðåìåùåíèå îäíîãî èëè áîëåå ôàéëîâ:\n\
+MOVE [/N][äèñê:][ïóòü]èìÿ_ôàéëà1[,...] íàçíà÷åíèå\n\n\
+Ïåðåèìåíîâàíèå êàòàëîãà:\n\
+MOVE [/N][äèñê:][ïóòü]èìÿ_êàòàëîãà1 èìÿ_êàòàëîãà2\n\n\
+ [äèñê:][ïóòü]èìÿ_ôàéëà1 Óêàçûâàåò ìåñòîïîëîæåíèå è èìÿ ôàéëà èëè ôàéëîâ\n\
+ êîòîðûå íåîáõîäèìî ïåðåìåñòèòü.\n\
+ /N Nothing. Do everything but move files or directories.\n\n\
+Òåêóùèå îãðàíè÷åíèÿ:\n\
+ - Íåâîçìîæíî ïåðåíîñèòü ôàéëû èëè ïàïêè ìåæäó ðàçíûìè ðàçäåëàìè.\n"
+
+STRING_MSGBOX_HELP, "Âûâîä îêíà ñ ñîîáùåíèåì è âîçâðàò îòâåòà ïîëüçîâàòåëÿ\n\n\
+MSGBOX òèï ['çàãîëîâîê'] ïîäñêàçêà\n\n\
+òèï âûâîäèìûå êíîïêè\n\
+ âîçìîæíûå çíà÷åíèÿ: OK, OKCANCEL,\n\
+ YESNO, YESNOCANCEL\n\
+çàãîëîâîê çàãîëîâîê îêíà ñ ñîîáùåíèåì\n\
+ïîäñêàçêà âûâîäèìûé òåêñò ïîäñêàçêè\n\n\n\
+ERRORLEVEL óñòàíàâëèâàåòñÿ â ñîîòâåòñòâèè ñ íàæàòîé êíîïêîé:\n\n\
+YES : 10 | NO : 11\n\
+OK : 10 | CANCEL : 12\n"
+
+STRING_PATH_HELP1, "Âûâîä èëè çàäàíèå ïóòè ïîèñêà èñïîëíÿåìûõ ôàéëîâ.\n\n\
+PATH [[äèñê:]ïóòü[;...]]\nPATH ;\n\n\
+Êîìàíäà PATH ; î÷èùàåò ïóòü ïîèñêà èñïîëüçóåìûõ ôàéëîâ, îãðàíè÷èâ åãî\n\
+òåêóùèì êàòàëîãîì.\n\
+Êîìàíäà PATH áåç ïàðàìåòðîâ îòîáðàæàåò òåêóùèé ïóòü ïîèñêà.\n"
+
+STRING_PROMPT_HELP1, "Èçìåíåíèå ïðèãëàøåíèÿ êîìàíäíîé ñòðîêè.\n\n\
+PROMPT [òåêñò]\n\n\
+ òåêñò Íîâîå ïðèãëàøåíèå êîìàíäíîé ñòðîêè.\n\n\
+Ïðèãëàøåíèå ìîæåò âêëþ÷àòü îáû÷íûå ñèìâîëû è ñëåäóþùèå êîäû:\n\n\
+ $A & (àìïåðñàíä)\n\
+ $B | (âåðòèêàëüíàÿ ÷åðòà)\n\
+ $C ( (ëåâàÿ êðóãëàÿ ñêîáêà)\n\
+ $D Òåêóùàÿ äàòà\n\
+ $E ESC (ñèìâîë ASCII ñ êîäîì 27)\n\
+ $F ) (ïðàâàÿ êðóãëàÿ ñêîáêà)\n\
+ $G > (çíàê ""áîëüøå"")\n\
+ $H BACKSPACE (óäàëåíèå ïðåäûäóùåãî ñèìâîëà)\n\
+ $L < (çíàê ""ìåíüøå"")\n\
+ $N Òåêóùèé äèñê\n\
+ $P Òåêóùèå äèñê è êàòàëîã\n\
+ $Q = (çíàê ðàâåíñòâà)\n\
+ $T Òåêóùåå âðåìÿ\n\
+ $V Íîìåð âåðñèè îïåðàöèîííîé ñèñòåìû\n\
+ $_ Ïåðåâîä ñòðîêè\n\
+ $$ $ (çíàê äîëëàðà)\n"
+
+STRING_PAUSE_HELP1, "Ïðèîñòàíîâêà âûïîëíåíèÿ ïàêåòíîãî ôàéëà è âûâîä ñîîáùåíèÿ:\n\
+'Äëÿ ïðîäîëæåíèÿ íàæìèòå ëþáóþ êëàâèøó...' èëè óêàçàííîå ñîîáùåíèå.\n\n\
+PAUSE [ñîîáùåíèå]"
+
+STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack"
+
+STRING_PROMPT_HELP3, "\nPROMPT áåç ïàðàìåòðîâ óñòàíàâëèâàåò ïðèãëàøåíèå êîìàíäíîé ñòðîêè ïî óìîë÷àíèþ."
+
+STRING_REM_HELP, "Ïîìåùåíèå êîììåíòàðèåâ â ïàêåòíûå ôàéëû.\n\nREM [êîììåíòàðèé]"
+
+STRING_RMDIR_HELP, "Óäàëåíèå êàòàëîãà.\n\n\
+RMDIR [äèñê:]ïóòü\nRD [äèñê:]ïóòü\n\
+/S Óäàëåíèå äåðåâà êàòàëîãîâ\n\
+/Q Îòêëþ÷åíèå çàïðîñà ïîäòâåðæäåíèÿ\n"
+STRING_RMDIR_HELP2, "Êàòàëîã ïóñò!\n"
+
+STRING_REN_HELP1, "Ïåðåèìåíîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ èëè êàòàëîãîâ.\n\n\
+RENAME [/E /N /P /Q /S /T] ñòàðîå_èìÿ ... íîâîå_èìÿ\n\
+REN [/E /N /P /Q /S /T] ñòàðîå_èìÿ ... íîâîå_èìÿ\n\n\
+ /E Íå âûâîäèòü ñîîáùåíèÿ îá îøèáêàõ.\n\
+ /N Nothing.\n\
+ /P Çàïðîñ ïîäòâåðæäåíèÿ ïåðåä ïåðåèìåíîâàíèåì.\n\
+ (Not implemented yet!)\n\
+ /Q Quiet.\n\
+ /S Ïåðåèìåíîâûâàòü ïîäêàòàëîãè.\n\
+ /T Âûâîä êîëè÷åñòâà ïåðåèìåíîâàííûõ ôàéëîâ.\n\n\
+Äëÿ êîíå÷íîãî ôàéëà íåëüçÿ óêàçàòü äðóãîé äèñê èëè êàòàëîã.\n\
+Äëÿ ýòîé öåëè ñëåäóåò èñïîëüçîâàòü êîìàíäó MOVE.\n"
+
+STRING_REN_HELP2, " %lu ôàéë ïåðåèìåíîâàí\n"
+
+STRING_REN_HELP3, " %lu ôàéëîâ ïåðåèìåíîâàíî\n"
+
+STRING_SHIFT_HELP, "Èçìåíåíèå ñîäåðæèìîãî (ñäâèã) ïîäñòàâëÿåìûõ ïàðàìåòðîâ äëÿ ïàêåòíîãî ôàéëà.\n\n\
+SHIFT [DOWN]"
+
+STRING_SCREEN_HELP, "Ïåðåìåùåíèå êóðñîðà è âûâîä òåêñòà\n\n\
+SCREEN ñòð êîë [òåêñò]\n\n\
+ ñòð ñòðîêà, íà êîòîðóþ ñëåäóåò ïåðåìåñòèòü êóðñîð\n\
+ êîë êîëîíêà, íà êîòîðóþ ñëåäóåò ïåðåìåñòèòü êóðñîð"
+
+STRING_SET_HELP, "Âûâîä, çàäàíèå è óäàëåíèå ïåðåìåííûõ ñðåäû.\n\n\
+SET [ïåðåìåííàÿ[=][çíà÷åíèå]]\n\n\
+ ïåðåìåííàÿ Èìÿ ïåðåìåííîé ñðåäû.\n\
+ çíà÷åíèå Ñòðîêà ñèìâîëîâ, ïðèñâàèâàåìàÿ óêàçàííîé ïåðåìåííîé.\n\n\
+SET áåç ïàðàìåòðîâ âûâîäèò òåêóùèå çíà÷åíèÿ ïåðåìåííûõ ñðåäû.\n"
+
+STRING_START_HELP1, "Çàïóñê óêàçàííîé ïðîãðàììû èëè êîìàíäû.\n\n\
+START êîìàíäà\n\n\
+ êîìàíäà Êîìàíäà èëè ïðîãðàììà äëÿ çàïóñêà.\n\n\
+At the moment all commands are started asynchronously.\n"
+
+STRING_TITLE_HELP, "Èçìåíåíèå çàãîëîâêà îêíà êîìàíäíîé ñòðîêè.\n\n\
+TITLE [ñòðîêà]\n\n\
+ñòðîêà Áóäóùèé çàãîëîâîê îêíà êîìàíäíîé ñòðîêè.\n"
+
+STRING_TIME_HELP1, "Âûâîä èëè èçìåíåíèå âðåìåíè.\n\n\
+TIME [/T][âðåìÿ]\n\n\
+ /T íå èçìåíÿòü âðåìÿ\n\n\
+TIME áåç ïàðàìåòðîâ âûâîäèò òåêóùåå âðåìÿ è çàïðàøèâàåò\n\
+íîâîå âðåìÿ. Íàæàòèå ENTER ñîõðàíÿåò òåêóùåå âðåìÿ.\n"
+
+STRING_TIME_HELP2, "Ââåäèòå íîâîå âðåìÿ: "
+
+STRING_TIMER_HELP1, "Ïðîøëî %d ìñåê\n"
+
+STRING_TIMER_HELP2, "Ïðîøëî %02d%c%02d%c%02d%c%02d\n"
+
+STRING_TIMER_HELP3, "Ñåêóíäîìåð.\n\n\
+TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
+ ON Âêëþ÷èòü ñåêóíäîìåð\n\
+ OFF Âûêëþ÷èòü ñåêóíäîìåð\n\
+ /S Ðàçíèöà âðåìåíè. Âîçâðàùàåò ðàçíèöó âðåìåíè\n\
+ ñåêóíäîìåðà áåç èçìåíåíèÿ åãî çíà÷åíèÿ\n\
+ /n Çàäàòü íîìåð ñåêóíäîìåðà.\n\
+ Äîñòóïíûå íîìåðà - îò 0 äî 9\n\
+ Çíà÷åíèå ïî óìîë÷àíèþ - 1\n\
+ /Fn Ôîðìàò âûâîäà\n\
+ n îäíî èç:\n\
+ 0 ìèëëèñåêóíäû\n\
+ 1 ÷÷%cìì%cññ%cää\n\n\
+Åñëè íè îäèí èç ïàðàìåòðîâ íå óêàçàí, êîìàíäà\n\
+ïåðåêëþ÷àåò ñîñòîÿíèå ñåêóíäîìåðà\n\n"
+
+STRING_TYPE_HELP1, "Âûâîä ñîäåðæèìîãî îäíîãî èëè íåñêîëüêèõ òåêñòîâûõ ôàéëîâ.\n\nTYPE [äèñê:][ïóòü]èìÿ ôàéëà \n\
+ /P Ïîýêðàííûé âûâîä.\n"
+
+STRING_VERIFY_HELP1, "This command is just a dummy!!\n\
+Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåæèìà ïðîâåðêè ïðàâèëüíîñòè çàïèñè ôàéëîâ a\n\
+íà äèñê.\n\n\
+VERIFY [ON | OFF]\n\n\
+VERIFY áåç ïàðàìåòðà âûâîäèò òåêóùåå çíà÷åíèå ýòîé êîìàíäû.\n"
+
+STRING_VERIFY_HELP2, "VERIFY %s.\n"
+
+STRING_VERIFY_HELP3, "Íåîáõîäèìî óêàçàòü ON èëè OFF."
+
+STRING_VERSION_HELP1, "Âûâîä âåðñèè\n\n\
+VER [/C][/R][/W]\n\n\
+ /C Displays credits.\n\
+ /R Displays redistribution information.\n\
+ /W Displays warranty information."
+
+STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\
+type: `ver /w'. This is free software, and you are welcome to redistribute\n\
+it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\
+listing of credits."
+
+STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\
+ GNU General Public License for more details."
+
+STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\
+ it under the terms of the GNU General Public License as published by\n\
+ the Free Software Foundation; either version 2 of the License, or\n\
+ (at your option) any later version.\n"
+
+STRING_VERSION_HELP5, "\nÏîñûëàéòå îò÷åòû îá îøèáêàõ íà <ros-dev@reactos.org>.\n\
+Îáíîâëåíèÿ äîñòóïíû ïî àäðåñó: http://www.reactos.org/"
+
+STRING_VERSION_HELP6, "\nFreeDOS-âåðñèÿ íàïèñàíà:\n"
+
+STRING_VERSION_HELP7, "\nReactOS-âåðñèÿ íàïèñàíà:\n"
+
+STRING_VOL_HELP1, " Òîì â óñòðîéñòâå %c: èìååò ìåòêó %s"
+STRING_VOL_HELP2, " Òîì â óñòðîéñòâå %c: íå èìååò ìåòêè"
+STRING_VOL_HELP3, " Ñåðèéíûé íîìåð òîìà: %04X-%04X\n"
+STRING_VOL_HELP4, "Âûâîäèò ìåòêó òîìà è ñåðèéíûé íîìåð.\n\nVOL [äèñê:]"
+
+STRING_WINDOW_HELP1, "Ìåíÿåò âèä îêíà êîíñîëè\n\n\
+WINDOW [/POS[=]left,top,øèðèíà,âûñîòà]\n\
+ [MIN|MAX|RESTORE] ['çàãîëîâîê']\n\n\
+/POS óêàçûâàåò ðàçìåð è ïîëîæåíèå îêíà\n\
+MIN ñâîðà÷èâàåò îêíî\n\
+MAX ðàçâîðà÷èâàåò îêíî\n\
+RESTORE âîññòàíàâëèâàåò îêíî\n"
+
+STRING_WINDOW_HELP2, "Ìåíÿåò âèä îêíà êîíñîëè\n\n\
+ACTIVATE 'window' [/POS[=]left,top,øèðèíà,âûñîòà]\n\
+ [MIN|MAX|RESTORE] ['çàãîëîâîê']\n\n\
+window çàãîëîâîê îêíà, âèä êîòîðîãî ñëåäóåò ìåíÿòü\n\
+/POS óêàçûâàåò ðàçìåð è ïîëîæåíèå îêíà\n\
+MIN ñâîðà÷èâàåò îêíî\n\
+MAX ðàçâîðà÷èâàåò îêíî\n\
+RESTORE âîññòàíàâëèâàåò îêíî\n\
+çàãîëîâîê íîâûé çàãîëîâîê\n"
+
+
+STRING_HELP1, "Ñïèñîê âñåõ äîñòóïíûõ êîìàíä ñ êîðîòêèì îïèñàíèåì\n\n\
+ êîìàíäà /? Âûâîäèò ïîäðîáíóþ èíôîðìàöèþ î êîìàíäå\n\n\
+? Ñïèñîê âñåõ äîñòóïíûõ êîìàíä áåç îïèñàíèÿ.\n\
+ALIAS Âûâîä, óñòàíîâêà èëè óäàëåíèå ïñåâäîíèìîâ.\n\
+ATTRIB Âûâîä è èçìåíåíèå àòðèáóòîâ ôàéëîâ.\n\
+BEEP Çâóêîâîé ñèãíàë.\n\
+CALL Âûçîâ îäíîãî ïàêåòíîãî ôàéëà èç äðóãîãî.\n\
+CD Âûâîä èìåíè ëèáî ñìåíà òåêóùåãî êàòàëîãà.\n\
+CHCP Âûâîä èëè ñìåíà òåêóùåãî íîìåðà êîäîâîé ñòðàíèöû.\n\
+CHOICE Æä¸ò, ïîêà ïîëüçîâàòåëü íå âûáåðåò îäèí èç óêàçàííûõ â ñïèñêå ñèìâîëîâ.\n\
+CLS Î÷èñòêà ýêðàíà.\n\
+CMD Çàïóñê íîâîé êîïèè èíòåðïðåòàòîðà êîìàíä.\n\
+COLOR Óñòàíîâêà öâåòîâ ïî óìîë÷àíèþ äëÿ òåêñòà è ôîíà.\n\
+COPY Êîïèðîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ â äðóãîå ìåñòî.\n\
+DATE Âûâîä èëè èçìåíåíèå äàòû.\n\
+DELETE Óäàëåíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\
+DIR Âûâîä ñïèñêà ôàéëîâ è ïîäêàòàëîãîâ êàòàëîãà.\n\
+ECHO Âûâîä ñîîáùåíèé è ïåðåêëþ÷åíèå ðåæèìà îòîáðàæåíèÿ êîìàíä íà ýêðàíå.\n\
+ERASE Óäàëåíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ.\n\
+EXIT Çàâåðøàåò èíòåðïðåòàòîð êîìàíä.\n\
+FOR Çàïóñêàåò óêàçàííóþ êîìàíäó äëÿ êàæäîãî ôàéëà èç íàáîðà ôàéëîâ.\n\
+FREE (Ñâîáîäíîå) äèñêîâîå ïðîñòðàíñòâî.\n\
+GOTO Ïåðåäà÷à óïðàâëåíèÿ ñîäåðæàùåé ìåòêó ñòðîêå ïàêåòíîãî ôàéëà\n\
+HELP Ïðåäîñòàâëÿåò ñïðàâî÷íóþ èíôîðìàöèþ î êîìàíäàõ ReactOS.\n\
+HISTORY Ñïèñîê çàïóùåííûõ êîìàíä\n\
+IF Îïåðàòîð óñëîâíîãî âûïîëíåíèÿ êîìàíä â ïàêåòíîì ôàéëå.\n\
+LABEL Ñîçäàíèå, èçìåíåíèå è óäàëåíèå ìåòîê òîìà.\n\
+MD Ñîçäàíèå êàòàëîãà.\n\
+MKDIR Ñîçäàíèå êàòàëîãà.\n\
+MOVE Ïåðåìåùåíèå ôàéëîâ è ïåðåèìåíîâàíèå ôàéëîâ è êàòàëîãîâ\n\
+PATH Âûâîä èëè çàäàíèå ïóòè ïîèñêà èñïîëíÿåìûõ ôàéëîâ.\n\
+PAUSE Ïðèîñòàíîâêà âûïîëíåíèÿ ïàêåòíîãî ôàéëà.\n\
+POPD Âîñòòàíàâëèâàåò ïðåäûäóùåå çíà÷åíèå òåêóùåé äèðåêòîðèè ñîõðàíåííîå êîìàíäîé\n\
+ PUSHD.\n\
+PROMPT Èçìåíåíèå ïðèãëàøåíèÿ êîìàíäíîé ñòðîêè.\n\
+PUSHD Ñîõðàíÿåò òåêóùóþ äèðåêòîðèþ, à ïîòîì ìåíÿåò å¸.\n\
+RD Óäàëåíèå êàòàëîãà.\n\
+REM Çàïèñûâàåò êîììåíòàðèè (çàìå÷åíèÿ) â ïàêåòíûõ ôàéëàõ.\n\
+REN Ïåðåèìåíîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ èëè êàòàëîãîâ.\n\
+RENAME Ïåðåèìåíîâàíèå îäíîãî èëè íåñêîëüêèõ ôàéëîâ èëè êàòàëîãîâ.\n\
+RMDIR Óäàëåíèå êàòàëîãà.\n\
+SCREEN Ïåðåìåùåíèå êóðñîðà è âûâîä òåêñòà.\n\
+SET Âûâîä, çàäàíèå è óäàëåíèå ïåðåìåííûõ ñðåäû.\n\
+SHIFT Èçìåíåíèå ñîäåðæèìîãî (ñäâèã) ïîäñòàâëÿåìûõ ïàðàìåòðîâ äëÿ ïàêåòíîãî ôàéëà\n"
+STRING_HELP2, "START Îòêðûâàåò îòäåëüíîå îêíî äëÿ çàïóñêà óêàçàííûõ êîìàíä èëè ïðîãðàìì.\n\
+ Âûïîëíÿåò êîìàíäó.\n\
+TIME Âûâîä èëè èçìåíåíèå âðåìåíè.\n\
+TIMER Ñåêóíäîìåð.\n\
+TITLE Èçìåíåíèå çàãîëîâêà îêíà êîìàíäíîé ñòðîêè.\n\
+TYPE Âûâîä ñîäåðæèìîãî îäíîãî èëè íåñêîëüêèõ òåêñòîâûõ ôàéëîâ.\n\
+VER Âûâîä âåðñèè ÎÑ.\n\
+VERIFY Âêëþ÷åíèå èëè îòêëþ÷åíèå ðåæèìà ïðîâåðêè ïðàâèëüíîñòè çàïèñè ôàéëîâ\n\
+ íà äèñê.\n\
+VOL Âûâîäèò ìåòêó òîìà è ñåðèéíûé íîìåð.\n"
+
+
+STRING_CHOICE_OPTION, "YN"
+STRING_COPY_OPTION, "YNA"
+
+
+STRING_ALIAS_ERROR, "Êîìàíäíàÿ ñòðîêà ñëèøêîì äëèííàÿ ïîñëå ðàçâ¸ðòûâàíèÿ ïñåâäîíèìîâ!\n"
+STRING_BATCH_ERROR, "Îøèáêà îòêðûòèÿ êîìàíäíîãî ôàéëà\n"
+STRING_CHCP_ERROR1, "Òåêóùàÿ êîäîâàÿ ñòðàíèöà: %u\n"
+STRING_CHCP_ERROR4, "Îøèáî÷íàÿ êîäîâàÿ ñòðàíèöà\n"
+STRING_CHOICE_ERROR, "Îøèáî÷íûé ïàðàìåòð. Îæèäàåòñÿ ôîðìàò: /C[:]ïàðàìåòðû"
+STRING_CHOICE_ERROR_TXT, "Îøèáî÷íûé ïàðàìåòð. Îæèäàåòñÿ ôîðìàò: /T[:]c,nn"
+STRING_CHOICE_ERROR_OPTION, "Îøèáî÷íûé ïàðàìåòð: %s"
+STRING_MD_ERROR, "Ïîäêàòàëîã èëè ôàéë óæå ñóùåñòâóåò.\n"
+STRING_MD_ERROR2, "Ïóòü ê íîâîìó êàòàëîãó íå ñóùåñòâóåò.\n"
+STRING_CMD_ERROR1, "Íå ìîãó ïåðåíàïðàâèòü ââîä èç ôàéëà %s\n"
+STRING_CMD_ERROR2, "Îøèáêà ñîçäàíèÿ âðåìåííîãî ôàéëà äëÿ pipe-äàííûõ\n"
+STRING_CMD_ERROR3, "Íå ìîãó ïåðåíàïðàâèòü â ôàéë %s\n"
+STRING_CMD_ERROR4, "Çàïóñê %s...\n"
+STRING_CMD_ERROR5, "Çàïóñê cmdexit.bat...\n"
+STRING_COLOR_ERROR1, "Îäèíàêîâûå öâåòà! (Öâåòà ôîíà è òåêñòà íå ìîãóò áûòü îäèíàêîâûìè)"
+STRING_COLOR_ERROR2, "îøèáêà â óêàçàíèè öâåòà"
+STRING_COLOR_ERROR3, "Öâåò %x\n"
+STRING_COLOR_ERROR4, "Îäèíàêîâûå öâåòà!"
+STRING_CONSOLE_ERROR, "Íåèçâåñòíàÿ îøèáêà: %d\n"
+STRING_COPY_ERROR1, "Îøèáêà: Íå ìîãó îòêðûòü èñòî÷íèê - %s!\n"
+STRING_COPY_ERROR2, "Îøèáêà: Íå ìîãó êîïèðîâàòü â ñåáÿ!\n"
+STRING_COPY_ERROR3, "Îøèáêà çàïèñè!\n"
+STRING_COPY_ERROR4, "Îøèáêà: Not implemented yet!\n"
+STRING_DATE_ERROR, "Íåïðàâèëüíàÿ äàòà."
+STRING_DEL_ERROR5, "Ôàéë %s áóäåò óäàë¸í! "
+STRING_DEL_ERROR6, "Âû óâåðåíû (Y/N)?"
+STRING_DEL_ERROR7, "Óäàëåíèå: %s\n"
+STRING_ERROR_ERROR1, "Íåèçâåñòíàÿ îøèáêà! Êîä îøèáêè: 0x%lx\n"
+STRING_ERROR_ERROR2, "Ñèíòàêñè÷åñêàÿ îøèáêà"
+STRING_FOR_ERROR1, "'in' îòñóòñòâóåò â êîìàíäå for."
+STRING_FOR_ERROR2, "ñêîáîê íåîáíàðóæåíî."
+STRING_FOR_ERROR3, "'do' îòñóòñâóåò."
+STRING_FOR_ERROR4, "íåò êîìàíäû ïîñëå 'do'."
+STRING_FREE_ERROR1, "Íåïðàâèëüíîå èìÿ äèñêà"
+STRING_FREE_ERROR2, "unlabeled"
+STRING_GOTO_ERROR1, "Íå îïðåäåëåíà ìåòêà äëÿ GOTO"
+STRING_GOTO_ERROR2, "Ìåòêà '%s' íå íàéäåíà\n"
+
+STRING_MOVE_ERROR1, "[OK]\n"
+STRING_MOVE_ERROR2, "[Îøèáêà]\n"
+
+STRING_REN_ERROR1, "Âûïîëíåíèå MoveFile() áûëî íåóñïåøíûì. Îøèáêà: %lu\n"
+
+STRING_START_ERROR1, "Íà äàííûé ìîìåíò íåò ïîääåðæêè ïàêåòíûõ ôàéëîâ!"
+
+STRING_TIME_ERROR1, "Íåïðàâèëüíîå âðåìÿ."
+
+STRING_TYPE_ERROR1, "Íåïðàâèëüíûé ïàðàìåòð '/%s'\n"
+
+STRING_WINDOW_ERROR1, "îêíî íå íàéäåíî"
+
+
+STRING_ERROR_PARAMETERF_ERROR, "Íåêîððåêòíûé ôîðìàò ïàðàìåòðà - %c\n"
+STRING_ERROR_INVALID_SWITCH, "Íåâåðíûàÿ îïöèÿ - /%c\n"
+STRING_ERROR_TOO_MANY_PARAMETERS, "Ñëèøêîì ìíîãî ïàðàìåòðîâ - %s\n"
+STRING_ERROR_PATH_NOT_FOUND, "Ïóòü íå íàéäåí\n"
+STRING_ERROR_FILE_NOT_FOUND, "Ôàéë íå íàéäåí\n"
+STRING_ERROR_REQ_PARAM_MISSING, "Îòñóòñòâóåò íåîáõîäèìûé ïàðàìåòð\n"
+STRING_ERROR_INVALID_DRIVE, "Îøèáî÷íîå îïðåäåëåíèå äèñêà\n"
+STRING_ERROR_INVALID_PARAM_FORMAT, "Îøèáî÷íûé ôîðìàò ïàðàìåòðà - %s\n"
+STRING_ERROR_BADCOMMAND, "Íåïðàâèëüíàÿ êîìàíäà èëè èìÿ ôàéëà\n"
+STRING_ERROR_OUT_OF_MEMORY, "Íåõâàòêà ïàìÿòè.\n"
+STRING_ERROR_CANNOTPIPE, "Îøèáêà! Íåâîçìîæíî èñïîëüçîâàòü pipe! Íåâîçìîæíî ñîçäàòü âðåìåííûé ôàéë!\n"
+STRING_ERROR_D_PAUSEMSG, "Äëÿ ïðîäîëæåíèÿ íàæìèòå ëþáóþ êëàâèøó . . ."
+STRING_ERROR_DRIVER_NOT_READY, "Óñòðîéñòâî íå ãîòîâî"
+
+STRING_PATH_ERROR, "CMD: Íå â ñðåäå îêðóæåíèÿ '%s'\n"
+
+STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter"
+STRING_VERSION_RUNVER, " çàïóùåí íà %s"
+STRING_COPY_FILE , " %d ôàéë(îâ) ñêîïèðîâàíî\n"
+STRING_DELETE_WIPE, "wiped"
+STRING_FOR_ERROR, "íåïðàâèëüíîå çàäàíèå ïåðåìåííîé."
+STRING_SCREEN_COL, "íåïðàâèëüíîå çíà÷åíèå äëÿ êîë"
+STRING_SCREEN_ROW, "íåïðàâèëüíîå çíà÷åíèå äëÿ ñòð"
+STRING_TIMER_TIME "Timer %d is %s: "
+
+STRING_INVALID_OPERAND, "Íåâåðíûé îïåðàíä."
+STRING_EXPECTED_CLOSE_PAREN, "Îæèäàåòñÿ ')'."
+STRING_EXPECTED_NUMBER_OR_VARIABLE,"Îæèäàåòñÿ ÷èñëî èëè íàçâàíèå ïåðåìåííîé."
+STRING_SYNTAX_COMMAND_INCORRECT, "Íåêîððåêòíûé ñèíòàêñèñ êîìàíäû."
+
+}
--- /dev/null
+/*
+ * ALIAS.C - alias administration module.
+ *
+ *
+ * History:
+ *
+ * 02/02/1996 (Oliver Mueller)
+ * started.
+ *
+ * 02/03/1996 (Oliver Mueller)
+ * Added sorting algorithm and case sensitive substitution by using
+ * partstrupr().
+ *
+ * 27 Jul 1998 John P. Price
+ * added config.h include
+ * added ifdef's to disable aliases
+ *
+ * 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed crash when removing an alias in DeleteAlias().
+ * Added help text ("/?").
+ *
+ * 14-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Clean up and Unicode safe!
+ *
+ * 24-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Redirection safe!
+ *
+ * 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef FEATURE_ALIASES
+
+typedef struct tagALIAS
+{
+ struct tagALIAS *next;
+ LPTSTR lpName;
+ LPTSTR lpSubst;
+ DWORD dwUsed;
+} ALIAS, *LPALIAS;
+
+
+static LPALIAS lpFirst = NULL;
+static LPALIAS lpLast = NULL;
+static DWORD dwUsed = 0;
+
+
+/* module internal functions */
+/* strlwr only for first word in string */
+static VOID
+partstrlwr (LPTSTR str)
+{
+ LPTSTR c = str;
+ while (*c && !_istspace (*c) && *c != _T('='))
+ {
+ *c = _totlower (*c);
+ c++;
+ }
+}
+
+
+static VOID
+PrintAlias (VOID)
+{
+ LPALIAS ptr = lpFirst;
+ while (ptr)
+ {
+ ConOutPrintf (_T("%s=%s\n"), ptr->lpName, ptr->lpSubst);
+ ptr = ptr->next;
+ }
+}
+
+
+static VOID
+DeleteAlias (LPTSTR pszName)
+{
+ LPALIAS ptr = lpFirst;
+ LPALIAS prev = NULL;
+
+ while (ptr)
+ {
+ if (!_tcsicmp (ptr->lpName, pszName))
+ {
+ if (prev)
+ prev->next = ptr->next;
+ else
+ lpFirst = ptr->next;
+ free (ptr->lpName);
+ free (ptr->lpSubst);
+ free (ptr);
+ return;
+ }
+ prev = ptr;
+ ptr = ptr->next;
+ }
+}
+
+
+static VOID
+AddAlias (LPTSTR name, LPTSTR subst)
+{
+ LPALIAS ptr = lpFirst;
+ LPALIAS prev, entry;
+ LPTSTR s;
+
+ while (ptr)
+ {
+ if (!_tcsicmp (ptr->lpName, name))
+ {
+ s = (LPTSTR)malloc ((_tcslen (subst) + 1)*sizeof(TCHAR));
+ if (!s)
+ {
+ error_out_of_memory ();
+ return;
+ }
+
+ free (ptr->lpSubst);
+ ptr->lpSubst = s;
+ _tcscpy (ptr->lpSubst, subst);
+ return;
+ }
+ ptr = ptr->next;
+ }
+
+ ptr = (LPALIAS)malloc (sizeof (ALIAS));
+ if (!ptr)
+ return;
+
+ ptr->next = 0;
+
+ ptr->lpName = (LPTSTR)malloc ((_tcslen (name) + 1)*sizeof(TCHAR));
+ if (!ptr->lpName)
+ {
+ error_out_of_memory ();
+ free (ptr);
+ return;
+ }
+ _tcscpy (ptr->lpName, name);
+
+ ptr->lpSubst = (LPTSTR)malloc ((_tcslen (subst) + 1)*sizeof(TCHAR));
+ if (!ptr->lpSubst)
+ {
+ error_out_of_memory ();
+ free (ptr->lpName);
+ free (ptr);
+ return;
+ }
+ _tcscpy (ptr->lpSubst, subst);
+
+ /* it's necessary for recursive substitution */
+ partstrlwr (ptr->lpSubst);
+
+ ptr->dwUsed = 0;
+
+ /* Alias table must be sorted!
+ * Here a little example:
+ * command line = "ls -c"
+ * If the entries are
+ * ls=dir
+ * ls -c=ls /w
+ * command line will be expanded to "dir -c" which is not correct.
+ * If the entries are sortet as
+ * ls -c=ls /w
+ * ls=dir
+ * it will be expanded to "dir /w" which is a valid DOS command.
+ */
+ entry = lpFirst;
+ prev = 0;
+ while (entry)
+ {
+ if (_tcsicmp (ptr->lpName, entry->lpName) > 0)
+ {
+ if (prev)
+ {
+ prev->next = ptr;
+ ptr->next = entry;
+ }
+ else
+ {
+ ptr->next = entry;
+ lpFirst = ptr;
+ }
+ return;
+ }
+ prev = entry;
+ entry = entry->next;
+ }
+
+ /* The new entry is the smallest (or the first) and must be
+ * added to the end of the list.
+ */
+ if (!lpFirst)
+ lpFirst = ptr;
+ else
+ lpLast->next = ptr;
+ lpLast = ptr;
+
+ return;
+}
+
+
+VOID InitializeAlias (VOID)
+{
+ lpFirst = NULL;
+ lpLast = NULL;
+ dwUsed = 0;
+}
+
+VOID DestroyAlias (VOID)
+{
+ if (lpFirst == NULL)
+ return;
+
+ while (lpFirst->next != NULL)
+ {
+ lpLast = lpFirst;
+ lpFirst = lpLast->next;
+
+ free (lpLast->lpName);
+ free (lpLast->lpSubst);
+ free (lpLast);
+ }
+
+ free (lpFirst->lpName);
+ free (lpFirst->lpSubst);
+ free (lpFirst);
+
+ lpFirst = NULL;
+ lpLast = NULL;
+ dwUsed = 0;
+}
+
+/* specified routines */
+VOID ExpandAlias (LPTSTR cmd, INT maxlen)
+{
+ unsigned n = 0,
+ m,
+ i,
+ len;
+ short d = 1;
+ LPALIAS ptr = lpFirst;
+
+ dwUsed++;
+ if (dwUsed == 0)
+ {
+ while (ptr)
+ ptr->dwUsed = 0;
+ ptr = lpFirst;
+ dwUsed = 1;
+ }
+
+ /* skipping white spaces */
+ while (_istspace (cmd[n]))
+ n++;
+
+ partstrlwr (&cmd[n]);
+
+ if (!_tcsncmp (&cmd[n], _T("NOALIAS"), 7) &&
+ (_istspace (cmd[n + 7]) || cmd[n + 7] == _T('\0')))
+ {
+ memmove (cmd, &cmd[n + 7], (_tcslen (&cmd[n + 7]) + 1) * sizeof (TCHAR));
+ return;
+ }
+
+ /* substitution loop */
+ while (d)
+ {
+ d = 0;
+ while (ptr)
+ {
+ len = _tcslen (ptr->lpName);
+ if (!_tcsncmp (&cmd[n], ptr->lpName, len) &&
+ (_istspace (cmd[n + len]) || cmd[n + len] == _T('\0')) &&
+ ptr->dwUsed != dwUsed)
+ {
+ m = _tcslen (ptr->lpSubst);
+ if ((int)(_tcslen (cmd) - len + m - n) > maxlen)
+ {
+ ConErrResPuts(STRING_ALIAS_ERROR);
+
+ /* the parser won't cause any problems with an empty line */
+ cmd[0] = _T('\0');
+ }
+ else
+ {
+ memmove (&cmd[m], &cmd[n + len], (_tcslen(&cmd[n + len]) + 1) * sizeof (TCHAR));
+ for (i = 0; i < m; i++)
+ cmd[i] = ptr->lpSubst[i];
+ ptr->dwUsed = dwUsed;
+ /* whitespaces are removed! */
+ n = 0;
+ d = 1;
+ }
+ }
+ ptr = ptr->next;
+ }
+ }
+}
+
+
+INT CommandAlias (LPTSTR cmd, LPTSTR param)
+{
+ LPTSTR ptr;
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_ALIAS_HELP);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ if (param[0] == _T('\0'))
+ {
+ PrintAlias ();
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ /* error if no '=' found */
+ if ((ptr = _tcschr (param, _T('='))) == 0)
+ {
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ /* Split rest into name and substitute */
+ *ptr++ = _T('\0');
+
+ partstrlwr (param);
+
+ if (ptr[0] == _T('\0'))
+ DeleteAlias (param);
+ else
+ AddAlias (param, ptr);
+
+ return 0;
+}
+#endif
--- /dev/null
+/*
+ * ATTRIB.C - attrib internal command.
+ *
+ *
+ * History:
+ *
+ * 04-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * started
+ *
+ * 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * implementation works, except recursion ("attrib /s").
+ *
+ * 05-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * major rewrite.
+ * fixed recursion ("attrib /s").
+ * started directory support ("attrib /s /d").
+ * updated help text.
+ *
+ * 14-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode ready!
+ *
+ * 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Redirection ready!
+ *
+ * 21-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added check for invalid filenames.
+ *
+ * 23-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added handling of multiple filenames.
+ *
+ * 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_ATTRIB
+
+
+static VOID
+PrintAttribute (LPTSTR pszPath, LPTSTR pszFile, BOOL bRecurse)
+{
+ WIN32_FIND_DATA findData;
+ HANDLE hFind;
+ TCHAR szFullName[MAX_PATH];
+ LPTSTR pszFileName;
+
+ /* prepare full file name buffer */
+ _tcscpy (szFullName, pszPath);
+ pszFileName = szFullName + _tcslen (szFullName);
+
+ /* display all subdirectories */
+ if (bRecurse)
+ {
+ /* append file name */
+ _tcscpy (pszFileName, pszFile);
+
+ hFind = FindFirstFile (szFullName, &findData);
+ if (hFind == INVALID_HANDLE_VALUE)
+ {
+ ErrorMessage (GetLastError (), pszFile);
+ return;
+ }
+
+ do
+ {
+ if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
+ continue;
+
+ if (!_tcscmp (findData.cFileName, _T(".")) ||
+ !_tcscmp (findData.cFileName, _T("..")))
+ continue;
+
+ _tcscpy (pszFileName, findData.cFileName);
+ _tcscat (pszFileName, _T("\\"));
+ PrintAttribute (szFullName, pszFile, bRecurse);
+ }
+ while (FindNextFile (hFind, &findData));
+ FindClose (hFind);
+ }
+
+ /* append file name */
+ _tcscpy (pszFileName, pszFile);
+
+ /* display current directory */
+ hFind = FindFirstFile (szFullName, &findData);
+ if (hFind == INVALID_HANDLE_VALUE)
+ {
+ ErrorMessage (GetLastError (), pszFile);
+ return;
+ }
+
+ do
+ {
+ if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ continue;
+
+ _tcscpy (pszFileName, findData.cFileName);
+
+ ConOutPrintf (_T("%c %c%c%c %s\n"),
+ (findData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) ? _T('A') : _T(' '),
+ (findData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) ? _T('S') : _T(' '),
+ (findData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ? _T('H') : _T(' '),
+ (findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? _T('R') : _T(' '),
+ szFullName);
+ }
+ while (FindNextFile (hFind, &findData));
+ FindClose (hFind);
+}
+
+
+static VOID
+ChangeAttribute (LPTSTR pszPath, LPTSTR pszFile, DWORD dwMask,
+ DWORD dwAttrib, BOOL bRecurse, BOOL bDirectories)
+{
+ WIN32_FIND_DATA findData;
+ HANDLE hFind;
+ DWORD dwAttribute;
+ TCHAR szFullName[MAX_PATH];
+ LPTSTR pszFileName;
+
+
+ /* prepare full file name buffer */
+ _tcscpy (szFullName, pszPath);
+ pszFileName = szFullName + _tcslen (szFullName);
+
+ /* change all subdirectories */
+ if (bRecurse)
+ {
+ /* append file name */
+ _tcscpy (pszFileName, _T("*.*"));
+
+ hFind = FindFirstFile (szFullName, &findData);
+ if (hFind == INVALID_HANDLE_VALUE)
+ {
+ ErrorMessage (GetLastError (), pszFile);
+ nErrorLevel = 1;
+ return;
+ }
+
+ do
+ {
+ if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+ if (!_tcscmp (findData.cFileName, _T(".")) ||
+ !_tcscmp (findData.cFileName, _T("..")))
+ continue;
+
+ _tcscpy (pszFileName, findData.cFileName);
+ _tcscat (pszFileName, _T("\\"));
+
+ ChangeAttribute (szFullName, pszFile, dwMask,
+ dwAttrib, bRecurse, bDirectories);
+ }
+ }
+ while (FindNextFile (hFind, &findData));
+ FindClose (hFind);
+ }
+
+ /* append file name */
+ _tcscpy (pszFileName, pszFile);
+
+ hFind = FindFirstFile (szFullName, &findData);
+ if (hFind == INVALID_HANDLE_VALUE)
+ {
+ ErrorMessage (GetLastError (), pszFile);
+ nErrorLevel = 1;
+ return;
+ }
+
+ do
+ {
+ if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ continue;
+
+ _tcscpy (pszFileName, findData.cFileName);
+
+ dwAttribute = GetFileAttributes (szFullName);
+
+ if (dwAttribute != 0xFFFFFFFF)
+ {
+ dwAttribute = (dwAttribute & ~dwMask) | dwAttrib;
+ SetFileAttributes (szFullName, dwAttribute);
+ }
+ }
+ while (FindNextFile (hFind, &findData));
+ FindClose (hFind);
+}
+
+
+INT CommandAttrib (LPTSTR cmd, LPTSTR param)
+{
+ LPTSTR *arg;
+ INT argc, i;
+ TCHAR szPath[MAX_PATH];
+ TCHAR szFileName [MAX_PATH];
+ BOOL bRecurse = FALSE;
+ BOOL bDirectories = FALSE;
+ DWORD dwAttrib = 0;
+ DWORD dwMask = 0;
+
+ /* initialize strings */
+ szPath[0] = _T('\0');
+ szFileName[0] = _T('\0');
+
+ /* print help */
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_ATTRIB_HELP);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ /* build parameter array */
+ arg = split (param, &argc, FALSE);
+
+ /* check for options */
+ for (i = 0; i < argc; i++)
+ {
+ if (_tcsicmp (arg[i], _T("/s")) == 0)
+ bRecurse = TRUE;
+ else if (_tcsicmp (arg[i], _T("/d")) == 0)
+ bDirectories = TRUE;
+ }
+
+ /* create attributes and mask */
+ for (i = 0; i < argc; i++)
+ {
+ if (*arg[i] == _T('+'))
+ {
+ if (_tcslen (arg[i]) != 2)
+ {
+ error_invalid_parameter_format (arg[i]);
+ freep (arg);
+ return -1;
+ }
+
+ switch ((TCHAR)_totupper (arg[i][1]))
+ {
+ case _T('A'):
+ dwMask |= FILE_ATTRIBUTE_ARCHIVE;
+ dwAttrib |= FILE_ATTRIBUTE_ARCHIVE;
+ break;
+
+ case _T('H'):
+ dwMask |= FILE_ATTRIBUTE_HIDDEN;
+ dwAttrib |= FILE_ATTRIBUTE_HIDDEN;
+ break;
+
+ case _T('R'):
+ dwMask |= FILE_ATTRIBUTE_READONLY;
+ dwAttrib |= FILE_ATTRIBUTE_READONLY;
+ break;
+
+ case _T('S'):
+ dwMask |= FILE_ATTRIBUTE_SYSTEM;
+ dwAttrib |= FILE_ATTRIBUTE_SYSTEM;
+ break;
+
+ default:
+ error_invalid_parameter_format (arg[i]);
+ freep (arg);
+ return -1;
+ }
+ }
+ else if (*arg[i] == _T('-'))
+ {
+ if (_tcslen (arg[i]) != 2)
+ {
+ error_invalid_parameter_format (arg[i]);
+ freep (arg);
+ return -1;
+ }
+
+ switch ((TCHAR)_totupper (arg[i][1]))
+ {
+ case _T('A'):
+ dwMask |= FILE_ATTRIBUTE_ARCHIVE;
+ dwAttrib &= ~FILE_ATTRIBUTE_ARCHIVE;
+ break;
+
+ case _T('H'):
+ dwMask |= FILE_ATTRIBUTE_HIDDEN;
+ dwAttrib &= ~FILE_ATTRIBUTE_HIDDEN;
+ break;
+
+ case _T('R'):
+ dwMask |= FILE_ATTRIBUTE_READONLY;
+ dwAttrib &= ~FILE_ATTRIBUTE_READONLY;
+ break;
+
+ case _T('S'):
+ dwMask |= FILE_ATTRIBUTE_SYSTEM;
+ dwAttrib &= ~FILE_ATTRIBUTE_SYSTEM;
+ break;
+
+ default:
+ error_invalid_parameter_format (arg[i]);
+ freep (arg);
+ return -1;
+ }
+ }
+ }
+
+ if (argc == 0)
+ {
+ DWORD len;
+
+ len = GetCurrentDirectory (MAX_PATH, szPath);
+ if (szPath[len-1] != _T('\\'))
+ {
+ szPath[len] = _T('\\');
+ szPath[len + 1] = 0;
+ }
+ _tcscpy (szFileName, _T("*.*"));
+ PrintAttribute (szPath, szFileName, bRecurse);
+ freep (arg);
+ return 0;
+ }
+
+ /* get full file name */
+ for (i = 0; i < argc; i++)
+ {
+ if ((*arg[i] != _T('+')) && (*arg[i] != _T('-')) && (*arg[i] != _T('/')))
+ {
+ LPTSTR p;
+ GetFullPathName (arg[i], MAX_PATH, szPath, NULL);
+ p = _tcsrchr (szPath, _T('\\')) + 1;
+ _tcscpy (szFileName, p);
+ *p = _T('\0');
+
+ if (dwMask == 0)
+ PrintAttribute (szPath, szFileName, bRecurse);
+ else
+ ChangeAttribute (szPath, szFileName, dwMask,
+ dwAttrib, bRecurse, bDirectories);
+ }
+ }
+
+ freep (arg);
+ return 0;
+}
+
+#endif /* INCLUDE_CMD_ATTRIB */
--- /dev/null
+/*
+ * BATCH.C - batch file processor for CMD.EXE.
+ *
+ *
+ * History:
+ *
+ * ??/??/?? (Evan Jeffrey)
+ * started.
+ *
+ * 15 Jul 1995 (Tim Norman)
+ * modes and bugfixes.
+ *
+ * 08 Aug 1995 (Matt Rains)
+ * i have cleaned up the source code. changes now bring this
+ * source into guidelines for recommended programming practice.
+ *
+ * i have added some constants to help making changes easier.
+ *
+ * 29 Jan 1996 (Steffan Kaiser)
+ * made a few cosmetic changes
+ *
+ * 05 Feb 1996 (Tim Norman)
+ * changed to comply with new first/rest calling scheme
+ *
+ * 14 Jun 1997 (Steffen Kaiser)
+ * bug fixes. added error level expansion %?. ctrl-break handling
+ *
+ * 16 Jul 1998 (Hans B Pufal)
+ * Totally reorganised in conjunction with COMMAND.C (cf) to
+ * implement proper BATCH file nesting and other improvements.
+ *
+ * 16 Jul 1998 (John P Price <linux-guru@gcfl.net>)
+ * Seperated commands into individual files.
+ *
+ * 19 Jul 1998 (Hans B Pufal) [HBP_001]
+ * Preserve state of echo flag across batch calls.
+ *
+ * 19 Jul 1998 (Hans B Pufal) [HBP_002]
+ * Implementation of FOR command
+ *
+ * 20-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added error checking after malloc calls
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 02-Aug-1998 (Hans B Pufal) [HBP_003]
+ * Fixed bug in ECHO flag restoration at exit from batch file
+ *
+ * 26-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Replaced CRT io functions by Win32 io functions.
+ * Unicode safe!
+ *
+ * 23-Feb-2001 (Carl Nettelblad <cnettel@hem.passagen.es>)
+ * Fixes made to get "for" working.
+ *
+ * 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+/* The stack of current batch contexts.
+ * NULL when no batch is active
+ */
+LPBATCH_CONTEXT bc = NULL;
+
+BOOL bEcho = TRUE; /* The echo flag */
+
+
+
+/* Buffer for reading Batch file lines */
+TCHAR textline[BATCH_BUFFSIZE];
+
+
+/*
+ * Returns a pointer to the n'th parameter of the current batch file.
+ * If no such parameter exists returns pointer to empty string.
+ * If no batch file is current, returns NULL
+ *
+ */
+
+LPTSTR FindArg (INT n)
+{
+ LPTSTR pp;
+
+#ifdef _DEBUG
+ DebugPrintf (_T("FindArg: (%d)\n"), n);
+#endif
+
+ if (bc == NULL)
+ return NULL;
+
+ n += bc->shiftlevel;
+ pp = bc->params;
+
+ /* Step up the strings till we reach the end */
+ /* or the one we want */
+ while (*pp && n--)
+ pp += _tcslen (pp) + 1;
+
+ return pp;
+}
+
+
+/*
+ * Batch_params builds a parameter list in newlay allocated memory.
+ * The parameters consist of null terminated strings with a final
+ * NULL character signalling the end of the parameters.
+ *
+*/
+
+LPTSTR BatchParams (LPTSTR s1, LPTSTR s2)
+{
+ LPTSTR dp = (LPTSTR)malloc ((_tcslen(s1) + _tcslen(s2) + 3) * sizeof (TCHAR));
+
+ /* JPP 20-Jul-1998 added error checking */
+ if (dp == NULL)
+ {
+ error_out_of_memory();
+ return NULL;
+ }
+
+ if (s1 && *s1)
+ {
+ s1 = _stpcpy (dp, s1);
+ *s1++ = _T('\0');
+ }
+ else
+ s1 = dp;
+
+ while (*s2)
+ {
+ if (_istspace (*s2) || _tcschr (_T(",;"), *s2))
+ {
+ *s1++ = _T('\0');
+ s2++;
+ while (*s2 && _tcschr (_T(" ,;"), *s2))
+ s2++;
+ continue;
+ }
+
+ if ((*s2 == _T('"')) || (*s2 == _T('\'')))
+ {
+ TCHAR st = *s2;
+
+ do
+ *s1++ = *s2++;
+ while (*s2 && (*s2 != st));
+ }
+
+ *s1++ = *s2++;
+ }
+
+ *s1++ = _T('\0');
+ *s1 = _T('\0');
+
+ return dp;
+}
+
+
+/*
+ * If a batch file is current, exits it, freeing the context block and
+ * chaining back to the previous one.
+ *
+ * If no new batch context is found, sets ECHO back ON.
+ *
+ * If the parameter is non-null or not empty, it is printed as an exit
+ * message
+ */
+
+VOID ExitBatch (LPTSTR msg)
+{
+#ifdef _DEBUG
+ DebugPrintf (_T("ExitBatch: (\'%s\')\n"), msg);
+#endif
+
+ if (bc != NULL)
+ {
+ LPBATCH_CONTEXT t = bc;
+
+ if (bc->hBatchFile)
+ {
+ CloseHandle (bc->hBatchFile);
+ bc->hBatchFile = INVALID_HANDLE_VALUE;
+ }
+
+ if (bc->params)
+ free(bc->params);
+
+ if (bc->forproto)
+ free(bc->forproto);
+
+ if (bc->ffind)
+ free(bc->ffind);
+
+ /* Preserve echo state across batch calls */
+ bEcho = bc->bEcho;
+
+ bc = bc->prev;
+ free(t);
+ }
+
+ if (msg && *msg)
+ ConOutPrintf (_T("%s\n"), msg);
+}
+
+
+/*
+ * Start batch file execution
+ *
+ * The firstword parameter is the full filename of the batch file.
+ *
+ */
+
+BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param)
+{
+ HANDLE hFile;
+ SetLastError(0);
+ hFile = CreateFile (fullname, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |
+ FILE_FLAG_SEQUENTIAL_SCAN, NULL);
+
+#ifdef _DEBUG
+ DebugPrintf (_T("Batch: (\'%s\', \'%s\', \'%s\') hFile = %x\n"),
+ fullname, firstword, param, hFile);
+#endif
+
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ ConErrResPuts(STRING_BATCH_ERROR);
+ return FALSE;
+ }
+
+ /* Kill any and all FOR contexts */
+ while (bc && bc->forvar)
+ ExitBatch (NULL);
+
+ if (bc == NULL)
+ {
+ /* No curent batch file, create a new context */
+ LPBATCH_CONTEXT n = (LPBATCH_CONTEXT)malloc (sizeof(BATCH_CONTEXT));
+
+ if (n == NULL)
+ {
+ error_out_of_memory ();
+ return FALSE;
+ }
+
+ n->prev = bc;
+ bc = n;
+ bc->In[0] = _T('\0');
+ bc->Out[0] = _T('\0');
+ bc->Err[0] = _T('\0');
+ }
+ else if (bc->hBatchFile != INVALID_HANDLE_VALUE)
+ {
+ /* Then we are transferring to another batch */
+ CloseHandle (bc->hBatchFile);
+ bc->hBatchFile = INVALID_HANDLE_VALUE;
+ free (bc->params);
+ }
+
+ bc->hBatchFile = hFile;
+ SetFilePointer (bc->hBatchFile, 0, NULL, FILE_BEGIN);
+ bc->bEcho = bEcho; /* Preserve echo across batch calls */
+ bc->shiftlevel = 0;
+
+ bc->ffind = NULL;
+ bc->forvar = _T('\0');
+ bc->forproto = NULL;
+ bc->params = BatchParams (firstword, param);
+
+#ifdef _DEBUG
+ DebugPrintf (_T("Batch: returns TRUE\n"));
+#endif
+
+ return TRUE;
+}
+
+VOID AddBatchRedirection(TCHAR * ifn, TCHAR * ofn, TCHAR * efn)
+{
+ if(!bc)
+ return;
+ if(_tcslen(ifn))
+ _tcscpy(bc->In,ifn);
+ if(_tcslen(ofn))
+ _tcscpy(bc->Out,ofn);
+ if(_tcslen(efn))
+ _tcscpy(bc->Err,efn);
+
+}
+
+/*
+ * Read and return the next executable line form the current batch file
+ *
+ * If no batch file is current or no further executable lines are found
+ * return NULL.
+ *
+ * Here we also look out for FOR bcontext structures which trigger the
+ * FOR expansion code.
+ *
+ * Set eflag to 0 if line is not to be echoed else 1
+ */
+
+LPTSTR ReadBatchLine (LPBOOL bLocalEcho)
+{
+ LPTSTR first;
+ LPTSTR ip;
+
+ /* No batch */
+ if (bc == NULL)
+ return NULL;
+
+#ifdef _DEBUG
+ DebugPrintf (_T("ReadBatchLine ()\n"));
+#endif
+
+ while (1)
+ {
+ /* User halt */
+ if (CheckCtrlBreak (BREAK_BATCHFILE))
+ {
+ while (bc)
+ ExitBatch (NULL);
+ return NULL;
+ }
+
+ /* No batch */
+ if (bc == NULL)
+ return NULL;
+
+ /* If its a FOR context... */
+ if (bc->forvar)
+ {
+ LPTSTR sp = bc->forproto; /* pointer to prototype command */
+ LPTSTR dp = textline; /* Place to expand protoype */
+ LPTSTR fv = FindArg (0); /* Next list element */
+
+ /* End of list so... */
+ if ((fv == NULL) || (*fv == _T('\0')))
+ {
+ /* just exit this context */
+ ExitBatch (NULL);
+ continue;
+ }
+
+ if (_tcscspn (fv, _T("?*")) == _tcslen (fv))
+ {
+ /* element is wild file */
+ bc->shiftlevel++; /* No use it and shift list */
+ }
+ else
+ {
+ /* Wild file spec, find first (or next) file name */
+ if (bc->ffind)
+ {
+ /* First already done so do next */
+
+ fv = FindNextFile (bc->hFind, bc->ffind) ? bc->ffind->cFileName : NULL;
+ }
+ else
+ {
+ /* For first find, allocate a find first block */
+ if ((bc->ffind = (LPWIN32_FIND_DATA)malloc (sizeof (WIN32_FIND_DATA))) == NULL)
+ {
+ error_out_of_memory();
+ return NULL;
+ }
+
+ bc->hFind = FindFirstFile (fv, bc->ffind);
+
+ fv = !(bc->hFind==INVALID_HANDLE_VALUE) ? bc->ffind->cFileName : NULL;
+ }
+
+ if (fv == NULL)
+ {
+ /* Null indicates no more files.. */
+ free (bc->ffind); /* free the buffer */
+ bc->ffind = NULL;
+ bc->shiftlevel++; /* On to next list element */
+ continue;
+ }
+ }
+
+ /* At this point, fv points to parameter string */
+ while (*sp)
+ {
+ if ((*sp == _T('%')) && (*(sp + 1) == bc->forvar))
+ {
+ /* replace % var */
+ dp = _stpcpy (dp, fv);
+ sp += 2;
+ }
+ else
+ {
+ /* Else just copy */
+ *dp++ = *sp++;
+ }
+ }
+
+ *dp = _T('\0');
+
+ *bLocalEcho = bEcho;
+
+ return textline;
+ }
+
+ if (!FileGetString (bc->hBatchFile, textline, sizeof (textline) / sizeof (textline[0])))
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("ReadBatchLine(): Reached EOF!\n"));
+#endif
+ /* End of file.... */
+ ExitBatch (NULL);
+
+ if (bc == NULL)
+ return NULL;
+
+ continue;
+ }
+#ifdef _DEBUG
+ DebugPrintf (_T("ReadBatchLine(): textline: \'%s\'\n"), textline);
+#endif
+
+ /* Strip leading spaces and trailing space/control chars */
+ for (first = textline; _istspace (*first); first++)
+ ;
+
+ for (ip = first + _tcslen (first) - 1; _istspace (*ip) || _istcntrl (*ip); ip--)
+ ;
+
+ *++ip = _T('\0');
+
+ /* ignore labels and empty lines */
+ if (*first == _T(':') || *first == 0)
+ continue;
+
+ if (*first == _T('@'))
+ {
+ /* don't echo this line */
+ do
+ first++;
+ while (_istspace (*first));
+
+ *bLocalEcho = 0;
+ }
+ else
+ *bLocalEcho = bEcho;
+
+ break;
+ }
+
+ return first;
+}
+
+/* EOF */
--- /dev/null
+/*
+ * BATCH.H - A structure to preserve the context of a batch file
+ *
+ *
+ */
+
+#ifndef _BATCH_H_INCLUDED_
+#define _BATCH_H_INCLUDED_
+
+
+typedef struct tagBATCHCONTEXT
+{
+ struct tagBATCHCONTEXT *prev;
+ LPWIN32_FIND_DATA ffind;
+ HANDLE hBatchFile;
+ LPTSTR forproto;
+ LPTSTR params;
+ INT shiftlevel;
+ BOOL bEcho; /* Preserve echo flag across batch calls */
+ HANDLE hFind; /* Preserve find handle when doing a for */
+ TCHAR In[MAX_PATH];
+ TCHAR Out[MAX_PATH];
+ TCHAR Err[MAX_PATH];
+ TCHAR forvar;
+} BATCH_CONTEXT, *LPBATCH_CONTEXT;
+
+
+/* The stack of current batch contexts.
+ * NULL when no batch is active
+ */
+extern LPBATCH_CONTEXT bc;
+
+extern BOOL bEcho; /* The echo flag */
+
+#define BATCH_BUFFSIZE 2048
+
+extern TCHAR textline[BATCH_BUFFSIZE]; /* Buffer for reading Batch file lines */
+
+
+LPTSTR FindArg (INT);
+LPTSTR BatchParams (LPTSTR, LPTSTR);
+VOID ExitBatch (LPTSTR);
+BOOL Batch (LPTSTR, LPTSTR, LPTSTR);
+LPTSTR ReadBatchLine (LPBOOL);
+VOID AddBatchRedirection(TCHAR *, TCHAR *, TCHAR *);
+
+#endif /* _BATCH_H_INCLUDED_ */
--- /dev/null
+/*
+ * BEEP.C - beep internal command.
+ *
+ *
+ * History:
+ *
+ * 16 Jul 1998 (Hans B Pufal)
+ * started.
+ *
+ * 16 Jul 1998 (John P Price)
+ * Separated commands into individual files.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 14-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("beep /?").
+ * Unicode ready!
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Redirection ready!
+ *
+ * 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_BEEP
+
+
+INT cmd_beep (LPTSTR cmd, LPTSTR param)
+{
+ if (_tcsncmp (param, _T("/?"), 2) == 0)
+ {
+ ConOutResPaging(TRUE,STRING_BEEP_HELP);
+ return 0;
+ }
+
+#if 0
+ /* check if run in batch mode */
+ if (bc == NULL)
+ return 1;
+#endif
+ MessageBeep (-1);
+
+ return 0;
+}
+#endif
--- /dev/null
+/*
+ * CALL.C - call internal batch command.
+ *
+ *
+ * History:
+ *
+ * 16 Jul 1998 (Hans B Pufal)
+ * started.
+ *
+ * 16 Jul 1998 (John P Price)
+ * Seperated commands into individual files.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 04-Aug-1998 (Hans B Pufal)
+ * added lines to initialize for pointers (HBP004) This fixed the
+ * lock-up that happened sometimes when calling a batch file from
+ * another batch file.
+ *
+ * 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("call /?") and cleaned up.
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection safe!
+ *
+ * 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+/*
+ * Perform CALL command.
+ *
+ * Allocate a new batch context and add it to the current chain.
+ * Call parsecommandline passing in our param string
+ * If No batch file was opened then remove our newly allocted
+ * context block.
+ */
+
+INT cmd_call (LPTSTR cmd, LPTSTR param)
+{
+ LPBATCH_CONTEXT n = NULL;
+
+#ifdef _DEBUG
+ DebugPrintf (_T("cmd_call: (\'%s\',\'%s\')\n"), cmd, param);
+#endif
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_CALL_HELP);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ n = (LPBATCH_CONTEXT)malloc (sizeof (BATCH_CONTEXT));
+
+ if (n == NULL)
+ {
+ error_out_of_memory ();
+ return 1;
+ }
+
+ n->prev = bc;
+ bc = n;
+
+ bc->hBatchFile = INVALID_HANDLE_VALUE;
+ bc->params = NULL;
+ bc->shiftlevel = 0;
+ bc->forvar = 0; /* HBP004 */
+ bc->forproto = NULL; /* HBP004 */
+ ParseCommandLine (param);
+ if (bc->prev)
+ {
+ _tcscpy(bc->In, bc->prev->In);
+ _tcscpy(bc->Out, bc->prev->Out);
+ _tcscpy(bc->Err, bc->prev->Err);
+ }
+ else
+ {
+ bc->In[0] = _T('\0');
+ bc->Out[0] = _T('\0');
+ bc->Err[0] = _T('\0');
+ }
+
+
+ /* Wasn't a batch file so remove conext */
+ if (bc->hBatchFile == INVALID_HANDLE_VALUE)
+ {
+ bc = bc->prev;
+ free (n);
+ }
+
+ return 0;
+}
+
+/* EOF */
--- /dev/null
+/*
+ * CHCP.C - chcp internal command.
+ *
+ *
+ * History:
+ *
+ * 23-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Started.
+ *
+ * 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+
+#ifdef INCLUDE_CMD_CHCP
+
+INT CommandChcp (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ LPTSTR *arg;
+ INT args;
+ UINT uNewCodePage;
+
+ /* print help */
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_CHCP_HELP);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ /* get parameters */
+ arg = split (param, &args, FALSE);
+
+ if (args == 0)
+ {
+ /* display active code page number */
+ LoadString(CMD_ModuleHandle, STRING_CHCP_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, InputCodePage);
+ return 0;
+ }
+
+ if (args >= 2)
+ {
+ /* too many parameters */
+ LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, param);
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ uNewCodePage = (UINT)_ttoi(arg[0]);
+
+ if (uNewCodePage == 0)
+ {
+ LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, arg[0]);
+ freep (arg);
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ if (!SetConsoleCP(uNewCodePage))
+ {
+ ConErrResPuts(STRING_CHCP_ERROR4);
+ }
+ else
+ {
+
+ SetConsoleOutputCP (uNewCodePage);
+ InitLocale ();
+ InputCodePage= GetConsoleCP();
+ }
+
+ freep (arg);
+
+ return 0;
+}
+
+#endif /* INCLUDE_CMD_CHCP */
--- /dev/null
+/*
+ * CHOICE.C - internal command.
+ *
+ *
+ * History:
+ *
+ * 12 Aug 1999 (Eric Kohl)
+ * started.
+ *
+ * 01 Sep 1999 (Eric Kohl)
+ * Fixed help text.
+ *
+ * 26 Sep 1999 (Paolo Pantaleo)
+ * Fixed timeout.
+ *
+ * 02 Apr 2005 (Magnus Olsen
+ * Remove Hardcode string so
+ * they can be translate
+ *
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_CHOICE
+
+
+#define GC_TIMEOUT -1
+#define GC_NOKEY 0 //an event occurred but it wasn't a key pressed
+#define GC_KEYREAD 1 //a key has been read
+
+
+static INT
+GetCharacterTimeout (LPTCH ch, DWORD dwMilliseconds)
+{
+//--------------------------------------------
+// Get a character from standard input but with a timeout.
+// The function will wait a limited amount
+// of time, then the function returns GC_TIMEOUT.
+//
+// dwMilliseconds is the timeout value, that can
+// be set to INFINITE, so the function works like
+// stdio.h's getchar()
+
+ HANDLE hInput;
+ DWORD dwRead;
+
+ INPUT_RECORD lpBuffer;
+
+ hInput = GetStdHandle (STD_INPUT_HANDLE);
+
+ //if the timeout experied return GC_TIMEOUT
+ if (WaitForSingleObject (hInput, dwMilliseconds) == WAIT_TIMEOUT)
+ return GC_TIMEOUT;
+
+ //otherwise get the event
+ ReadConsoleInput (hInput, &lpBuffer, 1, &dwRead);
+
+ //if the event is a key pressed
+ if ((lpBuffer.EventType == KEY_EVENT) &&
+ (lpBuffer.Event.KeyEvent.bKeyDown == TRUE))
+ {
+ //read the key
+#ifdef _UNICODE
+ *ch = lpBuffer.Event.KeyEvent.uChar.UnicodeChar;
+#else
+ *ch = lpBuffer.Event.KeyEvent.uChar.AsciiChar;
+#endif
+ return GC_KEYREAD;
+ }
+
+ //else return no key
+ return GC_NOKEY;
+}
+
+static INT
+IsKeyInString (LPTSTR lpString, TCHAR cKey, BOOL bCaseSensitive)
+{
+ LPTCH p = lpString;
+ INT val = 0;
+
+ while (*p)
+ {
+ if (bCaseSensitive)
+ {
+ if (*p == cKey)
+ return val;
+ }
+ else
+ {
+ if (_totlower (*p) == _totlower (cKey))
+ return val;
+ }
+
+ val++;
+ p++;
+ }
+
+ return -1;
+}
+
+
+INT
+CommandChoice (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ LPTSTR lpOptions;
+ TCHAR Options[6];
+ LPTSTR lpText = NULL;
+ BOOL bNoPrompt = FALSE;
+ BOOL bCaseSensitive = FALSE;
+ BOOL bTimeout = FALSE;
+ INT nTimeout = 0;
+ TCHAR cDefault = _T('\0');
+ INPUT_RECORD ir;
+ LPTSTR p, np;
+ LPTSTR *arg;
+ INT argc;
+ INT i;
+ INT val;
+
+ INT GCret;
+ TCHAR Ch;
+ DWORD amount,clk;
+
+ LoadString(CMD_ModuleHandle, STRING_CHOICE_OPTION, Options, 4);
+ lpOptions = Options;
+
+ if (_tcsncmp (param, _T("/?"), 2) == 0)
+ {
+ ConOutResPaging(TRUE,STRING_CHOICE_HELP);
+ return 0;
+ }
+
+ /* retrieve text */
+ p = param;
+
+ while (TRUE)
+ {
+ if (*p == _T('\0'))
+ break;
+
+ if (*p != _T('/'))
+ {
+ lpText = p;
+ break;
+ }
+ np = _tcschr (p, _T(' '));
+ if (!np)
+ break;
+ p = np + 1;
+ }
+
+ /* build parameter array */
+ arg = split (param, &argc, FALSE);
+
+ /* evaluate arguments */
+ if (argc > 0)
+ {
+ for (i = 0; i < argc; i++)
+ {
+ if (_tcsnicmp (arg[i], _T("/c"), 2) == 0)
+ {
+ if (arg[i][2] == _T(':'))
+ lpOptions = &arg[i][3];
+ else
+ lpOptions = &arg[i][2];
+
+ if (_tcslen (lpOptions) == 0)
+ {
+ ConErrResPuts(STRING_CHOICE_ERROR);
+ freep (arg);
+ return 1;
+ }
+ }
+ else if (_tcsnicmp (arg[i], _T("/n"), 2) == 0)
+ {
+ bNoPrompt = TRUE;
+ }
+ else if (_tcsnicmp (arg[i], _T("/s"), 2) == 0)
+ {
+ bCaseSensitive = TRUE;
+ }
+ else if (_tcsnicmp (arg[i], _T("/t"), 2) == 0)
+ {
+ LPTSTR s;
+
+ if (arg[i][2] == _T(':'))
+ {
+ cDefault = arg[i][3];
+ s = &arg[i][4];
+ }
+ else
+ {
+ cDefault = arg[i][2];
+ s = &arg[i][3];
+ }
+
+ if (*s != _T(','))
+ {
+ ConErrResPuts(STRING_CHOICE_ERROR_TXT);
+ freep (arg);
+ return 1;
+ }
+
+ s++;
+ nTimeout = _ttoi(s);
+ bTimeout = TRUE;
+ }
+ else if (arg[i][0] == _T('/'))
+ {
+ LoadString(CMD_ModuleHandle, STRING_CHOICE_ERROR_OPTION, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, arg[i]);
+ freep (arg);
+ return 1;
+ }
+ }
+ }
+
+ /* print text */
+ if (lpText)
+ ConOutPrintf (_T("%s"), lpText);
+
+ /* print options */
+ if (bNoPrompt == FALSE)
+ {
+ ConOutPrintf (_T("[%c"), lpOptions[0]);
+
+ for (i = 1; (unsigned)i < _tcslen (lpOptions); i++)
+ ConOutPrintf (_T(",%c"), lpOptions[i]);
+
+ ConOutPrintf (_T("]?"));
+ }
+
+ ConInFlush ();
+
+ if(!bTimeout)
+ {
+ while (TRUE)
+ {
+ ConInKey (&ir);
+
+ val = IsKeyInString (lpOptions,
+#ifdef _UNICODE
+ ir.Event.KeyEvent.uChar.UnicodeChar,
+#else
+ ir.Event.KeyEvent.uChar.AsciiChar,
+#endif
+ bCaseSensitive);
+
+ if (val >= 0)
+ {
+ ConOutPrintf (_T("%c\n"), lpOptions[val]);
+
+ nErrorLevel = val + 1;
+
+ break;
+ }
+
+ Beep (440, 50);
+ }
+
+ freep (arg);
+#ifdef _DEBUG
+ DebugPrintf (_T("ErrorLevel: %d\n"), nErrorLevel);
+#endif /* _DEBUG */
+ return 0;
+ }
+
+ clk = GetTickCount ();
+ amount = nTimeout*1000;
+
+loop:
+ GCret = GetCharacterTimeout (&Ch, amount - (GetTickCount () - clk));
+
+ switch (GCret)
+ {
+ case GC_TIMEOUT:
+#ifdef _DEBUG
+ DebugPrintf (_T("GC_TIMEOUT\n"));
+ DebugPrintf (_T("elapsed %d msecs\n"), GetTickCount () - clk);
+#endif /* _DEBUG */
+ break;
+
+ case GC_NOKEY:
+#ifdef _DEBUG
+ DebugPrintf(_T("GC_NOKEY\n"));
+ DebugPrintf(_T("elapsed %d msecs\n"), GetTickCount () - clk);
+#endif /* _DEBUG */
+ goto loop;
+
+ case GC_KEYREAD:
+#ifdef _DEBUG
+ DebugPrintf(_T("GC_KEYREAD\n"));
+ DebugPrintf(_T("elapsed %d msecs\n"), GetTickCount () - clk);
+ DebugPrintf(_T("read %c"), Ch);
+#endif /* _DEBUG */
+ if ((val=IsKeyInString(lpOptions,Ch,bCaseSensitive))==-1)
+ {
+ Beep (440, 50);
+ goto loop;
+ }
+ cDefault=Ch;
+ break;
+ }
+
+#ifdef _DEBUG
+ DebugPrintf(_T("exiting wait loop after %d msecs\n"),
+ GetTickCount () - clk);
+#endif /* _DEBUG */
+
+ val = IsKeyInString (lpOptions, cDefault, bCaseSensitive);
+ ConOutPrintf (_T("%c\n"), lpOptions[val]);
+
+ nErrorLevel = val + 1;
+
+ freep (arg);
+
+#ifdef _DEBUG
+ DebugPrintf (_T("ErrorLevel: %d\n"), nErrorLevel);
+#endif /* _DEBUG */
+
+ return 0;
+}
+#endif /* INCLUDE_CMD_CHOICE */
+
+/* EOF */
--- /dev/null
+/*
+ * CLS.C - clear screen internal command.
+ *
+ *
+ * History:
+ *
+ * 07/27/1998 (John P. Price)
+ * started.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 04-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Changed to Win32 console app.
+ *
+ * 08-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("/?").
+ *
+ * 14-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode ready!
+ *
+ * 20-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Redirection ready!
+ *
+ * 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_CLS
+
+INT cmd_cls (LPTSTR cmd, LPTSTR param)
+{
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+ COORD coPos;
+ DWORD dwWritten;
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_CLS_HELP);
+ return 0;
+ }
+
+ GetConsoleScreenBufferInfo(hConsole, &csbi);
+
+ coPos.X = 0;
+ coPos.Y = 0;
+ FillConsoleOutputAttribute(hConsole, wColor,
+ csbi.dwSize.X * csbi.dwSize.Y,
+ coPos, &dwWritten);
+ FillConsoleOutputCharacter(hConsole, _T(' '),
+ csbi.dwSize.X * csbi.dwSize.Y,
+ coPos, &dwWritten);
+ SetConsoleCursorPosition(hConsole, coPos);
+
+ bIgnoreEcho = TRUE;
+
+ return 0;
+}
+#endif
--- /dev/null
+/*
+ * CMD.C - command-line interface.
+ *
+ *
+ * History:
+ *
+ * 17 Jun 1994 (Tim Norman)
+ * started.
+ *
+ * 08 Aug 1995 (Matt Rains)
+ * I have cleaned up the source code. changes now bring this source
+ * into guidelines for recommended programming practice.
+ *
+ * A added the the standard FreeDOS GNU licence test to the
+ * initialize() function.
+ *
+ * Started to replace puts() with printf(). this will help
+ * standardize output. please follow my lead.
+ *
+ * I have added some constants to help making changes easier.
+ *
+ * 15 Dec 1995 (Tim Norman)
+ * major rewrite of the code to make it more efficient and add
+ * redirection support (finally!)
+ *
+ * 06 Jan 1996 (Tim Norman)
+ * finished adding redirection support! Changed to use our own
+ * exec code (MUCH thanks to Svante Frey!!)
+ *
+ * 29 Jan 1996 (Tim Norman)
+ * added support for CHDIR, RMDIR, MKDIR, and ERASE, as per
+ * suggestion of Steffan Kaiser
+ *
+ * changed "file not found" error message to "bad command or
+ * filename" thanks to Dustin Norman for noticing that confusing
+ * message!
+ *
+ * changed the format to call internal commands (again) so that if
+ * they want to split their commands, they can do it themselves
+ * (none of the internal functions so far need that much power, anyway)
+ *
+ * 27 Aug 1996 (Tim Norman)
+ * added in support for Oliver Mueller's ALIAS command
+ *
+ * 14 Jun 1997 (Steffan Kaiser)
+ * added ctrl-break handling and error level
+ *
+ * 16 Jun 1998 (Rob Lake)
+ * Runs command.com if /P is specified in command line. Command.com
+ * also stays permanent. If /C is in the command line, starts the
+ * program next in the line.
+ *
+ * 21 Jun 1998 (Rob Lake)
+ * Fixed up /C so that arguments for the program
+ *
+ * 08-Jul-1998 (John P. Price)
+ * Now sets COMSPEC environment variable
+ * misc clean up and optimization
+ * added date and time commands
+ * changed to using spawnl instead of exec. exec does not copy the
+ * environment to the child process!
+ *
+ * 14 Jul 1998 (Hans B Pufal)
+ * Reorganised source to be more efficient and to more closely
+ * follow MS-DOS conventions. (eg %..% environment variable
+ * replacement works form command line as well as batch file.
+ *
+ * New organisation also properly support nested batch files.
+ *
+ * New command table structure is half way towards providing a
+ * system in which COMMAND will find out what internal commands
+ * are loaded
+ *
+ * 24 Jul 1998 (Hans B Pufal) [HBP_003]
+ * Fixed return value when called with /C option
+ *
+ * 27 Jul 1998 John P. Price
+ * added config.h include
+ *
+ * 28 Jul 1998 John P. Price
+ * added showcmds function to show commands and options available
+ *
+ * 07-Aug-1998 (John P Price <linux-guru@gcfl.net>)
+ * Fixed carrage return output to better match MSDOS with echo
+ * on or off. (marked with "JPP 19980708")
+ *
+ * 07-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * First ReactOS release.
+ * Extended length of commandline buffers to 512.
+ *
+ * 13-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added COMSPEC environment variable.
+ * Added "/t" support (color) on cmd command line.
+ *
+ * 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("cmd /?").
+ *
+ * 25-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection safe!
+ * Fixed redirections and piping.
+ * Piping is based on temporary files, but basic support
+ * for anonymous pipes already exists.
+ *
+ * 27-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Replaced spawnl() by CreateProcess().
+ *
+ * 22-Oct-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added break handler.
+ *
+ * 15-Dec-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed current directory
+ *
+ * 28-Dec-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Restore window title after program/batch execution
+ *
+ * 03-Feb-2001 (Eric Kohl <ekohl@rz-online.de>)
+ * Workaround because argc[0] is NULL under ReactOS
+ *
+ * 23-Feb-2001 (Carl Nettelblad <cnettel@hem.passagen.se>)
+ * %envvar% replacement conflicted with for.
+ *
+ * 30-Apr-2004 (Filip Navara <xnavara@volny.cz>)
+ * Make MakeSureDirectoryPathExistsEx unicode safe.
+ *
+ * 28-Mai-2004
+ * Removed MakeSureDirectoryPathExistsEx.
+ * Use the current directory if GetTempPath fails.
+ *
+ * 12-Jul-2004 (Jens Collin <jens.collin@lakhei.com>)
+ * Added ShellExecute call when all else fails to be able to "launch" any file.
+ *
+ * 02-Apr-2005 (Magnus Olsen <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ *
+ * 06-May-2005 (Klemens Friedl <frik85@gmail.com>)
+ * Add 'help' command (list all commands plus description)
+ *
+ * 06-jul-2005 (Magnus Olsen <magnus@greatlord.com>)
+ * translate '%errorlevel%' to the internal value.
+ * Add proper memmory alloc ProcessInput, the error
+ * handling for memmory handling need to be improve
+ */
+
+#include <precomp.h>
+#include <malloc.h>
+#include "resource.h"
+
+#ifndef NT_SUCCESS
+#define NT_SUCCESS(StatCode) ((NTSTATUS)(StatCode) >= 0)
+#endif
+
+typedef NTSTATUS (WINAPI *NtQueryInformationProcessProc)(HANDLE, PROCESSINFOCLASS,
+ PVOID, ULONG, PULONG);
+typedef NTSTATUS (WINAPI *NtReadVirtualMemoryProc)(HANDLE, PVOID, PVOID, ULONG, PULONG);
+
+BOOL bExit = FALSE; /* indicates EXIT was typed */
+BOOL bCanExit = TRUE; /* indicates if this shell is exitable */
+BOOL bCtrlBreak = FALSE; /* Ctrl-Break or Ctrl-C hit */
+BOOL bIgnoreEcho = FALSE; /* Ignore 'newline' before 'cls' */
+INT nErrorLevel = 0; /* Errorlevel of last launched external program */
+BOOL bChildProcessRunning = FALSE;
+DWORD dwChildProcessId = 0;
+OSVERSIONINFO osvi;
+HANDLE hIn;
+HANDLE hOut;
+HANDLE hConsole;
+HANDLE CMD_ModuleHandle;
+HMODULE NtDllModule;
+
+static NtQueryInformationProcessProc NtQueryInformationProcessPtr = NULL;
+static NtReadVirtualMemoryProc NtReadVirtualMemoryPtr = NULL;
+
+#ifdef INCLUDE_CMD_COLOR
+WORD wColor; /* current color */
+WORD wDefColor; /* default color */
+#endif
+
+/*
+ * convert
+ *
+ * insert commas into a number
+ */
+INT
+ConvertULargeInteger (ULARGE_INTEGER num, LPTSTR des, INT len, BOOL bPutSeperator)
+{
+ TCHAR temp[32];
+ INT c = 0;
+ INT n = 0;
+
+ if (num.QuadPart == 0)
+ {
+ des[0] = _T('0');
+ des[1] = _T('\0');
+ n = 1;
+ }
+ else
+ {
+ temp[31] = 0;
+ while (num.QuadPart > 0)
+ {
+ if ((((c + 1) % (nNumberGroups + 1)) == 0) && (bPutSeperator))
+ temp[30 - c++] = cThousandSeparator;
+ temp[30 - c++] = (TCHAR)(num.QuadPart % 10) + _T('0');
+ num.QuadPart /= 10;
+ }
+
+ for (n = 0; n <= c; n++)
+ des[n] = temp[31 - c + n];
+ }
+
+ return n;
+}
+
+/*
+ * is character a delimeter when used on first word?
+ *
+ */
+static BOOL IsDelimiter (TCHAR c)
+{
+ return (c == _T('/') || c == _T('=') || c == _T('\0') || _istspace (c));
+}
+
+/*
+ * Is a process a console process?
+ */
+static BOOL IsConsoleProcess(HANDLE Process)
+{
+ NTSTATUS Status;
+ PROCESS_BASIC_INFORMATION Info;
+ PEB ProcessPeb;
+ ULONG BytesRead;
+
+ if (NULL == NtQueryInformationProcessPtr || NULL == NtReadVirtualMemoryPtr)
+ {
+ return TRUE;
+ }
+
+ Status = NtQueryInformationProcessPtr (
+ Process, ProcessBasicInformation,
+ &Info, sizeof(PROCESS_BASIC_INFORMATION), NULL);
+ if (! NT_SUCCESS(Status))
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("NtQueryInformationProcess failed with status %08x\n"), Status);
+#endif
+ return TRUE;
+ }
+ Status = NtReadVirtualMemoryPtr (
+ Process, Info.PebBaseAddress, &ProcessPeb,
+ sizeof(PEB), &BytesRead);
+ if (! NT_SUCCESS(Status) || sizeof(PEB) != BytesRead)
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("Couldn't read virt mem status %08x bytes read %lu\n"), Status, BytesRead);
+#endif
+ return TRUE;
+ }
+
+ return IMAGE_SUBSYSTEM_WINDOWS_CUI == ProcessPeb.ImageSubSystem;
+}
+
+
+
+#ifdef _UNICODE
+#define SHELLEXECUTETEXT "ShellExecuteW"
+#else
+#define SHELLEXECUTETEXT "ShellExecuteA"
+#endif
+
+typedef HINSTANCE (WINAPI *MYEX)(
+ HWND hwnd,
+ LPCTSTR lpOperation,
+ LPCTSTR lpFile,
+ LPCTSTR lpParameters,
+ LPCTSTR lpDirectory,
+ INT nShowCmd
+);
+
+
+
+static BOOL RunFile(LPTSTR filename)
+{
+ HMODULE hShell32;
+ MYEX hShExt;
+ HINSTANCE ret;
+
+#ifdef _DEBUG
+ DebugPrintf (_T("RunFile(%s)\n"), filename);
+#endif
+ hShell32 = LoadLibrary(_T("SHELL32.DLL"));
+ if (!hShell32)
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("RunFile: couldn't load SHELL32.DLL!\n"));
+#endif
+ return FALSE;
+ }
+
+ hShExt = (MYEX)(FARPROC)GetProcAddress(hShell32, SHELLEXECUTETEXT);
+ if (!hShExt)
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("RunFile: couldn't find ShellExecuteA/W in SHELL32.DLL!\n"));
+#endif
+ FreeLibrary(hShell32);
+ return FALSE;
+ }
+
+#ifdef _DEBUG
+ DebugPrintf (_T("RunFile: ShellExecuteA/W is at %x\n"), hShExt);
+#endif
+
+ ret = (hShExt)(NULL, _T("open"), filename, NULL, NULL, SW_SHOWNORMAL);
+
+#ifdef _DEBUG
+ DebugPrintf (_T("RunFile: ShellExecuteA/W returned %d\n"), (DWORD)ret);
+#endif
+
+ FreeLibrary(hShell32);
+ return (((DWORD)ret) > 32);
+}
+
+
+
+/*
+ * This command (in first) was not found in the command table
+ *
+ * Full - whole command line
+ * First - first word on command line
+ * Rest - rest of command line
+ */
+
+static VOID
+Execute (LPTSTR Full, LPTSTR First, LPTSTR Rest)
+{
+ TCHAR *szFullName=NULL;
+ TCHAR *first = NULL;
+ TCHAR *rest = NULL;
+ TCHAR *full = NULL;
+ TCHAR *dot = NULL;
+ TCHAR szWindowTitle[MAX_PATH];
+ DWORD dwExitCode = 0;
+
+#ifdef _DEBUG
+ DebugPrintf (_T("Execute: \'%s\' \'%s\'\n"), first, rest);
+#endif
+
+ /* we need biger buffer that First, Rest, Full are already
+ need rewrite some code to use realloc when it need instead
+ of add 512bytes extra */
+
+ first = malloc ( (_tcslen(First) + 512) * sizeof(TCHAR));
+ if (first == NULL)
+ {
+ error_out_of_memory();
+ nErrorLevel = 1;
+ return ;
+ }
+
+ rest = malloc ( (_tcslen(Rest) + 512) * sizeof(TCHAR));
+ if (rest == NULL)
+ {
+ free (first);
+ error_out_of_memory();
+ nErrorLevel = 1;
+ return ;
+ }
+
+ full = malloc ( (_tcslen(Full) + 512) * sizeof(TCHAR));
+ if (full == NULL)
+ {
+ free (first);
+ free (rest);
+ error_out_of_memory();
+ nErrorLevel = 1;
+ return ;
+ }
+
+ szFullName = malloc ( (_tcslen(Full) + 512) * sizeof(TCHAR));
+ if (full == NULL)
+ {
+ free (first);
+ free (rest);
+ free (full);
+ error_out_of_memory();
+ nErrorLevel = 1;
+ return ;
+ }
+
+
+ /* Though it was already parsed once, we have a different set of rules
+ for parsing before we pass to CreateProccess */
+ if(!_tcschr(Full,_T('\"')))
+ {
+ _tcscpy(first,First);
+ _tcscpy(rest,Rest);
+ _tcscpy(full,Full);
+ }
+ else
+ {
+ UINT i = 0;
+ BOOL bInside = FALSE;
+ rest[0] = _T('\0');
+ full[0] = _T('\0');
+ first[0] = _T('\0');
+ _tcscpy(first,Full);
+ /* find the end of the command and start of the args */
+ for(i = 0; i < _tcslen(first); i++)
+ {
+ if(!_tcsncmp(&first[i], _T("\""), 1))
+ bInside = !bInside;
+ if(!_tcsncmp(&first[i], _T(" "), 1) && !bInside)
+ {
+ _tcscpy(rest,&first[i]);
+ first[i] = _T('\0');
+ break;
+ }
+
+ }
+ i = 0;
+ /* remove any slashes */
+ while(i < _tcslen(first))
+ {
+ if(first[i] == _T('\"'))
+ memmove(&first[i],&first[i + 1], _tcslen(&first[i]) * sizeof(TCHAR));
+ else
+ i++;
+ }
+ /* Drop quotes around it just in case there is a space */
+ _tcscpy(full,_T("\""));
+ _tcscat(full,first);
+ _tcscat(full,_T("\" "));
+ _tcscat(full,rest);
+ }
+
+ /* check for a drive change */
+ if ((_istalpha (first[0])) && (!_tcscmp (first + 1, _T(":"))))
+ {
+ BOOL working = TRUE;
+ if (!SetCurrentDirectory(first))
+ /* Guess they changed disc or something, handle that gracefully and get to root */
+ {
+ TCHAR str[4];
+ str[0]=first[0];
+ str[1]=_T(':');
+ str[2]=_T('\\');
+ str[3]=0;
+ working = SetCurrentDirectory(str);
+ }
+
+ if (!working) ConErrResPuts (STRING_FREE_ERROR1);
+
+ free (first);
+ free (rest);
+ free (full);
+ free (szFullName);
+ nErrorLevel = 1;
+ return;
+ }
+
+ /* get the PATH environment variable and parse it */
+ /* search the PATH environment variable for the binary */
+ if (!SearchForExecutable (first, szFullName))
+ {
+ error_bad_command ();
+ free (first);
+ free (rest);
+ free (full);
+ free (szFullName);
+ nErrorLevel = 1;
+ return;
+
+ }
+
+ GetConsoleTitle (szWindowTitle, MAX_PATH);
+
+ /* check if this is a .BAT or .CMD file */
+ dot = _tcsrchr (szFullName, _T('.'));
+ if (dot && (!_tcsicmp (dot, _T(".bat")) || !_tcsicmp (dot, _T(".cmd"))))
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("[BATCH: %s %s]\n"), szFullName, rest);
+#endif
+ Batch (szFullName, first, rest);
+ }
+ else
+ {
+ /* exec the program */
+ PROCESS_INFORMATION prci;
+ STARTUPINFO stui;
+
+#ifdef _DEBUG
+ DebugPrintf (_T("[EXEC: %s %s]\n"), full, rest);
+#endif
+ /* build command line for CreateProcess() */
+
+ /* fill startup info */
+ memset (&stui, 0, sizeof (STARTUPINFO));
+ stui.cb = sizeof (STARTUPINFO);
+ stui.dwFlags = STARTF_USESHOWWINDOW;
+ stui.wShowWindow = SW_SHOWDEFAULT;
+
+ // return console to standard mode
+ SetConsoleMode (GetStdHandle(STD_INPUT_HANDLE),
+ ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT );
+
+ if (CreateProcess (szFullName,
+ full,
+ NULL,
+ NULL,
+ TRUE,
+ 0, /* CREATE_NEW_PROCESS_GROUP */
+ NULL,
+ NULL,
+ &stui,
+ &prci))
+
+ {
+ if (IsConsoleProcess(prci.hProcess))
+ {
+ /* FIXME: Protect this with critical section */
+ bChildProcessRunning = TRUE;
+ dwChildProcessId = prci.dwProcessId;
+
+ WaitForSingleObject (prci.hProcess, INFINITE);
+
+ /* FIXME: Protect this with critical section */
+ bChildProcessRunning = FALSE;
+
+ GetExitCodeProcess (prci.hProcess, &dwExitCode);
+ nErrorLevel = (INT)dwExitCode;
+ }
+ else
+ {
+ nErrorLevel = 0;
+ }
+ CloseHandle (prci.hThread);
+ CloseHandle (prci.hProcess);
+ }
+ else
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("[ShellExecute: %s]\n"), full);
+#endif
+ // See if we can run this with ShellExecute() ie myfile.xls
+ if (!RunFile(full))
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("[ShellExecute failed!: %s]\n"), full);
+#endif
+ error_bad_command ();
+ nErrorLevel = 1;
+ }
+ else
+ {
+ nErrorLevel = 0;
+ }
+ }
+ // restore console mode
+ SetConsoleMode (
+ GetStdHandle( STD_INPUT_HANDLE ),
+ ENABLE_PROCESSED_INPUT );
+ }
+
+ /* Get code page if it has been change */
+ InputCodePage= GetConsoleCP();
+ OutputCodePage = GetConsoleOutputCP();
+ SetConsoleTitle (szWindowTitle);
+
+ free(first);
+ free(rest);
+ free(full);
+ free (szFullName);
+}
+
+
+/*
+ * look through the internal commands and determine whether or not this
+ * command is one of them. If it is, call the command. If not, call
+ * execute to run it as an external program.
+ *
+ * line - the command line of the program to run
+ *
+ */
+
+static VOID
+DoCommand (LPTSTR line)
+{
+ TCHAR *com = NULL; /* the first word in the command */
+ TCHAR *cp = NULL;
+ LPTSTR cstart;
+ LPTSTR rest; /* pointer to the rest of the command line */
+ INT cl;
+ LPCOMMAND cmdptr;
+
+#ifdef _DEBUG
+ DebugPrintf (_T("DoCommand: (\'%s\')\n"), line);
+#endif /* DEBUG */
+
+ com = malloc( (_tcslen(line) +512)*sizeof(TCHAR) );
+ if (com == NULL)
+ {
+ error_out_of_memory();
+ return;
+ }
+
+ cp = com;
+ /* Skip over initial white space */
+ while (_istspace (*line))
+ line++;
+ rest = line;
+
+ cstart = rest;
+
+ /* Anything to do ? */
+ if (*rest)
+ {
+ if (*rest == _T('"'))
+ {
+ /* treat quoted words specially */
+
+ rest++;
+
+ while(*rest != _T('\0') && *rest != _T('"'))
+ *cp++ = _totlower (*rest++);
+ if (*rest == _T('"'))
+ rest++;
+ }
+ else
+ {
+ while (!IsDelimiter (*rest))
+ *cp++ = _totlower (*rest++);
+ }
+
+
+ /* Terminate first word */
+ *cp = _T('\0');
+
+ /* Do not limit commands to MAX_PATH */
+ /*
+ if(_tcslen(com) > MAX_PATH)
+ {
+ error_bad_command();
+ free(com);
+ return;
+ }
+ */
+
+ /* Skip over whitespace to rest of line, exclude 'echo' command */
+ if (_tcsicmp (com, _T("echo")))
+ {
+ while (_istspace (*rest))
+ rest++;
+ }
+
+ /* Scan internal command table */
+ for (cmdptr = cmds;; cmdptr++)
+ {
+ /* If end of table execute ext cmd */
+ if (cmdptr->name == NULL)
+ {
+ Execute (line, com, rest);
+ break;
+ }
+
+ if (!_tcscmp (com, cmdptr->name))
+ {
+ cmdptr->func (com, rest);
+ break;
+ }
+
+ /* The following code handles the case of commands like CD which
+ * are recognised even when the command name and parameter are
+ * not space separated.
+ *
+ * e.g dir..
+ * cd\freda
+ */
+
+ /* Get length of command name */
+ cl = _tcslen (cmdptr->name);
+
+ if ((cmdptr->flags & CMD_SPECIAL) &&
+ (!_tcsncmp (cmdptr->name, com, cl)) &&
+ (_tcschr (_T("\\.-"), *(com + cl))))
+ {
+ /* OK its one of the specials...*/
+
+ /* Terminate first word properly */
+ com[cl] = _T('\0');
+
+ /* Call with new rest */
+ cmdptr->func (com, cstart + cl);
+ break;
+ }
+ }
+ }
+ free(com);
+}
+
+
+/*
+ * process the command line and execute the appropriate functions
+ * full input/output redirection and piping are supported
+ */
+
+VOID ParseCommandLine (LPTSTR cmd)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR cmdline[CMDLINE_LENGTH];
+ LPTSTR s;
+#ifdef FEATURE_REDIRECTION
+ TCHAR in[CMDLINE_LENGTH] = _T("");
+ TCHAR out[CMDLINE_LENGTH] = _T("");
+ TCHAR err[CMDLINE_LENGTH] = _T("");
+ TCHAR szTempPath[MAX_PATH] = _T(".\\");
+ TCHAR szFileName[2][MAX_PATH] = {_T(""), _T("")};
+ HANDLE hFile[2] = {INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE};
+ LPTSTR t = NULL;
+ INT num = 0;
+ INT nRedirFlags = 0;
+ INT Length;
+ UINT Attributes;
+ BOOL bNewBatch = TRUE;
+ HANDLE hOldConIn;
+ HANDLE hOldConOut;
+ HANDLE hOldConErr;
+#endif /* FEATURE_REDIRECTION */
+
+ _tcscpy (cmdline, cmd);
+ s = &cmdline[0];
+
+#ifdef _DEBUG
+ DebugPrintf (_T("ParseCommandLine: (\'%s\')\n"), s);
+#endif /* DEBUG */
+
+#ifdef FEATURE_ALIASES
+ /* expand all aliases */
+ ExpandAlias (s, CMDLINE_LENGTH);
+#endif /* FEATURE_ALIAS */
+
+#ifdef FEATURE_REDIRECTION
+ /* find the temp path to store temporary files */
+ Length = GetTempPath (MAX_PATH, szTempPath);
+ if (Length > 0 && Length < MAX_PATH)
+ {
+ Attributes = GetFileAttributes(szTempPath);
+ if (Attributes == 0xffffffff ||
+ !(Attributes & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ Length = 0;
+ }
+ }
+ if (Length == 0 || Length >= MAX_PATH)
+ {
+ _tcscpy(szTempPath, _T(".\\"));
+ }
+ if (szTempPath[_tcslen (szTempPath) - 1] != _T('\\'))
+ _tcscat (szTempPath, _T("\\"));
+
+ /* get the redirections from the command line */
+ num = GetRedirection (s, in, out, err, &nRedirFlags);
+
+ /* more efficient, but do we really need to do this? */
+ for (t = in; _istspace (*t); t++)
+ ;
+ _tcscpy (in, t);
+
+ for (t = out; _istspace (*t); t++)
+ ;
+ _tcscpy (out, t);
+
+ for (t = err; _istspace (*t); t++)
+ ;
+ _tcscpy (err, t);
+
+ if(bc && !_tcslen (in) && _tcslen (bc->In))
+ _tcscpy(in, bc->In);
+ if(bc && !out[0] && _tcslen(bc->Out))
+ {
+ nRedirFlags |= OUTPUT_APPEND;
+ _tcscpy(out, bc->Out);
+ }
+ if(bc && !_tcslen (err) && _tcslen (bc->Err))
+ {
+ nRedirFlags |= ERROR_APPEND;
+ _tcscpy(err, bc->Err);
+ }
+
+
+ /* Set up the initial conditions ... */
+ /* preserve STDIN, STDOUT and STDERR handles */
+ hOldConIn = GetStdHandle (STD_INPUT_HANDLE);
+ hOldConOut = GetStdHandle (STD_OUTPUT_HANDLE);
+ hOldConErr = GetStdHandle (STD_ERROR_HANDLE);
+
+ /* redirect STDIN */
+ if (in[0])
+ {
+ HANDLE hFile;
+ SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
+
+ /* we need make sure the LastError msg is zero before calling CreateFile */
+ SetLastError(0);
+
+ /* Set up pipe for the standard input handler */
+ hFile = CreateFile (in, GENERIC_READ, FILE_SHARE_READ, &sa, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL, NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ LoadString(CMD_ModuleHandle, STRING_CMD_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, in);
+ return;
+ }
+
+ if (!SetStdHandle (STD_INPUT_HANDLE, hFile))
+ {
+ LoadString(CMD_ModuleHandle, STRING_CMD_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, in);
+ return;
+ }
+#ifdef _DEBUG
+ DebugPrintf (_T("Input redirected from: %s\n"), in);
+#endif
+ }
+
+ /* Now do all but the last pipe command */
+ *szFileName[0] = _T('\0');
+ hFile[0] = INVALID_HANDLE_VALUE;
+
+ while (num-- > 1)
+ {
+ SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
+
+ /* Create unique temporary file name */
+ GetTempFileName (szTempPath, _T("CMD"), 0, szFileName[1]);
+
+ /* we need make sure the LastError msg is zero before calling CreateFile */
+ SetLastError(0);
+
+ /* Set current stdout to temporary file */
+ hFile[1] = CreateFile (szFileName[1], GENERIC_WRITE, 0, &sa,
+ TRUNCATE_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
+
+ if (hFile[1] == INVALID_HANDLE_VALUE)
+ {
+ LoadString(CMD_ModuleHandle, STRING_CMD_ERROR2, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg);
+ return;
+ }
+
+ SetStdHandle (STD_OUTPUT_HANDLE, hFile[1]);
+
+ DoCommand (s);
+
+ /* close stdout file */
+ SetStdHandle (STD_OUTPUT_HANDLE, hOldConOut);
+ if ((hFile[1] != INVALID_HANDLE_VALUE) && (hFile[1] != hOldConOut))
+ {
+ CloseHandle (hFile[1]);
+ hFile[1] = INVALID_HANDLE_VALUE;
+ }
+
+ /* close old stdin file */
+ SetStdHandle (STD_INPUT_HANDLE, hOldConIn);
+ if ((hFile[0] != INVALID_HANDLE_VALUE) && (hFile[0] != hOldConIn))
+ {
+ /* delete old stdin file, if it is a real file */
+ CloseHandle (hFile[0]);
+ hFile[0] = INVALID_HANDLE_VALUE;
+ DeleteFile (szFileName[0]);
+ *szFileName[0] = _T('\0');
+ }
+
+ /* copy stdout file name to stdin file name */
+ _tcscpy (szFileName[0], szFileName[1]);
+ *szFileName[1] = _T('\0');
+
+ /* we need make sure the LastError msg is zero before calling CreateFile */
+ SetLastError(0);
+
+ /* open new stdin file */
+ hFile[0] = CreateFile (szFileName[0], GENERIC_READ, 0, &sa,
+ OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL);
+ SetStdHandle (STD_INPUT_HANDLE, hFile[0]);
+
+ s = s + _tcslen (s) + 1;
+ }
+
+ /* Now set up the end conditions... */
+ /* redirect STDOUT */
+ if (out[0])
+ {
+ /* Final output to here */
+ HANDLE hFile;
+ SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
+
+ /* we need make sure the LastError msg is zero before calling CreateFile */
+ SetLastError(0);
+
+ hFile = CreateFile (out, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, &sa,
+ (nRedirFlags & OUTPUT_APPEND) ? OPEN_ALWAYS : CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL);
+
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ INT size = _tcslen(out)-1;
+
+ if (out[size] != _T(':'))
+ {
+ LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, out);
+ return;
+ }
+
+ out[size]=_T('\0');
+ hFile = CreateFile (out, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, &sa,
+ (nRedirFlags & OUTPUT_APPEND) ? OPEN_ALWAYS : CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL);
+
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, out);
+ return;
+ }
+
+ }
+
+ if (!SetStdHandle (STD_OUTPUT_HANDLE, hFile))
+ {
+ LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, out);
+ return;
+ }
+
+ if (nRedirFlags & OUTPUT_APPEND)
+ {
+ LONG lHighPos = 0;
+
+ if (GetFileType (hFile) == FILE_TYPE_DISK)
+ SetFilePointer (hFile, 0, &lHighPos, FILE_END);
+ }
+#ifdef _DEBUG
+ DebugPrintf (_T("Output redirected to: %s\n"), out);
+#endif
+ }
+ else if (hOldConOut != INVALID_HANDLE_VALUE)
+ {
+ /* Restore original stdout */
+ HANDLE hOut = GetStdHandle (STD_OUTPUT_HANDLE);
+ SetStdHandle (STD_OUTPUT_HANDLE, hOldConOut);
+ if (hOldConOut != hOut)
+ CloseHandle (hOut);
+ hOldConOut = INVALID_HANDLE_VALUE;
+ }
+
+ /* redirect STDERR */
+ if (err[0])
+ {
+ /* Final output to here */
+ HANDLE hFile;
+ SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
+
+ if (!_tcscmp (err, out))
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("Stdout and stderr will use the same file!!\n"));
+#endif
+ DuplicateHandle (GetCurrentProcess (),
+ GetStdHandle (STD_OUTPUT_HANDLE),
+ GetCurrentProcess (),
+ &hFile, 0, TRUE, DUPLICATE_SAME_ACCESS);
+ }
+ else
+ {
+ hFile = CreateFile (err,
+ GENERIC_WRITE,
+ FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
+ &sa,
+ (nRedirFlags & ERROR_APPEND) ? OPEN_ALWAYS : CREATE_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
+ NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, err);
+ return;
+ }
+ }
+
+ if (!SetStdHandle (STD_ERROR_HANDLE, hFile))
+ {
+ LoadString(CMD_ModuleHandle, STRING_CMD_ERROR3, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, err);
+ return;
+ }
+
+ if (nRedirFlags & ERROR_APPEND)
+ {
+ LONG lHighPos = 0;
+
+ if (GetFileType (hFile) == FILE_TYPE_DISK)
+ SetFilePointer (hFile, 0, &lHighPos, FILE_END);
+ }
+#ifdef _DEBUG
+ DebugPrintf (_T("Error redirected to: %s\n"), err);
+#endif
+ }
+ else if (hOldConErr != INVALID_HANDLE_VALUE)
+ {
+ /* Restore original stderr */
+ HANDLE hErr = GetStdHandle (STD_ERROR_HANDLE);
+ SetStdHandle (STD_ERROR_HANDLE, hOldConErr);
+ if (hOldConErr != hErr)
+ CloseHandle (hErr);
+ hOldConErr = INVALID_HANDLE_VALUE;
+ }
+
+ if(bc)
+ bNewBatch = FALSE;
+#endif
+
+ /* process final command */
+ DoCommand (s);
+
+#ifdef FEATURE_REDIRECTION
+ if(bNewBatch && bc)
+ AddBatchRedirection(in, out, err);
+ /* close old stdin file */
+#if 0 /* buggy implementation */
+ SetStdHandle (STD_INPUT_HANDLE, hOldConIn);
+ if ((hFile[0] != INVALID_HANDLE_VALUE) &&
+ (hFile[0] != hOldConIn))
+ {
+ /* delete old stdin file, if it is a real file */
+ CloseHandle (hFile[0]);
+ hFile[0] = INVALID_HANDLE_VALUE;
+ DeleteFile (szFileName[0]);
+ *szFileName[0] = _T('\0');
+ }
+
+ /* Restore original STDIN */
+ if (hOldConIn != INVALID_HANDLE_VALUE)
+ {
+ HANDLE hIn = GetStdHandle (STD_INPUT_HANDLE);
+ SetStdHandle (STD_INPUT_HANDLE, hOldConIn);
+ if (hOldConIn != hIn)
+ CloseHandle (hIn);
+ hOldConIn = INVALID_HANDLE_VALUE;
+ }
+ else
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("Can't restore STDIN! Is invalid!!\n"), out);
+#endif
+ }
+#endif /* buggy implementation */
+
+
+ if (hOldConIn != INVALID_HANDLE_VALUE)
+ {
+ HANDLE hIn = GetStdHandle (STD_INPUT_HANDLE);
+ SetStdHandle (STD_INPUT_HANDLE, hOldConIn);
+ if (hIn == INVALID_HANDLE_VALUE)
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("Previous STDIN is invalid!!\n"));
+#endif
+ }
+ else
+ {
+ if (GetFileType (hIn) == FILE_TYPE_DISK)
+ {
+ if (hFile[0] == hIn)
+ {
+ CloseHandle (hFile[0]);
+ hFile[0] = INVALID_HANDLE_VALUE;
+ DeleteFile (szFileName[0]);
+ *szFileName[0] = _T('\0');
+ }
+ else
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("hFile[0] and hIn dont match!!!\n"));
+#endif
+ }
+ }
+ }
+ }
+
+
+ /* Restore original STDOUT */
+ if (hOldConOut != INVALID_HANDLE_VALUE)
+ {
+ HANDLE hOut = GetStdHandle (STD_OUTPUT_HANDLE);
+ SetStdHandle (STD_OUTPUT_HANDLE, hOldConOut);
+ if (hOldConOut != hOut)
+ CloseHandle (hOut);
+ hOldConOut = INVALID_HANDLE_VALUE;
+ }
+
+ /* Restore original STDERR */
+ if (hOldConErr != INVALID_HANDLE_VALUE)
+ {
+ HANDLE hErr = GetStdHandle (STD_ERROR_HANDLE);
+ SetStdHandle (STD_ERROR_HANDLE, hOldConErr);
+ if (hOldConErr != hErr)
+ CloseHandle (hErr);
+ hOldConErr = INVALID_HANDLE_VALUE;
+ }
+#endif /* FEATURE_REDIRECTION */
+}
+
+BOOL
+GrowIfNecessary ( UINT needed, LPTSTR* ret, UINT* retlen )
+{
+ if ( *ret && needed < *retlen )
+ return TRUE;
+ *retlen = needed;
+ if ( *ret )
+ free ( *ret );
+ *ret = (LPTSTR)malloc ( *retlen * sizeof(TCHAR) );
+ if ( !*ret )
+ SetLastError ( ERROR_OUTOFMEMORY );
+ return *ret != NULL;
+}
+
+LPCTSTR
+GetEnvVarOrSpecial ( LPCTSTR varName )
+{
+ static LPTSTR ret = NULL;
+ static UINT retlen = 0;
+ UINT size;
+
+ size = GetEnvironmentVariable ( varName, ret, retlen );
+ if ( size > retlen )
+ {
+ if ( !GrowIfNecessary ( size, &ret, &retlen ) )
+ return NULL;
+ size = GetEnvironmentVariable ( varName, ret, retlen );
+ }
+ if ( size )
+ return ret;
+
+ /* env var doesn't exist, look for a "special" one */
+ /* %CD% */
+ if (_tcsicmp(varName,_T("cd")) ==0)
+ {
+ size = GetCurrentDirectory ( retlen, ret );
+ if ( size > retlen )
+ {
+ if ( !GrowIfNecessary ( size, &ret, &retlen ) )
+ return NULL;
+ size = GetCurrentDirectory ( retlen, ret );
+ }
+ if ( !size )
+ return NULL;
+ return ret;
+ }
+ /* %TIME% */
+ else if (_tcsicmp(varName,_T("time")) ==0)
+ {
+ SYSTEMTIME t;
+ if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
+ return NULL;
+ GetSystemTime(&t);
+ _sntprintf ( ret, retlen, _T("%02d%c%02d%c%02d%c%02d"),
+ t.wHour, cTimeSeparator, t.wMinute, cTimeSeparator,
+ t.wSecond, cDecimalSeparator, t.wMilliseconds );
+ return ret;
+ }
+ /* %DATE% */
+ else if (_tcsicmp(varName,_T("date")) ==0)
+ {
+ LPTSTR tmp;
+
+ if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
+ return NULL;
+ size = GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, _T("ddd"), ret, retlen );
+ /* TODO FIXME - test whether GetDateFormat() can return a value indicating the buffer wasn't big enough */
+ if ( !size )
+ return NULL;
+ tmp = ret + _tcslen(ret);
+ *tmp++ = _T(' ');
+ size = GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, tmp, retlen-(tmp-ret));
+ /* TODO FIXME - test whether GetDateFormat() can return a value indicating the buffer wasn't big enough */
+ if ( !size )
+ return NULL;
+ return ret;
+ }
+
+ /* %RANDOM% */
+ else if (_tcsicmp(varName,_T("random")) ==0)
+ {
+ if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
+ return NULL;
+ /* Get random number */
+ _itot(rand(),ret,10);
+ return ret;
+ }
+
+ /* %CMDCMDLINE% */
+ else if (_tcsicmp(varName,_T("cmdcmdline")) ==0)
+ {
+ return GetCommandLine();
+ }
+
+ /* %CMDEXTVERSION% */
+ else if (_tcsicmp(varName,_T("cmdextversion")) ==0)
+ {
+ if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
+ return NULL;
+ /* Set version number to 2 */
+ _itot(2,ret,10);
+ return ret;
+ }
+
+ /* %ERRORLEVEL% */
+ else if (_tcsicmp(varName,_T("errorlevel")) ==0)
+ {
+ if ( !GrowIfNecessary ( MAX_PATH, &ret, &retlen ) )
+ return NULL;
+ _itot(nErrorLevel,ret,10);
+ return ret;
+ }
+
+ GrowIfNecessary(_tcslen(varName) + 2, &ret, &retlen);
+ _stprintf(ret,_T("%%%s%%"),varName);
+ return ret; /* not found - return orginal string */
+}
+
+LPCTSTR
+GetParsedEnvVar ( LPCTSTR varName, UINT* varNameLen, BOOL ModeSetA )
+{
+ static LPTSTR ret = NULL;
+ static UINT retlen = 0;
+ LPTSTR p, tmp;
+ UINT size;
+
+ if ( varNameLen )
+ *varNameLen = 0;
+ SetLastError(0);
+ if ( *varName++ != '%' )
+ return NULL;
+ switch ( *varName )
+ {
+ case _T('0'):
+ case _T('1'):
+ case _T('2'):
+ case _T('3'):
+ case _T('4'):
+ case _T('5'):
+ case _T('6'):
+ case _T('7'):
+ case _T('8'):
+ case _T('9'):
+ if ((tmp = FindArg (*varName - _T('0'))))
+ {
+ if ( varNameLen )
+ *varNameLen = 2;
+ if ( !*tmp )
+ return _T("");
+ if ( !GrowIfNecessary ( _tcslen(tmp)+1, &ret, &retlen ) )
+ return NULL;
+ _tcscpy ( ret, tmp );
+ return ret;
+ }
+ if ( !GrowIfNecessary ( 3, &ret, &retlen ) )
+ return NULL;
+ ret[0] = _T('%');
+ ret[1] = *varName;
+ ret[2] = 0;
+ if ( varNameLen )
+ *varNameLen = 2;
+ return ret;
+
+ case _T('%'):
+ if ( !GrowIfNecessary ( 2, &ret, &retlen ) )
+ return NULL;
+ ret[0] = _T('%');
+ ret[1] = 0;
+ if ( varNameLen )
+ *varNameLen = 2;
+ return ret;
+
+ case _T('?'):
+ /* TODO FIXME 10 is only max size for 32-bit */
+ if ( !GrowIfNecessary ( 11, &ret, &retlen ) )
+ return NULL;
+ _sntprintf ( ret, retlen, _T("%u"), nErrorLevel);
+ ret[retlen-1] = 0;
+ if ( varNameLen )
+ *varNameLen = 2;
+ return ret;
+ }
+ if ( ModeSetA )
+ {
+ /* HACK for set/a */
+ if ( !GrowIfNecessary ( 2, &ret, &retlen ) )
+ return NULL;
+ ret[0] = _T('%');
+ ret[1] = 0;
+ if ( varNameLen )
+ *varNameLen = 1;
+ return ret;
+ }
+ p = _tcschr ( varName, _T('%') );
+ if ( !p )
+ {
+ SetLastError ( ERROR_INVALID_PARAMETER );
+ return NULL;
+ }
+ size = p-varName;
+ if ( varNameLen )
+ *varNameLen = size + 2;
+ p = alloca ( (size+1) * sizeof(TCHAR) );
+ memmove ( p, varName, size * sizeof(TCHAR) );
+ p[size] = 0;
+ varName = p;
+ return GetEnvVarOrSpecial ( varName );
+}
+
+
+/*
+ * do the prompt/input/process loop
+ *
+ */
+
+static INT
+ProcessInput (BOOL bFlag)
+{
+ TCHAR commandline[CMDLINE_LENGTH];
+ TCHAR readline[CMDLINE_LENGTH];
+ LPTSTR ip;
+ LPTSTR cp;
+ LPCTSTR tmp;
+ BOOL bEchoThisLine;
+ BOOL bModeSetA;
+ BOOL bIsBatch;
+
+ do
+ {
+ /* if no batch input then... */
+ if (!(ip = ReadBatchLine (&bEchoThisLine)))
+ {
+ if (bFlag)
+ return nErrorLevel;
+
+ ReadCommand (readline, CMDLINE_LENGTH);
+ ip = readline;
+ bEchoThisLine = FALSE;
+ bIsBatch = FALSE;
+ }
+ else
+ {
+ bIsBatch = TRUE;
+ }
+
+ /* skip leading blanks */
+ while ( _istspace(*ip) )
+ ++ip;
+
+ cp = commandline;
+ bModeSetA = FALSE;
+ while (*ip)
+ {
+ if ( *ip == _T('%') )
+ {
+ UINT envNameLen;
+ LPCTSTR envVal = GetParsedEnvVar ( ip, &envNameLen, bModeSetA );
+ if ( envVal )
+ {
+ ip += envNameLen;
+ cp = _stpcpy ( cp, envVal );
+ }
+ }
+
+ if (_istcntrl (*ip))
+ *ip = _T(' ');
+ *cp++ = *ip++;
+
+ /* HACK HACK HACK check whether bModeSetA needs to be toggled */
+ *cp = 0;
+ tmp = commandline;
+ tmp += _tcsspn(tmp,_T(" \t"));
+ /* first we find and skip and pre-redirections... */
+ while (( tmp ) &&
+ ( _tcschr(_T("<>"),*tmp)
+ || !_tcsncmp(tmp,_T("1>"),2)
+ || !_tcsncmp(tmp,_T("2>"),2) ))
+ {
+ if ( _istdigit(*tmp) )
+ tmp += 2;
+ else
+ tmp++;
+ tmp += _tcsspn(tmp,_T(" \t"));
+ if ( *tmp == _T('\"') )
+ {
+ tmp = _tcschr(tmp+1,_T('\"'));
+ if ( tmp )
+ ++tmp;
+ }
+ else
+ tmp = _tcspbrk(tmp,_T(" \t"));
+ if ( tmp )
+ tmp += _tcsspn(tmp,_T(" \t"));
+ }
+ /* we should now be pointing to the actual command
+ * (if there is one yet)*/
+ if ( tmp )
+ {
+ /* if we're currently substituting ( which is default )
+ * check to see if we've parsed out a set/a. if so, we
+ * need to disable substitution until we come across a
+ * redirection */
+ if ( !bModeSetA )
+ {
+ /* look for set /a */
+ if ( !_tcsnicmp(tmp,_T("set"),3) )
+ {
+ tmp += 3;
+ tmp += _tcsspn(tmp,_T(" \t"));
+ if ( !_tcsnicmp(tmp,_T("/a"),2) )
+ bModeSetA = TRUE;
+ }
+ }
+ /* if we're not currently substituting, it means we're
+ * already inside a set /a. now we need to look for
+ * a redirection in order to turn redirection back on */
+ else
+ {
+ /* look for redirector of some kind after the command */
+ while ( (tmp = _tcspbrk ( tmp, _T("^<>|") )) )
+ {
+ if ( *tmp == _T('^') )
+ {
+ if ( _tcschr(_T("<>|&"), *++tmp ) && *tmp )
+ ++tmp;
+ }
+ else
+ {
+ bModeSetA = FALSE;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ *cp = _T('\0');
+
+ /* strip trailing spaces */
+ while ((--cp >= commandline) && _istspace (*cp));
+
+ *(cp + 1) = _T('\0');
+
+ /* JPP 19980807 */
+ /* Echo batch file line */
+ if (bEchoThisLine)
+ {
+ PrintPrompt ();
+ ConOutPuts (commandline);
+ }
+
+ if (!CheckCtrlBreak(BREAK_INPUT) && *commandline)
+ {
+ ParseCommandLine (commandline);
+ if (bEcho && !bIgnoreEcho && (!bIsBatch || bEchoThisLine))
+ ConOutChar ('\n');
+ bIgnoreEcho = FALSE;
+ }
+ }
+ while (!bCanExit || !bExit);
+
+ return nErrorLevel;
+}
+
+
+/*
+ * control-break handler.
+ */
+BOOL WINAPI BreakHandler (DWORD dwCtrlType)
+{
+
+ DWORD dwWritten;
+ INPUT_RECORD rec;
+ static BOOL SelfGenerated = FALSE;
+
+ if ((dwCtrlType != CTRL_C_EVENT) &&
+ (dwCtrlType != CTRL_BREAK_EVENT))
+ {
+ return FALSE;
+ }
+ else
+ {
+ if(SelfGenerated)
+ {
+ SelfGenerated = FALSE;
+ return TRUE;
+ }
+ }
+
+ if (bChildProcessRunning == TRUE)
+ {
+ SelfGenerated = TRUE;
+ GenerateConsoleCtrlEvent (dwCtrlType, 0);
+ return TRUE;
+ }
+
+
+ rec.EventType = KEY_EVENT;
+ rec.Event.KeyEvent.bKeyDown = TRUE;
+ rec.Event.KeyEvent.wRepeatCount = 1;
+ rec.Event.KeyEvent.wVirtualKeyCode = _T('C');
+ rec.Event.KeyEvent.wVirtualScanCode = _T('C') - 35;
+ rec.Event.KeyEvent.uChar.AsciiChar = _T('C');
+ rec.Event.KeyEvent.uChar.UnicodeChar = _T('C');
+ rec.Event.KeyEvent.dwControlKeyState = RIGHT_CTRL_PRESSED;
+
+ WriteConsoleInput(
+ hIn,
+ &rec,
+ 1,
+ &dwWritten);
+
+ bCtrlBreak = TRUE;
+ /* FIXME: Handle batch files */
+
+ //ConOutPrintf(_T("^C"));
+
+
+ return TRUE;
+}
+
+
+VOID AddBreakHandler (VOID)
+{
+ SetConsoleCtrlHandler ((PHANDLER_ROUTINE)BreakHandler, TRUE);
+}
+
+
+VOID RemoveBreakHandler (VOID)
+{
+ SetConsoleCtrlHandler ((PHANDLER_ROUTINE)BreakHandler, FALSE);
+}
+
+
+/*
+ * show commands and options that are available.
+ *
+ */
+#if 0
+static VOID
+ShowCommands (VOID)
+{
+ /* print command list */
+ ConOutResPuts(STRING_CMD_HELP1);
+ PrintCommandList();
+
+ /* print feature list */
+ ConOutResPuts(STRING_CMD_HELP2);
+
+#ifdef FEATURE_ALIASES
+ ConOutResPuts(STRING_CMD_HELP3);
+#endif
+#ifdef FEATURE_HISTORY
+ ConOutResPuts(STRING_CMD_HELP4);
+#endif
+#ifdef FEATURE_UNIX_FILENAME_COMPLETION
+ ConOutResPuts(STRING_CMD_HELP5);
+#endif
+#ifdef FEATURE_DIRECTORY_STACK
+ ConOutResPuts(STRING_CMD_HELP6);
+#endif
+#ifdef FEATURE_REDIRECTION
+ ConOutResPuts(STRING_CMD_HELP7);
+#endif
+ ConOutChar(_T('\n'));
+}
+#endif
+
+/*
+ * set up global initializations and process parameters
+ *
+ * argc - number of parameters to command.com
+ * argv - command-line parameters
+ *
+ */
+static VOID
+Initialize (int argc, TCHAR* argv[])
+{
+ TCHAR commandline[CMDLINE_LENGTH];
+ TCHAR ModuleName[_MAX_PATH + 1];
+ INT i;
+ TCHAR lpBuffer[2];
+
+ //INT len;
+ //TCHAR *ptr, *cmdLine;
+
+ /* get version information */
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx (&osvi);
+
+ /* Some people like to run ReactOS cmd.exe on Win98, it helps in the
+ * build process. So don't link implicitly against ntdll.dll, load it
+ * dynamically instead */
+
+ if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ {
+ /* ntdll is always present on NT */
+ NtDllModule = GetModuleHandle(TEXT("ntdll.dll"));
+ }
+ else
+ {
+ /* not all 9x versions have a ntdll.dll, try to load it */
+ NtDllModule = LoadLibrary(TEXT("ntdll.dll"));
+ }
+
+ if (NtDllModule != NULL)
+ {
+ NtQueryInformationProcessPtr = (NtQueryInformationProcessProc)GetProcAddress(NtDllModule, "NtQueryInformationProcess");
+ NtReadVirtualMemoryPtr = (NtReadVirtualMemoryProc)GetProcAddress(NtDllModule, "NtReadVirtualMemory");
+ }
+
+
+#ifdef _DEBUG
+ DebugPrintf (_T("[command args:\n"));
+ for (i = 0; i < argc; i++)
+ {
+ DebugPrintf (_T("%d. %s\n"), i, argv[i]);
+ }
+ DebugPrintf (_T("]\n"));
+#endif
+
+ InitLocale ();
+
+ /* get default input and output console handles */
+ hOut = GetStdHandle (STD_OUTPUT_HANDLE);
+ hIn = GetStdHandle (STD_INPUT_HANDLE);
+
+ /* Set EnvironmentVariable PROMPT if it does not exists any env value.
+ for you can change the EnvirommentVariable for prompt before cmd start
+ this patch are not 100% right, if it does not exists a PROMPT value cmd should use
+ $P$G as defualt not set EnvirommentVariable PROMPT to $P$G if it does not exists */
+ if (GetEnvironmentVariable(_T("PROMPT"),lpBuffer, sizeof(lpBuffer) / sizeof(lpBuffer[0])) == 0)
+ SetEnvironmentVariable (_T("PROMPT"), _T("$P$G"));
+
+
+ if (argc >= 2 && !_tcsncmp (argv[1], _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_CMD_HELP8);
+ ExitProcess(0);
+ }
+ SetConsoleMode (hIn, ENABLE_PROCESSED_INPUT);
+
+#ifdef INCLUDE_CMD_CHDIR
+ InitLastPath ();
+#endif
+
+#ifdef FATURE_ALIASES
+ InitializeAlias ();
+#endif
+
+ if (argc >= 2)
+ {
+ for (i = 1; i < argc; i++)
+ {
+ if (!_tcsicmp (argv[i], _T("/p")))
+ {
+ if (!IsExistingFile (_T("\\autoexec.bat")))
+ {
+#ifdef INCLUDE_CMD_DATE
+ cmd_date (_T(""), _T(""));
+#endif
+#ifdef INCLUDE_CMD_TIME
+ cmd_time (_T(""), _T(""));
+#endif
+ }
+ else
+ {
+ ParseCommandLine (_T("\\autoexec.bat"));
+ }
+ bCanExit = FALSE;
+ }
+ else if (!_tcsicmp (argv[i], _T("/c")))
+ {
+ /* This just runs a program and exits */
+ ++i;
+ if (i < argc)
+ {
+ _tcscpy (commandline, argv[i]);
+ while (++i < argc)
+ {
+ _tcscat (commandline, _T(" "));
+ _tcscat (commandline, argv[i]);
+ }
+
+ ParseCommandLine(commandline);
+ ExitProcess (ProcessInput (TRUE));
+ }
+ else
+ {
+ ExitProcess (0);
+ }
+ }
+ else if (!_tcsicmp (argv[i], _T("/k")))
+ {
+ /* This just runs a program and remains */
+ ++i;
+ if (i < argc)
+ {
+ _tcscpy (commandline, _T("\""));
+ _tcscat (commandline, argv[i]);
+ _tcscat (commandline, _T("\""));
+ while (++i < argc)
+ {
+ _tcscat (commandline, _T(" "));
+ _tcscat (commandline, argv[i]);
+ }
+ ParseCommandLine(commandline);
+ }
+ }
+#ifdef INCLUDE_CMD_COLOR
+ else if (!_tcsnicmp (argv[i], _T("/t:"), 3))
+ {
+ /* process /t (color) argument */
+ wDefColor = (WORD)_tcstoul (&argv[i][3], NULL, 16);
+ wColor = wDefColor;
+ SetScreenColor (wColor, TRUE);
+ }
+#endif
+ }
+ }
+
+ /* run cmdstart.bat */
+ if (IsExistingFile (_T("cmdstart.bat")))
+ {
+ ParseCommandLine (_T("cmdstart.bat"));
+ }
+ else if (IsExistingFile (_T("\\cmdstart.bat")))
+ {
+ ParseCommandLine (_T("\\cmdstart.bat"));
+ }
+
+#ifdef FEATURE_DIR_STACK
+ /* initialize directory stack */
+ InitDirectoryStack ();
+#endif
+
+
+#ifdef FEATURE_HISTORY
+ /*initialize history*/
+ InitHistory();
+#endif
+
+ /* Set COMSPEC environment variable */
+ if (0 != GetModuleFileName (NULL, ModuleName, _MAX_PATH + 1))
+ {
+ ModuleName[_MAX_PATH] = _T('\0');
+ SetEnvironmentVariable (_T("COMSPEC"), ModuleName);
+ }
+
+ /* add ctrl break handler */
+ AddBreakHandler ();
+}
+
+
+static VOID Cleanup (int argc, TCHAR *argv[])
+{
+ /* run cmdexit.bat */
+ if (IsExistingFile (_T("cmdexit.bat")))
+ {
+ ConErrResPuts(STRING_CMD_ERROR5);
+
+ ParseCommandLine (_T("cmdexit.bat"));
+ }
+ else if (IsExistingFile (_T("\\cmdexit.bat")))
+ {
+ ConErrResPuts (STRING_CMD_ERROR5);
+ ParseCommandLine (_T("\\cmdexit.bat"));
+ }
+
+#ifdef FEATURE_ALIASES
+ DestroyAlias ();
+#endif
+
+#ifdef FEATURE_DIECTORY_STACK
+ /* destroy directory stack */
+ DestroyDirectoryStack ();
+#endif
+
+#ifdef INCLUDE_CMD_CHDIR
+ FreeLastPath ();
+#endif
+
+#ifdef FEATURE_HISTORY
+ CleanHistory();
+#endif
+
+
+ /* remove ctrl break handler */
+ RemoveBreakHandler ();
+ SetConsoleMode( GetStdHandle( STD_INPUT_HANDLE ),
+ ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT );
+
+ if (NtDllModule != NULL)
+ {
+ FreeLibrary(NtDllModule);
+ }
+}
+
+/*
+ * main function
+ */
+#ifdef _UNICODE
+int _main(void)
+#else
+int _main (int argc, char *argv[])
+#endif
+{
+ TCHAR startPath[MAX_PATH];
+ CONSOLE_SCREEN_BUFFER_INFO Info;
+ INT nExitCode;
+#ifdef _UNICODE
+ PWCHAR * argv;
+ int argc=0;
+ argv = CommandLineToArgvW(GetCommandLineW(), &argc);
+#endif
+
+ GetCurrentDirectory(MAX_PATH,startPath);
+ _tchdir(startPath);
+
+ SetFileApisToOEM();
+ InputCodePage= 0;
+ OutputCodePage = 0;
+
+ hConsole = CreateFile(_T("CONOUT$"), GENERIC_READ|GENERIC_WRITE,
+ FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, 0, NULL);
+ if (GetConsoleScreenBufferInfo(hConsole, &Info) == FALSE)
+ {
+ ConErrFormatMessage(GetLastError());
+ return(1);
+ }
+ wColor = Info.wAttributes;
+ wDefColor = wColor;
+
+ InputCodePage= GetConsoleCP();
+ OutputCodePage = GetConsoleOutputCP();
+ CMD_ModuleHandle = GetModuleHandle(NULL);
+
+ /* check switches on command-line */
+ Initialize(argc, argv);
+
+ /* call prompt routine */
+ nExitCode = ProcessInput(FALSE);
+
+ /* do the cleanup */
+ Cleanup(argc, argv);
+
+ return(nExitCode);
+}
+
+/* EOF */
--- /dev/null
+/*
+ * CMD.H - header file for the modules in CMD.EXE
+ *
+ *
+ * History:
+ *
+ * 7-15-95 Tim Norman
+ * started
+ *
+ * 06/29/98 (Rob Lake)
+ * Moved error messages in here
+ *
+ * 07/12/98 (Rob Lake)
+ * Moved more error messages here.
+ *
+ * 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * Added compile date to version.
+ *
+ * 26-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Introduced a new version string.
+ * Thanks to Emanuele Aliberti!
+ */
+
+#ifndef _CMD_H_INCLUDED_
+#define _CMD_H_INCLUDED_
+
+#include "config.h"
+
+#include <windows.h>
+#include <tchar.h>
+
+#include "cmdver.h"
+
+#define BREAK_BATCHFILE 1
+#define BREAK_OUTOFBATCH 2
+#define BREAK_INPUT 3
+#define BREAK_IGNORE 4
+
+/* define some error messages */
+
+#define D_ON _T("on")
+#define D_OFF _T("off")
+
+
+/* command line buffer length */
+#define CMDLINE_LENGTH 8192
+
+/* global variables */
+extern HANDLE hOut;
+extern HANDLE hIn;
+extern HANDLE hConsole;
+extern WORD wColor;
+extern WORD wDefColor;
+extern BOOL bCtrlBreak;
+extern BOOL bIgnoreEcho;
+extern BOOL bExit;
+extern INT nErrorLevel;
+extern SHORT maxx;
+extern SHORT maxy;
+extern OSVERSIONINFO osvi;
+
+
+
+/* Prototypes for ALIAS.C */
+VOID InitializeAlias (VOID);
+VOID DestroyAlias (VOID);
+VOID ExpandAlias (LPTSTR, INT);
+INT CommandAlias (LPTSTR, LPTSTR);
+
+
+/* Prototypes for ATTRIB.C */
+INT CommandAttrib (LPTSTR, LPTSTR);
+
+
+/* Prototypes for BEEP.C */
+INT cmd_beep (LPTSTR, LPTSTR);
+
+
+/* Prototypes for CALL.C */
+INT cmd_call (LPTSTR, LPTSTR);
+
+
+/* Prototypes for CHCP.C */
+INT CommandChcp (LPTSTR, LPTSTR);
+
+
+/* Prototypes for CHOICE.C */
+INT CommandChoice (LPTSTR, LPTSTR);
+
+
+/* Prototypes for CLS.C */
+INT cmd_cls (LPTSTR, LPTSTR);
+
+
+/* Prototypes for CMD.C */
+INT ConvertULargeInteger (ULARGE_INTEGER num, LPTSTR des, INT len, BOOL bPutSeperator);
+VOID ParseCommandLine (LPTSTR);
+LPCTSTR GetEnvVarOrSpecial ( LPCTSTR varName );
+VOID AddBreakHandler (VOID);
+VOID RemoveBreakHandler (VOID);
+
+extern HANDLE CMD_ModuleHandle;
+
+
+/* Prototypes for CMDINPUT.C */
+VOID ReadCommand (LPTSTR, INT);
+
+
+/* Prototypes for CMDTABLE.C */
+#define CMD_SPECIAL 1
+#define CMD_BATCHONLY 2
+#define CMD_HIDE 4
+
+typedef struct tagCOMMAND
+{
+ LPTSTR name;
+ INT flags;
+ INT (*func) (LPTSTR, LPTSTR);
+} COMMAND, *LPCOMMAND;
+
+extern COMMAND cmds[]; /* The internal command table */
+
+VOID PrintCommandList (VOID);
+VOID PrintCommandListDetail (VOID);
+
+
+/* Prototypes for COLOR.C */
+VOID SetScreenColor(WORD wArgColor, BOOL bFill);
+INT CommandColor (LPTSTR, LPTSTR);
+
+
+/* Prototypes for CONSOLE.C */
+#ifdef _DEBUG
+VOID DebugPrintf (LPTSTR, ...);
+#endif /* _DEBUG */
+
+VOID ConInDummy (VOID);
+VOID ConInDisable (VOID);
+VOID ConInEnable (VOID);
+VOID ConInFlush (VOID);
+VOID ConInKey (PINPUT_RECORD);
+VOID ConInString (LPTSTR, DWORD);
+
+VOID ConOutChar (TCHAR);
+VOID ConOutPuts (LPTSTR);
+VOID ConOutPrintf (LPTSTR, ...);
+INT ConOutPrintfPaging (BOOL NewPage, LPTSTR, ...);
+VOID ConErrChar (TCHAR);
+VOID ConErrPuts (LPTSTR);
+VOID ConErrPrintf (LPTSTR, ...);
+VOID ConOutFormatMessage (DWORD MessageId, ...);
+VOID ConErrFormatMessage (DWORD MessageId, ...);
+
+SHORT GetCursorX (VOID);
+SHORT GetCursorY (VOID);
+VOID GetCursorXY (PSHORT, PSHORT);
+VOID SetCursorXY (SHORT, SHORT);
+
+VOID GetScreenSize (PSHORT, PSHORT);
+VOID SetCursorType (BOOL, BOOL);
+
+VOID ConOutResPuts (UINT resID);
+VOID ConErrResPuts (UINT resID);
+VOID ConOutResPaging(BOOL NewPage, UINT resID);
+
+/* Prototypes for COPY.C */
+INT cmd_copy (LPTSTR, LPTSTR);
+
+
+/* Prototypes for DATE.C */
+INT cmd_date (LPTSTR, LPTSTR);
+
+
+/* Prototypes for DEL.C */
+INT CommandDelete (LPTSTR, LPTSTR);
+
+
+/* Prototypes for DELAY.C */
+INT CommandDelay (LPTSTR, LPTSTR);
+
+
+/* Prototypes for DIR.C */
+INT CommandDir (LPTSTR, LPTSTR);
+
+
+/* Prototypes for DIRSTACK.C */
+VOID InitDirectoryStack (VOID);
+VOID DestroyDirectoryStack (VOID);
+INT GetDirectoryStackDepth (VOID);
+INT CommandPushd (LPTSTR, LPTSTR);
+INT CommandPopd (LPTSTR, LPTSTR);
+INT CommandDirs (LPTSTR, LPTSTR);
+
+
+/* Prototypes for ECHO.C */
+INT CommandEcho (LPTSTR, LPTSTR);
+INT CommandEchos (LPTSTR, LPTSTR);
+INT CommandEchoerr (LPTSTR, LPTSTR);
+INT CommandEchoserr (LPTSTR, LPTSTR);
+
+
+/* Prototypes for ERROR.C */
+VOID ErrorMessage (DWORD, LPTSTR, ...);
+
+VOID error_no_pipe (VOID);
+VOID error_bad_command (VOID);
+VOID error_invalid_drive (VOID);
+VOID error_req_param_missing (VOID);
+VOID error_sfile_not_found (LPTSTR);
+VOID error_file_not_found (VOID);
+VOID error_path_not_found (VOID);
+VOID error_too_many_parameters (LPTSTR);
+VOID error_parameter_format(TCHAR);
+VOID error_invalid_switch (TCHAR);
+VOID error_invalid_parameter_format (LPTSTR);
+VOID error_out_of_memory (VOID);
+VOID error_syntax (LPTSTR);
+
+VOID msg_pause (VOID);
+
+
+/* Prototypes for FILECOMP.C */
+#ifdef FEATURE_UNIX_FILENAME_COMPLETION
+VOID CompleteFilename (LPTSTR, UINT);
+INT ShowCompletionMatches (LPTSTR, INT);
+#endif
+#ifdef FEATURE_4NT_FILENAME_COMPLETION
+VOID CompleteFilename (LPTSTR, BOOL, LPTSTR, UINT);
+#endif
+
+
+/* Prototypes for FOR.C */
+INT cmd_for (LPTSTR, LPTSTR);
+
+
+/* Prototypes for FREE.C */
+INT CommandFree (LPTSTR, LPTSTR);
+
+
+/* Prototypes for GOTO.C */
+INT cmd_goto (LPTSTR, LPTSTR);
+
+
+/* Prototypes for HISTORY.C */
+#ifdef FEATURE_HISTORY
+VOID History (INT, LPTSTR);/*add entries browse history*/
+VOID History_move_to_bottom(VOID);/*F3*/
+VOID InitHistory(VOID);
+VOID CleanHistory(VOID);
+VOID History_del_current_entry(LPTSTR str);/*CTRL-D*/
+INT CommandHistory (LPTSTR cmd, LPTSTR param);
+#endif
+
+
+/* Prototypes for INTERNAL.C */
+VOID InitLastPath (VOID);
+VOID FreeLastPath (VOID);
+INT cmd_chdir (LPTSTR, LPTSTR);
+INT cmd_mkdir (LPTSTR, LPTSTR);
+INT cmd_rmdir (LPTSTR, LPTSTR);
+INT CommandExit (LPTSTR, LPTSTR);
+INT CommandRem (LPTSTR, LPTSTR);
+INT CommandShowCommands (LPTSTR, LPTSTR);
+INT CommandShowCommandsDetail (LPTSTR, LPTSTR);
+
+/* Prototypes for LABEL.C */
+INT cmd_label (LPTSTR, LPTSTR);
+
+
+/* Prototypes for LOCALE.C */
+extern TCHAR cDateSeparator;
+extern INT nDateFormat;
+extern TCHAR cTimeSeparator;
+extern INT nTimeFormat;
+extern TCHAR cThousandSeparator;
+extern TCHAR cDecimalSeparator;
+extern INT nNumberGroups;
+
+
+VOID InitLocale (VOID);
+VOID PrintDate (VOID);
+VOID PrintTime (VOID);
+
+/* cache codepage */
+extern UINT InputCodePage;
+extern UINT OutputCodePage;
+
+/* Prototypes for MEMORY.C */
+INT CommandMemory (LPTSTR, LPTSTR);
+
+
+/* Prototypes for MISC.C */
+INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size);
+BOOL SetRootPath(TCHAR *InPath);
+TCHAR cgetchar (VOID);
+BOOL CheckCtrlBreak (INT);
+BOOL add_entry (LPINT ac, LPTSTR **arg, LPCTSTR entry);
+LPTSTR *split (LPTSTR, LPINT, BOOL);
+VOID freep (LPTSTR *);
+LPTSTR _stpcpy (LPTSTR, LPCTSTR);
+BOOL IsValidPathName (LPCTSTR);
+BOOL IsExistingFile (LPCTSTR);
+BOOL IsExistingDirectory (LPCTSTR);
+BOOL FileGetString (HANDLE, LPTSTR, INT);
+VOID GetPathCase(TCHAR *, TCHAR *);
+
+#define PROMPT_NO 0
+#define PROMPT_YES 1
+#define PROMPT_ALL 2
+#define PROMPT_BREAK 3
+
+INT PagePrompt (VOID);
+INT FilePromptYN (LPTSTR, ...);
+INT FilePromptYNA (LPTSTR, ...);
+
+
+/* Prototypes for MOVE.C */
+INT cmd_move (LPTSTR, LPTSTR);
+
+
+/* Prototypes for MSGBOX.C */
+INT CommandMsgbox (LPTSTR, LPTSTR);
+
+
+/* Prototypes from PATH.C */
+INT cmd_path (LPTSTR, LPTSTR);
+
+
+/* Prototypes from PROMPT.C */
+VOID PrintPrompt (VOID);
+INT cmd_prompt (LPTSTR, LPTSTR);
+
+
+/* Prototypes for REDIR.C */
+#define INPUT_REDIRECTION 1
+#define OUTPUT_REDIRECTION 2
+#define OUTPUT_APPEND 4
+#define ERROR_REDIRECTION 8
+#define ERROR_APPEND 16
+INT GetRedirection (LPTSTR, LPTSTR, LPTSTR, LPTSTR, LPINT);
+
+
+/* Prototypes for REN.C */
+INT cmd_rename (LPTSTR, LPTSTR);
+
+
+/* Prototypes for SCREEN.C */
+INT CommandScreen (LPTSTR, LPTSTR);
+
+
+/* Prototypes for SET.C */
+INT cmd_set (LPTSTR, LPTSTR);
+
+
+/* Prototypes for START.C */
+INT cmd_start (LPTSTR, LPTSTR);
+
+
+/* Prototypes for STRTOCLR.C */
+BOOL StringToColor (LPWORD, LPTSTR *);
+
+
+/* Prototypes for TIME.C */
+INT cmd_time (LPTSTR, LPTSTR);
+
+
+/* Prototypes for TIMER.C */
+INT CommandTimer (LPTSTR cmd, LPTSTR param);
+
+
+/* Prototypes for TITLE.C */
+INT cmd_title (LPTSTR, LPTSTR);
+
+
+/* Prototypes for TYPE.C */
+INT cmd_type (LPTSTR, LPTSTR);
+
+
+/* Prototypes for VER.C */
+VOID ShortVersion (VOID);
+INT cmd_ver (LPTSTR, LPTSTR);
+
+
+/* Prototypes for VERIFY.C */
+INT cmd_verify (LPTSTR, LPTSTR);
+
+
+/* Prototypes for VOL.C */
+INT cmd_vol (LPTSTR, LPTSTR);
+
+
+/* Prototypes for WHERE.C */
+BOOL SearchForExecutable (LPCTSTR, LPTSTR);
+
+/* Prototypes for WINDOW.C */
+INT CommandActivate (LPTSTR, LPTSTR);
+INT CommandWindow (LPTSTR, LPTSTR);
+
+
+/* The MSDOS Batch Commands [MS-DOS 5.0 User's Guide and Reference p359] */
+int cmd_if(TCHAR *, TCHAR *);
+int cmd_pause(TCHAR *, TCHAR *);
+int cmd_shift(TCHAR *, TCHAR *);
+
+#endif /* _CMD_H_INCLUDED_ */
--- /dev/null
+#include <windows.h>
+#include "cmdver.h"
+
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Command Processor\0"
+#define REACTOS_STR_INTERNAL_NAME "cmd\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "cmd.exe\0"
+#define REACTOS_STR_ORIGINAL_COPYRIGHT "Copyright (C) 1994-1998 Tim Norman and others\0"
+#define REACTOS_STR_LEGAL_COPYRIGHT "Copyright (C) 1998-2006 Eric Kohl and others\0"
+
+#include <reactos/version.rc>
+#include "En.rc"
+#include "Fr.rc"
+#include "De.rc"
+#include "Es.rc"
+#include "Ru.rc"
+#include "Ja.rc"
+#include "Hu.rc"
+
+
+STRINGTABLE DISCARDABLE
+{
+ STRING_FREEDOS_DEV, " Tim Norman Matt Rains\n\
+ Evan Jeffrey Steffen Kaiser\n\
+ Svante Frey Oliver Mueller\n\
+ Aaron Kaufman Marc Desrochers\n\
+ Rob Lake John P Price\n\
+ Hans B Pufal\n"
+
+ STRING_REACTOS_DEV, " Eric Kohl Emanuele Aliberti\n\
+ Paolo Pantaleo Phillip Susi\n\
+ Sylvain Petreolle\n"
+}
+
+1 ICON DISCARDABLE res/terminal.ico
+
+
+
+
+
--- /dev/null
+<module name="cmd_base" type="objectlibrary">
+ <include base="ReactOS">include/wine</include>
+ <include base="cmd_base">.</include>
+ <define name="__USE_W32API" />
+ <define name="ANONYMOUSUNIONS" />
+ <define name="_WIN32_WINNT">0x0501</define>
+ <pch>precomp.h</pch>
+ <compilationunit name="unit.c">
+ <file>alias.c</file>
+ <file>attrib.c</file>
+ <file>batch.c</file>
+ <file>beep.c</file>
+ <file>call.c</file>
+ <file>chcp.c</file>
+ <file>choice.c</file>
+ <file>cls.c</file>
+ <file>cmd.c</file>
+ <file>cmdinput.c</file>
+ <file>cmdtable.c</file>
+ <file>color.c</file>
+ <file>console.c</file>
+ <file>copy.c</file>
+ <file>date.c</file>
+ <file>del.c</file>
+ <file>delay.c</file>
+ <file>dir.c</file>
+ <file>dirstack.c</file>
+ <file>echo.c</file>
+ <file>error.c</file>
+ <file>filecomp.c</file>
+ <file>for.c</file>
+ <file>free.c</file>
+ <file>goto.c</file>
+ <file>history.c</file>
+ <file>if.c</file>
+ <file>internal.c</file>
+ <file>label.c</file>
+ <file>locale.c</file>
+ <file>memory.c</file>
+ <file>misc.c</file>
+ <file>move.c</file>
+ <file>msgbox.c</file>
+ <file>path.c</file>
+ <file>pause.c</file>
+ <file>prompt.c</file>
+ <file>redir.c</file>
+ <file>ren.c</file>
+ <file>screen.c</file>
+ <file>set.c</file>
+ <file>shift.c</file>
+ <file>start.c</file>
+ <file>strtoclr.c</file>
+ <file>time.c</file>
+ <file>timer.c</file>
+ <file>title.c</file>
+ <file>type.c</file>
+ <file>ver.c</file>
+ <file>verify.c</file>
+ <file>vol.c</file>
+ <file>where.c</file>
+ <file>window.c</file>
+ </compilationunit>
+</module>
+<module name="cmd" type="win32cui" installbase="system32" installname="cmd.exe" usewrc="false">
+ <include base="ReactOS">include/wine</include>
+ <include base="cmd">.</include>
+ <define name="__USE_W32API" />
+ <define name="ANONYMOUSUNIONS" />
+ <define name="_WIN32_WINNT">0x0501</define>
+ <library>kernel32</library>
+ <library>cmd_base</library>
+ <file>main.c</file>
+ <file>cmd.rc</file>
+</module>
+<directory name="tests">
+ <xi:include href="tests/cmd_test.xml" />
+</directory>
--- /dev/null
+/*
+ * CMDINPUT.C - handles command input (tab completion, history, etc.).
+ *
+ *
+ * History:
+ *
+ * 01/14/95 (Tim Norman)
+ * started.
+ *
+ * 08/08/95 (Matt Rains)
+ * i have cleaned up the source code. changes now bring this source
+ * into guidelines for recommended programming practice.
+ * i have added some constants to help making changes easier.
+ *
+ * 12/12/95 (Tim Norman)
+ * added findxy() function to get max x/y coordinates to display
+ * correctly on larger screens
+ *
+ * 12/14/95 (Tim Norman)
+ * fixed the Tab completion code that Matt Rains broke by moving local
+ * variables to a more global scope and forgetting to initialize them
+ * when needed
+ *
+ * 8/1/96 (Tim Norman)
+ * fixed a bug in tab completion that caused filenames at the beginning
+ * of the command-line to have their first letter truncated
+ *
+ * 9/1/96 (Tim Norman)
+ * fixed a silly bug using printf instead of fputs, where typing "%i"
+ * confused printf :)
+ *
+ * 6/14/97 (Steffan Kaiser)
+ * ctrl-break checking
+ *
+ * 6/7/97 (Marc Desrochers)
+ * recoded everything! now properly adjusts when text font is changed.
+ * removed findxy(), reposition(), and reprint(), as these functions
+ * were inefficient. added goxy() function as gotoxy() was buggy when
+ * the screen font was changed. the printf() problem with %i on the
+ * command line was fixed by doing printf("%s",str) instead of
+ * printf(str). Don't ask how I find em just be glad I do :)
+ *
+ * 7/12/97 (Tim Norman)
+ * Note: above changes pre-empted Steffan's ctrl-break checking.
+ *
+ * 7/7/97 (Marc Desrochers)
+ * rewrote a new findxy() because the new dir() used it. This
+ * findxy() simply returns the values of *maxx *maxy. In the
+ * future, please use the pointers, they will always be correct
+ * since they point to BIOS values.
+ *
+ * 7/8/97 (Marc Desrochers)
+ * once again removed findxy(), moved the *maxx, *maxy pointers
+ * global and included them as externs in command.h. Also added
+ * insert/overstrike capability
+ *
+ * 7/13/97 (Tim Norman)
+ * added different cursor appearance for insert/overstrike mode
+ *
+ * 7/13/97 (Tim Norman)
+ * changed my code to use _setcursortype until I can figure out why
+ * my code is crashing on some machines. It doesn't crash on mine :)
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 28-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * put ifdef's around filename completion code.
+ *
+ * 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * moved filename completion code to filecomp.c
+ * made second TAB display list of filename matches
+ *
+ * 31-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * Fixed bug where if you typed something, then hit HOME, then tried
+ * to type something else in insert mode, it crashed.
+ *
+ * 07-Aug-1998 (John P Price <linux-guru@gcfl.net>)
+ * Fixed carrage return output to better match MSDOS with echo
+ * on or off.(marked with "JPP 19980708")
+ *
+ * 13-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added insert/overwrite cursor.
+ *
+ * 25-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Replaced CRT io functions by Win32 console io functions.
+ * This can handle <Shift>-<Tab> for 4NT filename completion.
+ * Unicode and redirection safe!
+ *
+ * 04-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed input bug. A "line feed" character remained in the keyboard
+ * input queue when you pressed <RETURN>. This sometimes caused
+ * some very strange effects.
+ * Fixed some command line editing annoyances.
+ *
+ * 30-Apr-2004 (Filip Navara <xnavara@volny.cz>)
+ * Fixed problems when the screen was scrolled away.
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+SHORT maxx;
+SHORT maxy;
+
+/*
+ * global command line insert/overwrite flag
+ */
+static BOOL bInsert = TRUE;
+
+
+static VOID
+ClearCommandLine (LPTSTR str, INT maxlen, SHORT orgx, SHORT orgy)
+{
+ INT count;
+
+ SetCursorXY (orgx, orgy);
+ for (count = 0; count < (INT)_tcslen (str); count++)
+ ConOutChar (_T(' '));
+ _tcsnset (str, _T('\0'), maxlen);
+ SetCursorXY (orgx, orgy);
+}
+
+
+/* read in a command line */
+VOID ReadCommand (LPTSTR str, INT maxlen)
+{
+ SHORT orgx; /* origin x/y */
+ SHORT orgy;
+ SHORT curx; /*current x/y cursor position*/
+ SHORT cury;
+ SHORT tempscreen;
+ INT count; /*used in some for loops*/
+ INT current = 0; /*the position of the cursor in the string (str)*/
+ INT charcount = 0;/*chars in the string (str)*/
+ INPUT_RECORD ir;
+ WORD wLastKey = 0;
+ TCHAR ch;
+ BOOL bContinue=FALSE;/*is TRUE the second case will not be executed*/
+ BOOL bReturn = FALSE;
+ TCHAR szPath[MAX_PATH];
+ BOOL bCharInput;
+
+ /* get screen size */
+ GetScreenSize (&maxx, &maxy);
+
+ /* JPP 19980807 - if echo off, don't print prompt */
+ if (bEcho)
+ PrintPrompt();
+
+ GetCursorXY (&orgx, &orgy);
+ GetCursorXY (&curx, &cury);
+
+ memset (str, 0, maxlen * sizeof (TCHAR));
+
+ SetCursorType (bInsert, TRUE);
+
+ do
+ {
+
+ bReturn = FALSE;
+
+ ConInKey (&ir);
+
+ if (ir.Event.KeyEvent.dwControlKeyState &
+ (RIGHT_ALT_PRESSED|RIGHT_ALT_PRESSED|
+ RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED) )
+ {
+
+ switch (ir.Event.KeyEvent.wVirtualKeyCode)
+ {
+
+#ifdef FEATURE_HISTORY
+
+ case 'K':
+ /*add the current command line to the history*/
+ if (ir.Event.KeyEvent.dwControlKeyState &
+ (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED))
+ {
+
+ if (str[0])
+ History(0,str);
+
+ ClearCommandLine (str, maxlen, orgx, orgy);
+ current = charcount = 0;
+ curx = orgx;
+ cury = orgy;
+ bContinue=TRUE;
+ break;
+ }
+
+ case 'D':
+ /*delete current history entry*/
+ if (ir.Event.KeyEvent.dwControlKeyState &
+ (LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED))
+ {
+ ClearCommandLine (str, maxlen, orgx, orgy);
+ History_del_current_entry(str);
+ current = charcount = _tcslen (str);
+ ConOutPrintf (_T("%s"), str);
+ GetCursorXY (&curx, &cury);
+ bContinue=TRUE;
+ break;
+ }
+
+#endif/*FEATURE_HISTORY*/
+ }
+
+
+
+
+ }
+
+ //if (bContinue)
+ // continue;
+
+
+ bCharInput = FALSE;
+
+ switch (ir.Event.KeyEvent.wVirtualKeyCode)
+ {
+ case VK_BACK:
+ /* <BACKSPACE> - delete character to left of cursor */
+ if (current > 0 && charcount > 0)
+ {
+ if (current == charcount)
+ {
+ /* if at end of line */
+ str[current - 1] = _T('\0');
+ if (GetCursorX () != 0)
+ {
+ ConOutPrintf (_T("\b \b"));
+ curx--;
+ }
+ else
+ {
+ SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1));
+ ConOutChar (_T(' '));
+ SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1));
+ cury--;
+ curx = maxx - 1;
+ }
+ }
+ else
+ {
+ for (count = current - 1; count < charcount; count++)
+ str[count] = str[count + 1];
+ if (GetCursorX () != 0)
+ {
+ SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ());
+ curx--;
+ }
+ else
+ {
+ SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1));
+ cury--;
+ curx = maxx - 1;
+ }
+ GetCursorXY (&curx, &cury);
+ ConOutPrintf (_T("%s "), &str[current - 1]);
+ SetCursorXY (curx, cury);
+ }
+ charcount--;
+ current--;
+ }
+ break;
+
+ case VK_INSERT:
+ /* toggle insert/overstrike mode */
+ bInsert ^= TRUE;
+ SetCursorType (bInsert, TRUE);
+ break;
+
+ case VK_DELETE:
+ /* delete character under cursor */
+ if (current != charcount && charcount > 0)
+ {
+ for (count = current; count < charcount; count++)
+ str[count] = str[count + 1];
+ charcount--;
+ GetCursorXY (&curx, &cury);
+ ConOutPrintf (_T("%s "), &str[current]);
+ SetCursorXY (curx, cury);
+ }
+ break;
+
+ case VK_HOME:
+ /* goto beginning of string */
+ if (current != 0)
+ {
+ SetCursorXY (orgx, orgy);
+ curx = orgx;
+ cury = orgy;
+ current = 0;
+ }
+ break;
+
+ case VK_END:
+ /* goto end of string */
+ if (current != charcount)
+ {
+ SetCursorXY (orgx, orgy);
+ ConOutPrintf (_T("%s"), str);
+ GetCursorXY (&curx, &cury);
+ current = charcount;
+ }
+ break;
+
+ case VK_TAB:
+#ifdef FEATURE_UNIX_FILENAME_COMPLETION
+ /* expand current file name */
+ if ((current == charcount) ||
+ (current == charcount - 1 &&
+ str[current] == _T('"'))) /* only works at end of line*/
+ {
+ if (wLastKey != VK_TAB)
+ {
+ /* if first TAB, complete filename*/
+ tempscreen = charcount;
+ CompleteFilename (str, charcount);
+ charcount = _tcslen (str);
+ current = charcount;
+
+ SetCursorXY (orgx, orgy);
+ ConOutPrintf (_T("%s"), str);
+
+ if (tempscreen > charcount)
+ {
+ GetCursorXY (&curx, &cury);
+ for (count = tempscreen - charcount; count--; )
+ ConOutChar (_T(' '));
+ SetCursorXY (curx, cury);
+ }
+ else
+ {
+ if (((charcount + orgx) / maxx) + orgy > maxy - 1)
+ orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
+ }
+
+ /* set cursor position */
+ SetCursorXY ((orgx + current) % maxx,
+ orgy + (orgx + current) / maxx);
+ GetCursorXY (&curx, &cury);
+ }
+ else
+ {
+ /*if second TAB, list matches*/
+ if (ShowCompletionMatches (str, charcount))
+ {
+ PrintPrompt ();
+ GetCursorXY (&orgx, &orgy);
+ ConOutPrintf (_T("%s"), str);
+
+ /* set cursor position */
+ SetCursorXY ((orgx + current) % maxx,
+ orgy + (orgx + current) / maxx);
+ GetCursorXY (&curx, &cury);
+ }
+
+ }
+ }
+ else
+ {
+ MessageBeep (-1);
+ }
+#endif
+#ifdef FEATURE_4NT_FILENAME_COMPLETION
+
+ /* used to later see if we went down to the next line */
+ tempscreen = charcount;
+ szPath[0]=_T('\0');
+
+ /* str is the whole things that is on the current line
+ that is and and out. arg 2 is weather it goes back
+ one file or forward one file */
+ CompleteFilename(str, !(ir.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED), szPath, current);
+ /* Attempt to clear the line */
+ ClearCommandLine (str, maxlen, orgx, orgy);
+ curx = orgx;
+ cury = orgy;
+ current = charcount = 0;
+ //str[0]=_T('\0');
+
+ /* Everything is deleted, lets add it back in */
+ _tcscpy(str,szPath);
+
+ /* Figure out where cusor is going to be after we print it */
+ charcount = _tcslen (str);
+ current = charcount;
+
+ SetCursorXY (orgx, orgy);
+ /* Print out what we have now */
+ ConOutPrintf (_T("%s"), str);
+
+ /* Move cursor accordingly */
+ if(tempscreen > charcount)
+ {
+ GetCursorXY (&curx, &cury);
+ for(count = tempscreen - charcount; count--; )
+ ConOutChar (_T(' '));
+ SetCursorXY (curx, cury);
+ }
+ else
+ {
+ if(((charcount + orgx) / maxx) + orgy > maxy - 1)
+ orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
+ }
+ SetCursorXY((short)(((int)orgx + current) % maxx), (short)((int)orgy + ((int)orgx + current) / maxx));
+ GetCursorXY(&curx, &cury);
+
+#endif
+ break;
+
+ case _T('M'):
+ case _T('C'):
+ /* ^M does the same as return */
+ bCharInput = TRUE;
+ if(!(ir.Event.KeyEvent.dwControlKeyState &
+ (RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED)))
+ {
+ break;
+ }
+
+ case VK_RETURN:
+ /* end input, return to main */
+#ifdef FEATURE_HISTORY
+ /* add to the history */
+ if (str[0])
+ History (0, str);
+#endif
+ ConInDummy ();
+ ConOutChar (_T('\n'));
+ bReturn = TRUE;
+ break;
+
+ case VK_ESCAPE:
+ /* clear str Make this callable! */
+ ClearCommandLine (str, maxlen, orgx, orgy);
+ curx = orgx;
+ cury = orgy;
+ current = charcount = 0;
+ break;
+
+#ifdef FEATURE_HISTORY
+ case VK_F3:
+ History_move_to_bottom();
+#endif
+ case VK_UP:
+#ifdef FEATURE_HISTORY
+ /* get previous command from buffer */
+ ClearCommandLine (str, maxlen, orgx, orgy);
+ History (-1, str);
+ current = charcount = _tcslen (str);
+ if (((charcount + orgx) / maxx) + orgy > maxy - 1)
+ orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
+ ConOutPrintf (_T("%s"), str);
+ GetCursorXY (&curx, &cury);
+#endif
+ break;
+
+ case VK_DOWN:
+#ifdef FEATURE_HISTORY
+ /* get next command from buffer */
+ ClearCommandLine (str, maxlen, orgx, orgy);
+ History (1, str);
+ current = charcount = _tcslen (str);
+ if (((charcount + orgx) / maxx) + orgy > maxy - 1)
+ orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
+ ConOutPrintf (_T("%s"), str);
+ GetCursorXY (&curx, &cury);
+#endif
+ break;
+
+ case VK_LEFT:
+ /* move cursor left */
+ if (current > 0)
+ {
+ current--;
+ if (GetCursorX () == 0)
+ {
+ SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1));
+ curx = maxx - 1;
+ cury--;
+ }
+ else
+ {
+ SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ());
+ curx--;
+ }
+ }
+ else
+ {
+ MessageBeep (-1);
+ }
+ break;
+
+ case VK_RIGHT:
+ /* move cursor right */
+ if (current != charcount)
+ {
+ current++;
+ if (GetCursorX () == maxx - 1)
+ {
+ SetCursorXY (0, (SHORT)(GetCursorY () + 1));
+ curx = 0;
+ cury++;
+ }
+ else
+ {
+ SetCursorXY ((SHORT)(GetCursorX () + 1), GetCursorY ());
+ curx++;
+ }
+ }
+ break;
+
+ default:
+ /* This input is just a normal char */
+ bCharInput = TRUE;
+
+ }
+#ifdef _UNICODE
+ ch = ir.Event.KeyEvent.uChar.UnicodeChar;
+ if ((ch >= 32 && (charcount != (maxlen - 2)) && bCharInput)
+#else
+ ch = ir.Event.KeyEvent.uChar.AsciiChar;
+ if ((UCHAR)ch >= 32 && (charcount != (maxlen - 2)) && bCharInput)
+#endif /* _UNICODE */
+ {
+ /* insert character into string... */
+ if (bInsert && current != charcount)
+ {
+ /* If this character insertion will cause screen scrolling,
+ * adjust the saved origin of the command prompt. */
+ tempscreen = _tcslen(str + current) + curx;
+ if ((tempscreen % maxx) == (maxx - 1) &&
+ (tempscreen / maxx) + cury == (maxy - 1))
+ {
+ orgy--;
+ cury--;
+ }
+
+ for (count = charcount; count > current; count--)
+ str[count] = str[count - 1];
+ str[current++] = ch;
+ if (curx == maxx - 1)
+ curx = 0, cury++;
+ else
+ curx++;
+ ConOutPrintf (_T("%s"), &str[current - 1]);
+ SetCursorXY (curx, cury);
+ charcount++;
+ }
+ else
+ {
+ if (current == charcount)
+ charcount++;
+ str[current++] = ch;
+ if (GetCursorX () == maxx - 1 && GetCursorY () == maxy - 1)
+ orgy--, cury--;
+ if (GetCursorX () == maxx - 1)
+ curx = 0, cury++;
+ else
+ curx++;
+ ConOutChar (ch);
+ }
+ }
+
+ wLastKey = ir.Event.KeyEvent.wVirtualKeyCode;
+ }
+ while (!bReturn);
+
+ SetCursorType (bInsert, TRUE);
+}
--- /dev/null
+/*
+ * CMDTABLE.C - table of internal commands.
+ *
+ *
+ * History:
+ *
+ * 16 Jul 1998 (Hans B Pufal)
+ * started.
+ * New file to keep the internal command table. I plan on
+ * getting rid of the table real soon now and replacing it
+ * with a dynamic mechnism.
+ *
+ * 27 Jul 1998 John P. Price
+ * added config.h include
+ *
+ * 21-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode ready!
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+/* a list of all the internal commands, associating their command names */
+/* to the functions to process them */
+
+
+COMMAND cmds[] =
+{
+ {_T("?"), 0, CommandShowCommands},
+
+
+#ifdef INCLUDE_CMD_ACTIVATE
+ {_T("activate"), 0, CommandActivate},
+#endif
+
+#ifdef FEATURE_ALIASES
+ {_T("alias"), 0, CommandAlias},
+#endif
+
+#ifdef INCLUDE_CMD_ATTRIB
+ {_T("attrib"), 0, CommandAttrib},
+#endif
+
+#ifdef INCLUDE_CMD_BEEP
+ {_T("beep"), 0, cmd_beep},
+#endif
+
+ {_T("call"), CMD_BATCHONLY, cmd_call},
+
+#ifdef INCLUDE_CMD_CHDIR
+ {_T("cd"), CMD_SPECIAL, cmd_chdir},
+ {_T("chdir"), CMD_SPECIAL, cmd_chdir},
+#endif
+
+#ifdef INCLUDE_CMD_CHCP
+ {_T("chcp"), 0, CommandChcp},
+#endif
+
+#ifdef INCLUDE_CMD_CHOICE
+ {_T("choice"), 0, CommandChoice},
+#endif
+
+#ifdef INCLUDE_CMD_CLS
+ {_T("cls"), 0, cmd_cls},
+#endif
+
+#ifdef INCLUDE_CMD_COLOR
+ {_T("color"), 0, CommandColor},
+#endif
+
+#ifdef INCLUDE_CMD_COPY
+ {_T("copy"), 0, cmd_copy},
+#endif
+
+#ifdef INCLUDE_CMD_DATE
+ {_T("date"), 0, cmd_date},
+#endif
+
+#ifdef INCLUDE_CMD_DEL
+ {_T("del"), 0, CommandDelete},
+ {_T("delete"), 0, CommandDelete},
+#endif
+
+#ifdef INCLUDE_CMD_DELAY
+ {_T("delay"), 0, CommandDelay},
+#endif
+
+#ifdef INCLUDE_CMD_DIR
+ {_T("dir"), CMD_SPECIAL, CommandDir},
+#endif
+
+#ifdef FEATURE_DIRECTORY_STACK
+ {_T("dirs"), 0, CommandDirs},
+#endif
+
+ {_T("echo"), 0, CommandEcho},
+ {_T("echo."), CMD_HIDE, CommandEcho},
+ {_T("echos"), 0, CommandEchos},
+ {_T("echoerr"), 0, CommandEchoerr},
+ {_T("echoerr."), CMD_HIDE, CommandEchoerr},
+ {_T("echoserr"), 0, CommandEchoserr},
+
+#ifdef INCLUDE_CMD_DEL
+ {_T("erase"), 0, CommandDelete},
+#endif
+
+ {_T("exit"), 0, CommandExit},
+
+ {_T("for"), 0, cmd_for},
+
+#ifdef INCLUDE_CMD_FREE
+ {_T("free"), 0, CommandFree},
+#endif
+
+ {_T("goto"), CMD_BATCHONLY, cmd_goto},
+
+ {_T("help"), 0, CommandShowCommandsDetail},
+
+#ifdef FEATURE_HISTORY
+ {_T("history"), 0, CommandHistory},
+#endif
+
+ {_T("if"), 0, cmd_if},
+
+#ifdef INCLUDE_CMD_LABEL
+ {_T("label"), 0, cmd_label},
+#endif
+
+#ifdef INCLUDE_CMD_MEMORY
+ {_T("memory"), 0, CommandMemory},
+#endif
+
+#ifdef INCLUDE_CMD_MKDIR
+ {_T("md"), CMD_SPECIAL, cmd_mkdir},
+ {_T("mkdir"), CMD_SPECIAL, cmd_mkdir},
+#endif
+
+#ifdef INCLUDE_CMD_MOVE
+ {_T("move"), 0, cmd_move},
+#endif
+
+#ifdef INCLUDE_CMD_MSGBOX
+ {_T("msgbox"), 0, CommandMsgbox},
+#endif
+
+#ifdef INCLUDE_CMD_PATH
+ {_T("path"), 0, cmd_path},
+#endif
+
+#ifdef INCLUDE_CMD_PAUSE
+ {_T("pause"), 0, cmd_pause},
+#endif
+
+#ifdef FEATURE_DIRECTORY_STACK
+ {_T("popd"), 0, CommandPopd},
+#endif
+
+#ifdef INCLUDE_CMD_PROMPT
+ {_T("prompt"), 0, cmd_prompt},
+#endif
+
+#ifdef FEATURE_DIRECTORY_STACK
+ {_T("pushd"), 0, CommandPushd},
+#endif
+
+#ifdef INCLUDE_CMD_RMDIR
+ {_T("rd"), CMD_SPECIAL, cmd_rmdir},
+#endif
+
+#ifdef INCLUDE_CMD_REM
+ {_T("rem"), 0, CommandRem},
+#endif
+
+#ifdef INCLUDE_CMD_RENAME
+ {_T("ren"), 0, cmd_rename},
+ {_T("rename"), 0, cmd_rename},
+#endif
+
+#ifdef INCLUDE_CMD_RMDIR
+ {_T("rmdir"), CMD_SPECIAL, cmd_rmdir},
+#endif
+
+#ifdef INCLUDE_CMD_SCREEN
+ {_T("screen"), 0, CommandScreen},
+#endif
+
+#ifdef INCLUDE_CMD_SET
+ {_T("set"), 0, cmd_set},
+#endif
+
+ {_T("shift"), CMD_BATCHONLY, cmd_shift},
+
+#ifdef INCLUDE_CMD_START
+ {_T("start"), 0, cmd_start},
+#endif
+
+#ifdef INCLUDE_CMD_TIME
+ {_T("time"), 0, cmd_time},
+#endif
+
+#ifdef INCLUDE_CMD_TIMER
+ {_T("timer"), 0, CommandTimer},
+#endif
+
+#ifdef INCLUDE_CMD_TITLE
+ {_T("title"), 0, cmd_title},
+#endif
+
+#ifdef INCLUDE_CMD_TYPE
+ {_T("type"), 0, cmd_type},
+#endif
+
+#ifdef INCLUDE_CMD_VER
+ {_T("ver"), 0, cmd_ver},
+#endif
+
+#ifdef INCLUDE_CMD_VERIFY
+ {_T("verify"), 0, cmd_verify},
+#endif
+
+#ifdef INCLUDE_CMD_VOL
+ {_T("vol"), 0, cmd_vol},
+#endif
+
+#ifdef INCLUDE_CMD_WINDOW
+ {_T("window"), 0, CommandWindow},
+#endif
+
+ {NULL, 0, NULL}
+};
+
+
+VOID PrintCommandList (VOID)
+{
+ LPCOMMAND cmdptr;
+ INT y;
+
+ y = 0;
+ cmdptr = cmds;
+ while (cmdptr->name)
+ {
+ if (!(cmdptr->flags & CMD_HIDE))
+ {
+ if (++y == 8)
+ {
+ ConOutPuts (cmdptr->name);
+ y = 0;
+ }
+ else
+ {
+ ConOutPrintf (_T("%-10s"), cmdptr->name);
+ }
+ }
+
+ cmdptr++;
+ }
+
+ if (y != 0)
+ ConOutChar ('\n');
+}
+
+VOID PrintCommandListDetail (VOID)
+{
+ ConOutResPaging(TRUE,STRING_HELP1);
+ ConOutResPaging(FALSE,STRING_HELP2);
+}
+
+/* EOF */
--- /dev/null
+#define CMD_VER "0.1.2"
+#define CMD_VER_RC CMD_VER"\0"
--- /dev/null
+/*
+ * COLOR.C - color internal command.
+ *
+ *
+ * History:
+ *
+ * 13-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Started.
+ *
+ * 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode ready!
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Redirection ready!
+ *
+ * 14-Oct-1999 (Paolo Pantaleo <paolopan@freemail.it>)
+ * 4nt's syntax implemented.
+ *
+ * 03-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Move all hardcoded strings to En.rc.
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_COLOR
+
+
+
+
+
+VOID SetScreenColor (WORD wColor, BOOL bNoFill)
+{
+ DWORD dwWritten;
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+ COORD coPos;
+
+
+ if ((wColor & 0xF) == (wColor &0xF0) >> 4)
+ {
+ ConErrResPuts(STRING_COLOR_ERROR1);
+ }
+ else
+ {
+ if (bNoFill != TRUE)
+ {
+ GetConsoleScreenBufferInfo (hConsole, &csbi);
+
+ coPos.X = 0;
+ coPos.Y = 0;
+ FillConsoleOutputAttribute (hConsole,
+ (WORD)(wColor & 0x00FF),
+ (csbi.dwSize.X)*(csbi.dwSize.Y),
+ coPos,
+ &dwWritten);
+ }
+ SetConsoleTextAttribute (hConsole, (WORD)(wColor & 0x00FF));
+ }
+}
+
+
+/*
+ * color
+ *
+ * internal dir command
+ */
+INT CommandColor (LPTSTR first, LPTSTR rest)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+ if (_tcsncmp (rest, _T("/?"), 2) == 0)
+ {
+ ConOutResPaging(TRUE,STRING_COLOR_HELP1);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ if (rest[0] == _T('\0'))
+ {
+ /* set default color */
+ wColor = wDefColor;
+ SetScreenColor (wColor, FALSE);
+ return 0;
+ }
+
+
+ if ( _tcslen(&rest[0])==1)
+ {
+ if ( (_tcscmp(&rest[0], _T("0")) >=0 ) && (_tcscmp(&rest[0], _T("9")) <=0 ) )
+ {
+ SetConsoleTextAttribute (hConsole, (WORD)_ttoi(rest));
+ return 0;
+ }
+ else if ( (_tcscmp(&rest[0], _T("a")) >=0 ) && (_tcscmp(&rest[0], _T("f")) <=0 ) )
+ {
+ SetConsoleTextAttribute (hConsole, (WORD) (rest[0] + 10 - _T('a')) );
+ return 0;
+ }
+ else if ( (_tcscmp(&rest[0], _T("A")) >=0 ) && (_tcscmp(&rest[0], _T("F")) <=0 ) )
+ {
+ SetConsoleTextAttribute (hConsole, (WORD) (rest[0] + 10 - _T('A')) );
+ return 0;
+ }
+ ConErrResPuts(STRING_COLOR_ERROR2);
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ if (StringToColor(&wColor, &rest) == FALSE)
+ {
+ ConErrResPuts(STRING_COLOR_ERROR2);
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ LoadString(CMD_ModuleHandle, STRING_COLOR_ERROR3, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, wColor);
+
+ if ((wColor & 0xF) == (wColor &0xF0) >> 4)
+ {
+ LoadString(CMD_ModuleHandle, STRING_COLOR_ERROR4, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, wColor);
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ /* set color */
+ SetScreenColor(wColor,
+ (_tcsstr (rest,_T("/-F")) || _tcsstr (rest,_T("/-f"))));
+
+ return 0;
+}
+
+#endif /* INCLUDE_CMD_COLOR */
+
+/* EOF */
--- /dev/null
+/*
+ * CONFIG.H - Used to configure what will be compiled into the shell.
+ *
+ *
+ * History:
+ *
+ * 27 Jul 1998 - John P. Price
+ * started.
+ *
+ */
+
+/* Define only if used under ReactOS */
+#define __REACTOS__
+
+#ifndef _CONFIG_H_INCLUDED_
+#define _CONFIG_H_INCLUDED_
+
+/* Define to enable debugging code */
+//#define _DEBUG
+
+#define WIN32_LEAN_AND_MEAN
+
+//#define NT4_INTERNAL_COMMANDS
+
+/* Define to enable the alias command, and aliases.*/
+#define FEATURE_ALIASES
+
+
+/* Define to enable history */
+#define FEATURE_HISTORY
+
+/*Define to enable history wrap (4nt's style)*/
+#define WRAP_HISTORY
+
+
+/* Define one of these to enable filename completion */
+//#define FEATURE_UNIX_FILENAME_COMPLETION
+#define FEATURE_4NT_FILENAME_COMPLETION
+
+
+/* Define to enable the directory stack */
+#define FEATURE_DIRECTORY_STACK
+
+
+/* Define to activate redirections and piping */
+#define FEATURE_REDIRECTION
+
+
+/* Define one of these to select the used locale. */
+/* (date and time formats etc.) used in DATE, TIME, */
+/* DIR, PROMPT etc. */
+#define LOCALE_WINDOWS /* System locale */
+/* #define LOCALE_GERMAN */ /* German locale */
+/* #define LOCALE_DEFAULT */ /* United States locale */
+
+#ifdef NT4_INTERNAL_COMMANDS
+#define INCLUDE_CMD_ACTIVATE
+#endif
+#define INCLUDE_CMD_ATTRIB
+#define INCLUDE_CMD_CHCP
+#define INCLUDE_CMD_CHDIR
+#define INCLUDE_CMD_CHOICE
+#define INCLUDE_CMD_CLS
+#define INCLUDE_CMD_COLOR
+#define INCLUDE_CMD_COPY
+#define INCLUDE_CMD_DATE
+#define INCLUDE_CMD_DEL
+#define INCLUDE_CMD_DELAY
+#define INCLUDE_CMD_DIR
+#define INCLUDE_CMD_FREE
+#define INCLUDE_CMD_LABEL
+#define INCLUDE_CMD_MEMORY
+#define INCLUDE_CMD_MKDIR
+#define INCLUDE_CMD_MOVE
+#ifdef NT4_INTERNAL_COMMANDS
+#define INCLUDE_CMD_MSGBOX
+#endif
+#define INCLUDE_CMD_PATH
+#define INCLUDE_CMD_PROMPT
+#define INCLUDE_CMD_RMDIR
+#define INCLUDE_CMD_RENAME
+#define INCLUDE_CMD_SCREEN
+#define INCLUDE_CMD_SET
+#define INCLUDE_CMD_START
+#define INCLUDE_CMD_TIME
+#define INCLUDE_CMD_TIMER
+#define INCLUDE_CMD_TITLE
+#define INCLUDE_CMD_TYPE
+#define INCLUDE_CMD_VER
+#define INCLUDE_CMD_REM
+#define INCLUDE_CMD_PAUSE
+#define INCLUDE_CMD_BEEP
+#define INCLUDE_CMD_VERIFY
+#define INCLUDE_CMD_VOL
+#ifdef NT4_INTERNAL_COMMANDS
+#define INCLUDE_CMD_WINDOW
+#endif
+
+#endif /* _CONFIG_H_INCLUDED_ */
--- /dev/null
+/*
+ * CONSOLE.C - console input/output functions.
+ *
+ *
+ * History:
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * started
+ *
+ * 03-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ *
+ * 01-Jul-2005 (Brandon Turner) <turnerb7@msu.edu>)
+ * Added ConPrintfPaging and ConOutPrintfPaging
+ */
+
+
+
+#include <precomp.h>
+#include "resource.h"
+
+
+#define OUTPUT_BUFFER_SIZE 4096
+
+
+UINT InputCodePage;
+UINT OutputCodePage;
+
+
+VOID ConInDisable (VOID)
+{
+ HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
+ DWORD dwMode;
+
+ GetConsoleMode (hInput, &dwMode);
+ dwMode &= ~ENABLE_PROCESSED_INPUT;
+ SetConsoleMode (hInput, dwMode);
+}
+
+
+VOID ConInEnable (VOID)
+{
+ HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
+ DWORD dwMode;
+
+ GetConsoleMode (hInput, &dwMode);
+ dwMode |= ENABLE_PROCESSED_INPUT;
+ SetConsoleMode (hInput, dwMode);
+}
+
+
+VOID ConInDummy (VOID)
+{
+ HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
+ INPUT_RECORD dummy;
+ DWORD dwRead;
+
+#ifdef _DEBUG
+ if (hInput == INVALID_HANDLE_VALUE)
+ DebugPrintf (_T("Invalid input handle!!!\n"));
+#endif /* _DEBUG */
+ ReadConsoleInput (hInput, &dummy, 1, &dwRead);
+}
+
+VOID ConInFlush (VOID)
+{
+ FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE));
+}
+
+
+VOID ConInKey (PINPUT_RECORD lpBuffer)
+{
+ HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
+ DWORD dwRead;
+
+#ifdef _DEBUG
+ if (hInput == INVALID_HANDLE_VALUE)
+ DebugPrintf (_T("Invalid input handle!!!\n"));
+#endif /* _DEBUG */
+
+ do
+ {
+ ReadConsoleInput (hInput, lpBuffer, 1, &dwRead);
+ if ((lpBuffer->EventType == KEY_EVENT) &&
+ (lpBuffer->Event.KeyEvent.bKeyDown == TRUE))
+ break;
+ }
+ while (TRUE);
+}
+
+
+
+VOID ConInString (LPTSTR lpInput, DWORD dwLength)
+{
+ DWORD dwOldMode;
+ DWORD dwRead;
+ HANDLE hFile;
+
+ LPTSTR p;
+ DWORD i;
+ PCHAR pBuf;
+
+#ifdef _UNICODE
+ pBuf = (PCHAR)malloc(dwLength);
+#else
+ pBuf = lpInput;
+#endif
+ ZeroMemory (lpInput, dwLength * sizeof(TCHAR));
+ hFile = GetStdHandle (STD_INPUT_HANDLE);
+ GetConsoleMode (hFile, &dwOldMode);
+
+ SetConsoleMode (hFile, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
+
+ ReadFile (hFile, (PVOID)pBuf, dwLength, &dwRead, NULL);
+
+#ifdef _UNICODE
+ MultiByteToWideChar( InputCodePage, 0, pBuf, dwLength + 1, lpInput, dwLength + 1);
+#endif
+ p = lpInput;
+ for (i = 0; i < dwRead; i++, p++)
+ {
+ if (*p == _T('\x0d'))
+ {
+ *p = _T('\0');
+ break;
+ }
+ }
+
+#ifdef _UNICODE
+ free(pBuf);
+#endif
+
+ SetConsoleMode (hFile, dwOldMode);
+}
+
+static VOID ConChar(TCHAR c, DWORD nStdHandle)
+{
+ DWORD dwWritten;
+ CHAR cc;
+#ifdef _UNICODE
+ CHAR as[2];
+ WCHAR ws[2];
+ ws[0] = c;
+ ws[1] = 0;
+ WideCharToMultiByte( OutputCodePage, 0, ws, 2, as, 2, NULL, NULL);
+ cc = as[0];
+#else
+ cc = c;
+#endif
+ WriteFile (GetStdHandle (nStdHandle),
+ &cc,
+ 1,
+ &dwWritten,
+ NULL);
+}
+
+VOID ConOutChar (TCHAR c)
+{
+ ConChar(c, STD_OUTPUT_HANDLE);
+}
+
+VOID ConPuts(LPTSTR szText, DWORD nStdHandle)
+{
+ DWORD dwWritten;
+ PCHAR pBuf;
+ INT len;
+
+ len = _tcslen(szText);
+#ifdef _UNICODE
+ pBuf = malloc(len + 1);
+ len = WideCharToMultiByte( OutputCodePage, 0, szText, len + 1, pBuf, len + 1, NULL, NULL) - 1;
+#else
+ pBuf = szText;
+#endif
+ WriteFile (GetStdHandle (nStdHandle),
+ pBuf,
+ len,
+ &dwWritten,
+ NULL);
+ WriteFile (GetStdHandle (nStdHandle),
+ _T("\n"),
+ 1,
+ &dwWritten,
+ NULL);
+#ifdef UNICODE
+ free(pBuf);
+#endif
+}
+
+VOID ConOutResPaging(BOOL NewPage, UINT resID)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintfPaging(NewPage, szMsg);
+}
+
+VOID ConOutResPuts (UINT resID)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE);
+
+ ConPuts(szMsg, STD_OUTPUT_HANDLE);
+}
+
+VOID ConOutPuts (LPTSTR szText)
+{
+ ConPuts(szText, STD_OUTPUT_HANDLE);
+}
+
+
+VOID ConPrintf(LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle)
+{
+ INT len;
+ PCHAR pBuf;
+ TCHAR szOut[OUTPUT_BUFFER_SIZE];
+ DWORD dwWritten;
+
+ len = _vstprintf (szOut, szFormat, arg_ptr);
+#ifdef _UNICODE
+ pBuf = malloc(len + 1);
+ len = WideCharToMultiByte( OutputCodePage, 0, szOut, len + 1, pBuf, len + 1, NULL, NULL) - 1;
+#else
+ pBuf = szOut;
+#endif
+
+ WriteFile (GetStdHandle (nStdHandle),
+ pBuf,
+ len,
+ &dwWritten,
+ NULL);
+
+
+#ifdef UNICODE
+ free(pBuf);
+#endif
+}
+
+INT ConPrintfPaging(BOOL NewPage, LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle)
+{
+ INT len;
+ PCHAR pBuf;
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+ TCHAR szOut[OUTPUT_BUFFER_SIZE];
+ DWORD dwWritten;
+
+ /* used to count number of lines since last pause */
+ static int LineCount = 0;
+
+ /* used to see how big the screen is */
+ int ScreenLines = 0;
+
+ /* the number of chars in a roow */
+ int ScreenCol = 0;
+
+ /* chars since end of line */
+ int CharEL = 0;
+
+ int i = 0;
+
+ if(NewPage == TRUE)
+ LineCount = 0;
+
+ /* rest LineCount and return if no string have been given */
+ if (szFormat == NULL)
+ return 0;
+
+
+ //get the size of the visual screen that can be printed too
+ if (!GetConsoleScreenBufferInfo(hConsole, &csbi))
+ {
+ // we assuming its a file handle
+ ConPrintf(szFormat, arg_ptr, nStdHandle);
+ return 0;
+ }
+ //subtract 2 to account for "press any key..." and for the blank line at the end of PagePrompt()
+ ScreenLines = (csbi.srWindow.Bottom - csbi.srWindow.Top) - 4;
+ ScreenCol = (csbi.srWindow.Right - csbi.srWindow.Left) + 1;
+
+ //make sure they didnt make the screen to small
+ if(ScreenLines<4)
+ {
+ ConPrintf(szFormat, arg_ptr, nStdHandle);
+ return 0;
+ }
+
+ len = _vstprintf (szOut, szFormat, arg_ptr);
+#ifdef _UNICODE
+ pBuf = malloc(len + 1);
+ len = WideCharToMultiByte( OutputCodePage, 0, szOut, len + 1, pBuf, len + 1, NULL, NULL) - 1;
+#else
+ pBuf = szOut;
+#endif
+
+ for(i = 0; i < len; i++)
+ {
+
+ if(pBuf[i] == _T('\n'))
+ {
+ LineCount++;
+ CharEL=0;
+ }
+ else
+ {
+ CharEL++;
+ if (CharEL>=ScreenCol)
+ {
+ if (i+1<len)
+ {
+ if(pBuf[i+1] != _T('\n')) LineCount++;
+ }
+ CharEL=0;
+ }
+ }
+
+ /* FIXME : write more that one char at time */
+ WriteFile (GetStdHandle (nStdHandle),&pBuf[i],sizeof(CHAR),&dwWritten,NULL);
+ if(LineCount >= ScreenLines)
+ {
+ if(_tcsnicmp(&pBuf[i], _T("\n"), 2)!=0)
+ WriteFile (GetStdHandle (nStdHandle),_T("\n"),sizeof(CHAR),&dwWritten,NULL);
+
+ if(PagePrompt() != PROMPT_YES)
+ {
+ return 1;
+ }
+ //reset the number of lines being printed
+ LineCount = 0;
+ CharEL=0;
+ }
+
+ }
+
+#ifdef UNICODE
+ free(pBuf);
+#endif
+ return 0;
+}
+
+VOID ConErrFormatMessage (DWORD MessageId, ...)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ DWORD ret;
+ LPTSTR text;
+ va_list arg_ptr;
+
+ va_start (arg_ptr, MessageId);
+ ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ MessageId,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &text,
+ 0,
+ &arg_ptr);
+
+ va_end (arg_ptr);
+ if(ret > 0)
+ {
+ ConErrPuts (text);
+ LocalFree(text);
+ }
+ else
+ {
+ LoadString(CMD_ModuleHandle, STRING_CONSOLE_ERROR, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg);
+ }
+}
+
+VOID ConOutFormatMessage (DWORD MessageId, ...)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ DWORD ret;
+ LPTSTR text;
+ va_list arg_ptr;
+
+ va_start (arg_ptr, MessageId);
+ ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ MessageId,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &text,
+ 0,
+ &arg_ptr);
+
+ va_end (arg_ptr);
+ if(ret > 0)
+ {
+ ConErrPuts (text);
+ LocalFree(text);
+ }
+ else
+ {
+ LoadString(CMD_ModuleHandle, STRING_CONSOLE_ERROR, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg);
+ }
+}
+
+VOID ConOutPrintf (LPTSTR szFormat, ...)
+{
+ va_list arg_ptr;
+
+ va_start (arg_ptr, szFormat);
+ ConPrintf(szFormat, arg_ptr, STD_OUTPUT_HANDLE);
+ va_end (arg_ptr);
+}
+
+INT ConOutPrintfPaging (BOOL NewPage, LPTSTR szFormat, ...)
+{
+ INT iReturn;
+ va_list arg_ptr;
+
+ va_start (arg_ptr, szFormat);
+ iReturn = ConPrintfPaging(NewPage, szFormat, arg_ptr, STD_OUTPUT_HANDLE);
+ va_end (arg_ptr);
+ return iReturn;
+}
+
+VOID ConErrChar (TCHAR c)
+{
+ ConChar(c, STD_ERROR_HANDLE);
+}
+
+
+VOID ConErrResPuts (UINT resID)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE);
+ ConPuts(szMsg, STD_ERROR_HANDLE);
+}
+
+VOID ConErrPuts (LPTSTR szText)
+{
+ ConPuts(szText, STD_ERROR_HANDLE);
+}
+
+
+VOID ConErrPrintf (LPTSTR szFormat, ...)
+{
+ va_list arg_ptr;
+
+ va_start (arg_ptr, szFormat);
+ ConPrintf(szFormat, arg_ptr, STD_ERROR_HANDLE);
+ va_end (arg_ptr);
+}
+
+#ifdef _DEBUG
+VOID DebugPrintf (LPTSTR szFormat, ...)
+{
+ va_list arg_ptr;
+
+ va_start (arg_ptr, szFormat);
+ ConPrintf(szFormat, arg_ptr, STD_ERROR_HANDLE);
+ va_end (arg_ptr);
+#if 0
+ TCHAR szOut[OUTPUT_BUFFER_SIZE];
+ va_start (arg_ptr, szFormat);
+ _vstprintf (szOut, szFormat, arg_ptr);
+ OutputDebugString (szOut);
+ va_end (arg_ptr);
+#endif
+}
+#endif /* _DEBUG */
+
+VOID SetCursorXY (SHORT x, SHORT y)
+{
+ COORD coPos;
+
+ coPos.X = x;
+ coPos.Y = y;
+ SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), coPos);
+}
+
+
+VOID GetCursorXY (PSHORT x, PSHORT y)
+{
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+
+ GetConsoleScreenBufferInfo (hConsole, &csbi);
+
+ *x = csbi.dwCursorPosition.X;
+ *y = csbi.dwCursorPosition.Y;
+}
+
+
+SHORT GetCursorX (VOID)
+{
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+
+ GetConsoleScreenBufferInfo (hConsole, &csbi);
+
+ return csbi.dwCursorPosition.X;
+}
+
+
+SHORT GetCursorY (VOID)
+{
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+
+ GetConsoleScreenBufferInfo (hConsole, &csbi);
+
+ return csbi.dwCursorPosition.Y;
+}
+
+
+VOID GetScreenSize (PSHORT maxx, PSHORT maxy)
+{
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+
+ GetConsoleScreenBufferInfo (hConsole, &csbi);
+
+ if (maxx)
+ *maxx = csbi.dwSize.X;
+ if (maxy)
+ *maxy = csbi.dwSize.Y;
+}
+
+
+VOID SetCursorType (BOOL bInsert, BOOL bVisible)
+{
+ CONSOLE_CURSOR_INFO cci;
+
+ cci.dwSize = bInsert ? 10 : 99;
+ cci.bVisible = bVisible;
+
+ SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cci);
+}
+
+/* EOF */
--- /dev/null
+/*
+ * COPY.C -- copy internal command.
+ *
+ *
+ * History:
+ *
+ * 01-Aug-98 (Rob Lake z63rrl@morgan.ucs.mun.ca)
+ * started
+ *
+ * 13-Aug-1998 (John P. Price)
+ * fixed memory leak problem in copy function.
+ * fixed copy function so it would work with wildcards in the source
+ *
+ * 13-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added COPY command to CMD.
+ *
+ * 26-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Replaced CRT io functions by Win32 io functions.
+ *
+ * 27-Oct-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Disabled prompting when used in batch mode.
+ *
+ * 03-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ *
+ * 13-Jul-2005 (Brandon Turner) <turnerb7@msu.edu>)
+ * Rewrite to clean up copy and support wildcard.
+ *
+ * 20-Jul-2005 (Brandon Turner) <turnerb7@msu.edu>)
+ * Add touch syntax. "copy arp.exe+,,"
+ * Copy command is now completed.
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_COPY
+
+enum
+{
+ COPY_ASCII = 0x001, /* /A */
+ COPY_DECRYPT = 0x004, /* /D */
+ COPY_VERIFY = 0x008, /* /V : Dummy, Never will be Impleneted */
+ COPY_SHORTNAME = 0x010, /* /N : Dummy, Never will be Impleneted */
+ COPY_NO_PROMPT = 0x020, /* /Y */
+ COPY_PROMPT = 0x040, /* /-Y */
+ COPY_RESTART = 0x080, /* /Z */
+ COPY_BINARY = 0x100, /* /B */
+};
+
+#define BUFF_SIZE 16384 /* 16k = max buffer size */
+
+
+INT
+copy (TCHAR source[MAX_PATH],
+ TCHAR dest[MAX_PATH],
+ INT append,
+ DWORD lpdwFlags,
+ BOOL bTouch)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ FILETIME srctime,NewFileTime;
+ HANDLE hFileSrc;
+ HANDLE hFileDest;
+ LPBYTE buffer;
+ DWORD dwAttrib;
+ DWORD dwRead;
+ DWORD dwWritten;
+ DWORD i;
+ BOOL bEof = FALSE;
+ TCHAR TrueDest[MAX_PATH];
+ TCHAR TempSrc[MAX_PATH];
+ TCHAR * FileName;
+ SYSTEMTIME CurrentTime;
+
+ /* Check Breaker */
+ if(CheckCtrlBreak(BREAK_INPUT))
+ return 0;
+
+#ifdef _DEBUG
+ DebugPrintf (_T("checking mode\n"));
+#endif
+
+ if(bTouch)
+ {
+ hFileSrc = CreateFile (source, GENERIC_WRITE, FILE_SHARE_READ,
+ NULL, OPEN_EXISTING, 0, NULL);
+ if (hFileSrc == INVALID_HANDLE_VALUE)
+ {
+ LoadString(CMD_ModuleHandle, STRING_COPY_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, source);
+ nErrorLevel = 1;
+ return 0;
+ }
+
+ GetSystemTime(&CurrentTime);
+ SystemTimeToFileTime(&CurrentTime, &NewFileTime);
+ if(SetFileTime(hFileSrc,(LPFILETIME) NULL, (LPFILETIME) NULL, &NewFileTime))
+ {
+ CloseHandle(hFileSrc);
+ nErrorLevel = 1;
+ return 1;
+
+ }
+ else
+ {
+ CloseHandle(hFileSrc);
+ return 0;
+ }
+ }
+
+ dwAttrib = GetFileAttributes (source);
+
+ hFileSrc = CreateFile (source, GENERIC_READ, FILE_SHARE_READ,
+ NULL, OPEN_EXISTING, 0, NULL);
+ if (hFileSrc == INVALID_HANDLE_VALUE)
+ {
+ LoadString(CMD_ModuleHandle, STRING_COPY_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, source);
+ nErrorLevel = 1;
+ return 0;
+ }
+
+#ifdef _DEBUG
+ DebugPrintf (_T("getting time\n"));
+#endif
+
+ GetFileTime (hFileSrc, &srctime, NULL, NULL);
+
+#ifdef _DEBUG
+ DebugPrintf (_T("copy: flags has %s\n"),
+ lpdwFlags & COPY_ASCII ? "ASCII" : "BINARY");
+#endif
+
+ /* Check to see if /D or /Z are true, if so we need a middle
+ man to copy the file too to allow us to use CopyFileEx later */
+ if(lpdwFlags & COPY_DECRYPT)
+ {
+ GetEnvironmentVariable(_T("TEMP"),TempSrc,MAX_PATH);
+ _tcscat(TempSrc,_T("\\"));
+ FileName = _tcsrchr(source,_T('\\'));
+ FileName++;
+ _tcscat(TempSrc,FileName);
+ /* This is needed to be on the end to prevent an error
+ if the user did "copy /D /Z foo bar then it would be copied
+ too %TEMP%\foo here and when %TEMP%\foo when it sets it up
+ for COPY_RESTART, this would mean it is copying to itself
+ which would error when it tried to open the handles for ReadFile
+ and WriteFile */
+ _tcscat(TempSrc,_T(".decrypt"));
+ if(!CopyFileEx(source, TempSrc, NULL, NULL, FALSE, COPY_FILE_ALLOW_DECRYPTED_DESTINATION))
+ {
+ nErrorLevel = 1;
+ return 0;
+ }
+ _tcscpy(source, TempSrc);
+ }
+
+
+ if(lpdwFlags & COPY_RESTART)
+ {
+ _tcscpy(TrueDest, dest);
+ GetEnvironmentVariable(_T("TEMP"),dest,MAX_PATH);
+ _tcscat(dest,_T("\\"));
+ FileName = _tcsrchr(TrueDest,_T('\\'));
+ FileName++;
+ _tcscat(dest,FileName);
+ }
+
+
+
+ if (!IsExistingFile (dest))
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("opening/creating\n"));
+#endif
+ hFileDest =
+ CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
+ }
+ else if (!append)
+ {
+ if (!_tcscmp (dest, source))
+ {
+ LoadString(CMD_ModuleHandle, STRING_COPY_ERROR2, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, source);
+
+ CloseHandle (hFileSrc);
+ nErrorLevel = 1;
+ return 0;
+ }
+
+#ifdef _DEBUG
+ DebugPrintf (_T("SetFileAttributes (%s, FILE_ATTRIBUTE_NORMAL);\n"), dest);
+#endif
+ SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL);
+
+#ifdef _DEBUG
+ DebugPrintf (_T("DeleteFile (%s);\n"), dest);
+#endif
+ DeleteFile (dest);
+
+ hFileDest = CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
+ }
+ else
+ {
+ LONG lFilePosHigh = 0;
+
+ if (!_tcscmp (dest, source))
+ {
+ CloseHandle (hFileSrc);
+ return 0;
+ }
+
+#ifdef _DEBUG
+ DebugPrintf (_T("opening/appending\n"));
+#endif
+ SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL);
+
+ hFileDest =
+ CreateFile (dest, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
+
+ /* Move to end of file to start writing */
+ SetFilePointer (hFileDest, 0, &lFilePosHigh,FILE_END);
+ }
+
+
+ if (hFileDest == INVALID_HANDLE_VALUE)
+ {
+ CloseHandle (hFileSrc);
+ ConOutResPuts(STRING_ERROR_PATH_NOT_FOUND);
+ nErrorLevel = 1;
+ return 0;
+ }
+ buffer = (LPBYTE)malloc (BUFF_SIZE);
+ if (buffer == NULL)
+ {
+ CloseHandle (hFileDest);
+ CloseHandle (hFileSrc);
+ ConOutResPuts(STRING_ERROR_OUT_OF_MEMORY);
+ nErrorLevel = 1;
+ return 0;
+ }
+
+ do
+ {
+
+ ReadFile (hFileSrc, buffer, BUFF_SIZE, &dwRead, NULL);
+ if (lpdwFlags & COPY_ASCII)
+ {
+ for (i = 0; i < dwRead; i++)
+ {
+ /* we're dealing with ASCII files! */
+ if (((LPSTR)buffer)[i] == 0x1A)
+ {
+ bEof = TRUE;
+ break;
+ }
+ }
+ dwRead = i;
+ }
+
+ if (dwRead == 0)
+ break;
+
+ WriteFile (hFileDest, buffer, dwRead, &dwWritten, NULL);
+ if (dwWritten != dwRead || CheckCtrlBreak(BREAK_INPUT))
+ {
+ ConOutResPuts(STRING_COPY_ERROR3);
+
+ free (buffer);
+ CloseHandle (hFileDest);
+ CloseHandle (hFileSrc);
+ nErrorLevel = 1;
+ return 0;
+ }
+ }
+ while (dwRead && !bEof);
+
+#ifdef _DEBUG
+ DebugPrintf (_T("setting time\n"));
+#endif
+ SetFileTime (hFileDest, &srctime, NULL, NULL);
+
+ if (lpdwFlags & COPY_ASCII)
+ {
+ /* we're dealing with ASCII files! */
+ ((LPSTR)buffer)[0] = 0x1A;
+ ((LPSTR)buffer)[1] = '\0';
+#ifdef _DEBUG
+ DebugPrintf (_T("appending ^Z\n"));
+#endif
+ WriteFile (hFileDest, buffer, sizeof(CHAR), &dwWritten, NULL);
+ }
+
+ free (buffer);
+ CloseHandle (hFileDest);
+ CloseHandle (hFileSrc);
+
+#ifdef _DEBUG
+ DebugPrintf (_T("setting mode\n"));
+#endif
+ SetFileAttributes (dest, dwAttrib);
+
+ /* Now finish off the copy if needed with CopyFileEx */
+ if(lpdwFlags & COPY_RESTART)
+ {
+ if(!CopyFileEx(dest, TrueDest, NULL, NULL, FALSE, COPY_FILE_RESTARTABLE))
+ {
+ nErrorLevel = 1;
+ DeleteFile(dest);
+ return 0;
+ }
+ /* Take care of file in the temp folder */
+ DeleteFile(dest);
+
+ }
+
+ if(lpdwFlags & COPY_DECRYPT)
+ DeleteFile(TempSrc);
+
+
+
+ return 1;
+}
+
+
+static INT CopyOverwrite (LPTSTR fn)
+{
+ /*ask the user if they want to override*/
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ INT res;
+ LoadString(CMD_ModuleHandle, STRING_COPY_HELP1, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg,fn);
+ res = FilePromptYNA (_T(""));
+ return res;
+}
+
+
+INT cmd_copy (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ LPTSTR *arg;
+ INT argc, i, nFiles, nOverwrite = 0, nSrc = -1, nDes = -1;
+ /* this is the path up to the folder of the src and dest ie C:\windows\ */
+ TCHAR szDestPath[MAX_PATH];
+ TCHAR szSrcPath[MAX_PATH];
+ DWORD dwFlags = 0;
+ /* If this is the type of copy where we are adding files */
+ BOOL bAppend = FALSE;
+ WIN32_FIND_DATA findBuffer;
+ HANDLE hFile;
+ BOOL bTouch = FALSE;
+ /* Used when something like "copy c*.exe d*.exe" during the process of
+ figuring out the new name */
+ TCHAR tmpName[MAX_PATH] = _T("");
+ /* Pointer to keep track of how far through the append input(file1+file2+file3) we are */
+ TCHAR * appendPointer = _T("\0");
+ /* The full path to src and dest. This has drive letter, folders, and filename */
+ TCHAR tmpDestPath[MAX_PATH];
+ TCHAR tmpSrcPath[MAX_PATH];
+ /* A bool on weather or not the destination name will be taking from the input */
+ BOOL bSrcName = FALSE;
+ /* Seems like a waste but it is a pointer used to copy from input to PreserveName */
+ TCHAR * UseThisName;
+ /* Stores the name( i.e. blah.txt or blah*.txt) which later we might need */
+ TCHAR PreserveName[MAX_PATH];
+ /* for CMDCOPY env */
+ TCHAR *evar;
+ int size;
+ TCHAR * szTouch;
+ BOOL bDone = FALSE;
+
+
+ /*Show help/usage info*/
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE, STRING_COPY_HELP2);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ /* Get the envor value if it exists */
+ evar = malloc(512 * sizeof(TCHAR));
+ if (evar==NULL) size = 0;
+ else
+ {
+ size = GetEnvironmentVariable (_T("COPYCMD"), evar, 512);
+ }
+ if (size > 512)
+ {
+ evar = realloc(evar,size * sizeof(TCHAR) );
+ if (evar!=NULL)
+ {
+ size = GetEnvironmentVariable (_T("COPYCMD"), evar, size);
+ }
+ else
+ {
+ size=0;
+ }
+ }
+
+ /* check see if we did get any env variable */
+ if (size !=0)
+ {
+ int t=0;
+ /* scan and set the flags */
+ for (t=0;t<size;t++)
+ {
+ if (_tcsncicmp(_T("/A"),&evar[t],2)==0)
+ {
+ dwFlags |=COPY_ASCII;
+ t++;
+ }
+
+ else if (_tcsncicmp(_T("/B"),&evar[t],2)==0)
+ {
+ dwFlags |= COPY_BINARY;
+ t++;
+ }
+ else if (_tcsncicmp(_T("/D"),&evar[t],2)==0)
+ {
+ dwFlags |= COPY_DECRYPT;
+ t++;
+ }
+
+ else if (_tcsncicmp(_T("/V"),&evar[t],2)==0)
+ {
+ dwFlags |= COPY_VERIFY;
+ t++;
+ }
+
+ else if (_tcsncicmp(_T("/N"),&evar[t],2)==0)
+ {
+ dwFlags |= COPY_SHORTNAME;
+ t++;
+ }
+
+ else if (_tcsncicmp(_T("/Y"),&evar[t],2)==0)
+ {
+ dwFlags |= COPY_NO_PROMPT;
+ t++;
+ }
+
+ else if (_tcsncicmp(_T("/-Y"),&evar[t],3)==0)
+ {
+ dwFlags |= COPY_PROMPT;
+ t+=2;
+ }
+
+ else if (_tcsncicmp(_T("/Z"),&evar[t],2)==0)
+ {
+ dwFlags |= COPY_PROMPT;
+ t++;
+ }
+ }
+ }
+ free(evar);
+
+
+ /*Split the user input into array*/
+ arg = split (param, &argc, FALSE);
+ nFiles = argc;
+
+
+ /*Read switches and count files*/
+ for (i = 0; i < argc; i++)
+ {
+ if (*arg[i] == _T('/'))
+ {
+ if (_tcslen(arg[i]) >= 2)
+ {
+ switch (_totupper(arg[i][1]))
+ {
+
+ case _T('A'):
+ dwFlags |= COPY_ASCII;
+ break;
+
+ case _T('B'):
+ dwFlags |= COPY_BINARY;
+ break;
+
+ case _T('D'):
+ dwFlags |= COPY_DECRYPT;
+ break;
+
+ case _T('V'):
+ dwFlags |= COPY_VERIFY;
+ break;
+
+ case _T('N'):
+ dwFlags |= COPY_SHORTNAME;
+ break;
+
+ case _T('Y'):
+ dwFlags |= COPY_NO_PROMPT;
+ dwFlags &= ~COPY_PROMPT;
+ break;
+
+ case _T('-'):
+ if(_tcslen(arg[i]) >= 3)
+ if(_totupper(arg[i][2]) == _T('Y'))
+ {
+ dwFlags &= ~COPY_NO_PROMPT;
+ dwFlags |= COPY_PROMPT;
+ }
+
+ break;
+
+ case _T('Z'):
+ dwFlags |= COPY_RESTART;
+ break;
+
+ default:
+ /* invaild switch */
+ LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_SWITCH, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, _totupper(arg[i][1]));
+ nErrorLevel = 1;
+ return 1;
+ break;
+ }
+ }
+ /*If it was a switch, subtract from total arguments*/
+ nFiles--;
+ }
+ else
+ {
+ /*if it isnt a switch then it is the source or destination*/
+ if(nSrc == -1)
+ {
+ nSrc = i;
+ }
+ else if(*arg[i] == _T('+') || *arg[i] == _T(','))
+ {
+ /* Add these onto the source string
+ this way we can do all checks
+ directly on source string later on */
+ _tcscat(arg[nSrc],arg[i]);
+ nFiles--;
+ }
+ else if(nDes == -1)
+ {
+ nDes = i;
+ }
+
+ }
+ }
+
+ /* keep quiet within batch files */
+ if (bc != NULL)
+ {
+ dwFlags |= COPY_NO_PROMPT;
+ dwFlags &= ~COPY_PROMPT;
+ }
+
+ if(nFiles < 1)
+ {
+ /* There is not enough files, there has to be at least 1 */
+ ConOutResPuts(STRING_ERROR_REQ_PARAM_MISSING);
+ freep (arg);
+ return 1;
+ }
+
+ if(nFiles > 2)
+ {
+ /* there is too many file names in command */
+ LoadString(CMD_ModuleHandle, STRING_ERROR_TOO_MANY_PARAMETERS, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg,_T(""));
+ nErrorLevel = 1;
+ freep (arg);
+ return 1;
+ }
+
+ if(((_tcschr (arg[nSrc], _T('+')) != NULL) ||
+ (_tcschr (arg[nSrc], _T('*')) != NULL && _tcschr (arg[nDes], _T('*')) == NULL) ||
+ (IsExistingDirectory (arg[nSrc]) && (_tcschr (arg[nDes], _T('*')) == NULL && !IsExistingDirectory (arg[nDes])))
+ ))
+ {
+ /* There is a + in the source filename, this means
+ that there is more then one file being put into
+ one file. */
+ bAppend = TRUE;
+ if(_tcschr (arg[nSrc], _T('+')) != NULL)
+ appendPointer = arg[nSrc];
+ }
+
+ /* Reusing the number of files variable */
+ nFiles = 0;
+
+ do
+ {
+ /* Set up the string that is the path to the destination */
+ if(nDes != -1)
+ {
+ if(_tcslen(arg[nDes]) == 2 && arg[nDes][1] == _T(':'))
+ {
+ GetRootPath(arg[nDes],szDestPath,MAX_PATH);
+ }
+ else
+ /* If the user entered two file names then form the full string path*/
+ GetFullPathName (arg[nDes], MAX_PATH, szDestPath, NULL);
+
+ }
+ else
+ {
+ /* If no destination was entered then just use
+ the current directory as the destination */
+ GetCurrentDirectory (MAX_PATH, szDestPath);
+ }
+
+
+ /* Get the full string of the path to the source file*/
+ if(_tcschr (arg[nSrc], _T('+')) != NULL)
+ {
+ _tcscpy(tmpName,_T("\0"));
+ /* Loop through the source file name and copy all
+ the chars one at a time until it gets too + */
+ while(TRUE)
+ {
+ if(!_tcsncmp (appendPointer,_T("+"),1) || !_tcsncmp (appendPointer,_T("\0"),1))
+ {
+ /* Now that the pointer is on the + we
+ need to go to the start of the next filename */
+ if(!_tcsncmp (appendPointer,_T("+"),1))
+ appendPointer++;
+ else
+ bDone = TRUE;
+ break;
+
+ }
+
+ _tcsncat(tmpName,appendPointer,1);
+ appendPointer++;
+
+ }
+ /* Finish the string off with a null char */
+ _tcsncat(tmpName,_T("\0"),1);
+
+ if(_tcschr (arg[nSrc], _T(',')) != NULL)
+ {
+ /* Only time there is a , in the source is when they are using touch
+ Cant have a destination and can only have on ,, at the end of the string
+ Cant have more then one file name */
+ szTouch = _tcsstr (arg[nSrc], _T("+"));
+ if(_tcsncmp (szTouch,_T("+,,\0"),4) || nDes != -1)
+ {
+ LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg,arg[nSrc]);
+ nErrorLevel = 1;
+ freep (arg);
+ return 1;
+ }
+ bTouch = TRUE;
+ bDone = TRUE;
+ }
+
+ if(_tcslen(tmpName) == 2)
+ {
+ if(tmpName[1] == _T(':'))
+ {
+
+ GetRootPath(tmpName,szSrcPath,MAX_PATH);
+ }
+ }
+ else
+ /* Get the full path to first file in the string of file names */
+ GetFullPathName (tmpName, MAX_PATH, szSrcPath, NULL);
+ }
+ else
+ {
+ bDone = TRUE;
+ if(_tcslen(arg[nSrc]) == 2 && arg[nSrc][1] == _T(':'))
+ {
+ GetRootPath(arg[nSrc],szSrcPath,MAX_PATH);
+ }
+ else
+ /* Get the full path of the source file */
+ GetFullPathName (arg[nSrc], MAX_PATH, szSrcPath, NULL);
+
+ }
+
+ /* From this point on, we can assume that the shortest path is 3 letters long
+ and that would be [DriveLetter]:\ */
+
+ /* If there is no * in the path name and it is a folder
+ then we will need to add a wildcard to the pathname
+ so FindFirstFile comes up with all the files in that
+ folder */
+ if(_tcschr (szSrcPath, _T('*')) == NULL &&
+ IsExistingDirectory (szSrcPath))
+ {
+ /* If it doesnt have a \ at the end already then on needs to be added */
+ if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\'))
+ _tcscat (szSrcPath, _T("\\"));
+ /* Add a wildcard after the \ */
+ _tcscat (szSrcPath, _T("*"));
+ }
+ /* Make sure there is an ending slash to the path if the dest is a folder */
+ if(_tcschr (szDestPath, _T('*')) == NULL &&
+ IsExistingDirectory(szDestPath))
+ {
+ if(szDestPath[_tcslen(szDestPath) - 1] != _T('\\'))
+ _tcscat (szDestPath, _T("\\"));
+ }
+
+
+ /* Get a list of all the files */
+ hFile = FindFirstFile (szSrcPath, &findBuffer);
+
+
+ /* We need to figure out what the name of the file in the is going to be */
+ if((szDestPath[_tcslen(szDestPath) - 1] == _T('*') && szDestPath[_tcslen(szDestPath) - 2] == _T('\\')) ||
+ szDestPath[_tcslen(szDestPath) - 1] == _T('\\'))
+ {
+ /* In this case we will be using the same name as the source file
+ for the destination file because destination is a folder */
+ bSrcName = TRUE;
+ }
+ else
+ {
+ /* Save the name the user entered */
+ UseThisName = _tcsrchr(szDestPath,_T('\\'));
+ UseThisName++;
+ _tcscpy(PreserveName,UseThisName);
+ }
+
+ /* Strip the paths back to the folder they are in */
+ for(i = (_tcslen(szSrcPath) - 1); i > -1; i--)
+ if(szSrcPath[i] != _T('\\'))
+ szSrcPath[i] = _T('\0');
+ else
+ break;
+
+ for(i = (_tcslen(szDestPath) - 1); i > -1; i--)
+ if(szDestPath[i] != _T('\\'))
+ szDestPath[i] = _T('\0');
+ else
+ break;
+
+ do
+ {
+ /* Check Breaker */
+ if(CheckCtrlBreak(BREAK_INPUT))
+ {
+ freep(arg);
+ return 1;
+ }
+ /* Set the override to yes each new file */
+ nOverwrite = 1;
+
+ /* If it couldnt open the file handle, print out the error */
+ if(hFile == INVALID_HANDLE_VALUE)
+ {
+ ConOutFormatMessage (GetLastError(), szSrcPath);
+ freep (arg);
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ /* Ignore the . and .. files */
+ if(!_tcscmp (findBuffer.cFileName, _T(".")) ||
+ !_tcscmp (findBuffer.cFileName, _T(".."))||
+ findBuffer.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ continue;
+
+ /* Copy the base folder over to a tmp string */
+ _tcscpy(tmpDestPath,szDestPath);
+
+ /* Can't put a file into a folder that isnt there */
+ if(!IsExistingDirectory(szDestPath))
+ {
+ ConOutFormatMessage (GetLastError (), szSrcPath);
+ freep (arg);
+ nErrorLevel = 1;
+ return 1;
+ }
+ /* Copy over the destination path name */
+ if(bSrcName)
+ _tcscat (tmpDestPath, findBuffer.cFileName);
+ else
+ {
+ /* If there is no wildcard you can use the name the user entered */
+ if(_tcschr (PreserveName, _T('*')) == NULL)
+ {
+ _tcscat (tmpDestPath, PreserveName);
+ }
+ else
+ {
+ /* The following lines of copy were written by someone else
+ (most likely Eric Khoul) and it was taken from ren.c */
+ LPTSTR p,q,r;
+ TCHAR DoneFile[MAX_PATH];
+ /* build destination file name */
+ p = findBuffer.cFileName;
+ q = PreserveName;
+ r = DoneFile;
+ while(*q != 0)
+ {
+ if (*q == '*')
+ {
+ q++;
+ while (*p != 0 && *p != *q)
+ {
+ *r = *p;
+ p++;
+ r++;
+ }
+ }
+ else if (*q == '?')
+ {
+ q++;
+ if (*p != 0)
+ {
+ *r = *p;
+ p++;
+ r++;
+ }
+ }
+ else
+ {
+ *r = *q;
+ if (*p != 0)
+ p++;
+ q++;
+ r++;
+ }
+ }
+ *r = 0;
+ /* Add the filename to the tmp string path */
+ _tcscat (tmpDestPath, DoneFile);
+
+ }
+ }
+
+
+ /* Build the string path to the source file */
+ _tcscpy(tmpSrcPath,szSrcPath);
+ _tcscat (tmpSrcPath, findBuffer.cFileName);
+
+ /* Check to see if the file is the same file */
+ if(!bTouch && !_tcscmp (tmpSrcPath, tmpDestPath))
+ continue;
+
+ /* Handle any overriding / prompting that needs to be done */
+ if(((!(dwFlags & COPY_NO_PROMPT) && IsExistingFile (tmpDestPath)) || dwFlags & COPY_PROMPT) && !bTouch)
+ nOverwrite = CopyOverwrite(tmpDestPath);
+ if(nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK)
+ continue;
+ if(nOverwrite == PROMPT_ALL || (nOverwrite == PROMPT_YES && bAppend))
+ dwFlags |= COPY_NO_PROMPT;
+
+ /* Tell weather the copy was successful or not */
+ if(copy(tmpSrcPath,tmpDestPath, bAppend, dwFlags, bTouch))
+ {
+ nFiles++;
+ /* only print source name when more then one file */
+ if(_tcschr (arg[nSrc], _T('+')) != NULL || _tcschr (arg[nSrc], _T('*')) != NULL)
+ ConOutPrintf(_T("%s\n"),findBuffer.cFileName);
+ //LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ }
+ else
+ {
+ /* print out the error message */
+ LoadString(CMD_ModuleHandle, STRING_COPY_ERROR3, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg);
+ ConOutFormatMessage (GetLastError(), szSrcPath);
+ nErrorLevel = 1;
+ }
+
+ /* Loop through all wildcard files */
+ }while(FindNextFile (hFile, &findBuffer));
+ /* Loop through all files in src string with a + */
+ }while(!bDone);
+
+ /* print out the number of files copied */
+ LoadString(CMD_ModuleHandle, STRING_COPY_FILE, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, nFiles);
+
+ CloseHandle(hFile);
+ if (arg!=NULL)
+ free(arg);
+
+ return 0;
+}
+
+
+#endif /* INCLUDE_CMD_COPY */
--- /dev/null
+/*
+ * DATE.C - date internal command.
+ *
+ *
+ * History:
+ *
+ * 08 Jul 1998 (John P. Price)
+ * started.
+ *
+ * 20 Jul 1998 (John P. Price)
+ * corrected number of days for December from 30 to 31.
+ * (Thanx to Steffen Kaiser for bug report)
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 29-Jul-1998 (Rob Lake)
+ * fixed stand-alone mode.
+ * Added Pacific C compatible dos_getdate functions
+ *
+ * 09-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added locale support
+ *
+ * 23-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection safe!
+ *
+ * 04-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed date input bug.
+ *
+ * 03-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_DATE
+
+
+static WORD awMonths[2][13] =
+{
+ {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
+ {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
+};
+
+
+static VOID
+PrintDateString (VOID)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+ switch (nDateFormat)
+ {
+ case 0: /* mmddyy */
+ default:
+ LoadString(CMD_ModuleHandle, STRING_DATE_HELP1, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, cDateSeparator, cDateSeparator);
+ break;
+
+ case 1: /* ddmmyy */
+ LoadString(CMD_ModuleHandle, STRING_DATE_HELP2, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, cDateSeparator, cDateSeparator);
+ break;
+
+ case 2: /* yymmdd */
+ LoadString(CMD_ModuleHandle, STRING_DATE_HELP3, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, cDateSeparator, cDateSeparator);
+ break;
+ }
+}
+
+
+static BOOL
+ReadNumber (LPTSTR *s, LPWORD lpwValue)
+{
+ if (_istdigit (**s))
+ {
+ while (_istdigit (**s))
+ {
+ *lpwValue = *lpwValue * 10 + **s - _T('0');
+ (*s)++;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+static BOOL
+ReadSeparator (LPTSTR *s)
+{
+ if (**s == _T('/') || **s == _T('-') || **s == cDateSeparator)
+ {
+ (*s)++;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+static BOOL
+ParseDate (LPTSTR s)
+{
+ SYSTEMTIME d;
+ unsigned char leap;
+ LPTSTR p = s;
+
+ if (!*s)
+ return TRUE;
+
+ GetLocalTime (&d);
+
+ d.wYear = 0;
+ d.wDay = 0;
+ d.wMonth = 0;
+
+ switch (nDateFormat)
+ {
+ case 0: /* mmddyy */
+ default:
+ if (!ReadNumber (&p, &d.wMonth))
+ return FALSE;
+ if (!ReadSeparator (&p))
+ return FALSE;
+ if (!ReadNumber (&p, &d.wDay))
+ return FALSE;
+ if (!ReadSeparator (&p))
+ return FALSE;
+ if (!ReadNumber (&p, &d.wYear))
+ return FALSE;
+ break;
+
+ case 1: /* ddmmyy */
+ if (!ReadNumber (&p, &d.wDay))
+ return FALSE;
+ if (!ReadSeparator (&p))
+ return FALSE;
+ if (!ReadNumber (&p, &d.wMonth))
+ return FALSE;
+ if (!ReadSeparator (&p))
+ return FALSE;
+ if (!ReadNumber (&p, &d.wYear))
+ return FALSE;
+ break;
+
+ case 2: /* yymmdd */
+ if (!ReadNumber (&p, &d.wYear))
+ return FALSE;
+ if (!ReadSeparator (&p))
+ return FALSE;
+ if (!ReadNumber (&p, &d.wMonth))
+ return FALSE;
+ if (!ReadSeparator (&p))
+ return FALSE;
+ if (!ReadNumber (&p, &d.wDay))
+ return FALSE;
+ break;
+ }
+
+ /* if only entered two digits: */
+ /* assume 2000's if value less than 80 */
+ /* assume 1900's if value greater or equal 80 */
+ if (d.wYear <= 99)
+ {
+ if (d.wYear >= 80)
+ d.wYear = 1900 + d.wYear;
+ else
+ d.wYear = 2000 + d.wYear;
+ }
+
+ leap = (!(d.wYear % 4) && (d.wYear % 100)) || !(d.wYear % 400);
+
+ if ((d.wMonth >= 1 && d.wMonth <= 12) &&
+ (d.wDay >= 1 && d.wDay <= awMonths[leap][d.wMonth]) &&
+ (d.wYear >= 1980 && d.wYear <= 2099))
+ {
+ SetLocalTime (&d);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+INT cmd_date (LPTSTR cmd, LPTSTR param)
+{
+ LPTSTR *arg;
+ INT argc;
+ INT i;
+ BOOL bPrompt = TRUE;
+ INT nDateString = -1;
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_DATE_HELP4);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ /* build parameter array */
+ arg = split (param, &argc, FALSE);
+
+ /* check for options */
+ for (i = 0; i < argc; i++)
+ {
+ if (_tcsicmp (arg[i], _T("/t")) == 0)
+ bPrompt = FALSE;
+ if ((*arg[i] != _T('/')) && (nDateString == -1))
+ nDateString = i;
+ }
+
+ if (nDateString == -1)
+ PrintDate ();
+
+ if (!bPrompt)
+ {
+ freep (arg);
+ return 0;
+ }
+
+ if (nDateString == -1)
+ {
+ while (TRUE) /* forever loop */
+ {
+ TCHAR s[40];
+
+ PrintDateString ();
+ ConInString (s, 40);
+#ifdef _DEBUG
+ DebugPrintf (_T("\'%s\'\n"), s);
+#endif
+ while (*s && s[_tcslen (s) - 1] < _T(' '))
+ s[_tcslen (s) - 1] = _T('\0');
+ if (ParseDate (s))
+ {
+ freep (arg);
+ return 0;
+ }
+ ConErrResPuts(STRING_DATE_ERROR);
+
+ }
+ }
+ else
+ {
+ if (!ParseDate (arg[nDateString]))
+ {
+ while (TRUE) /* forever loop */
+ {
+ TCHAR s[40];
+ ConErrResPuts(STRING_DATE_ERROR);
+
+ PrintDateString ();
+ ConInString (s, 40);
+
+ while (*s && s[_tcslen (s) - 1] < _T(' '))
+ s[_tcslen (s) - 1] = _T('\0');
+ if (ParseDate (s))
+ {
+ freep (arg);
+ return 0;
+ }
+ }
+ }
+ }
+
+ freep (arg);
+
+ return 0;
+}
+#endif /* INCLUDE_CMD_DATE */
+
+/* EOF */
--- /dev/null
+/*
+* DEL.C - del internal command.
+*
+*
+* History:
+*
+* 06/29/98 (Rob Lake rlake@cs.mun.ca)
+* rewrote del to support wildcards
+* added my name to the contributors
+*
+* 07/13/98 (Rob Lake)
+* fixed bug that caused del not to delete file with out
+* attribute. moved set, del, ren, and ver to there own files
+*
+* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+* added config.h include
+*
+* 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeiung.de>)
+* Fixed command line parsing bugs.
+*
+* 21-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>)
+* Started major rewrite using a new structure.
+*
+* 03-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>)
+* First working version.
+*
+* 30-Mar-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>)
+* Added quiet ("/Q"), wipe ("/W") and zap ("/Z") option.
+*
+* 06-Nov-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>)
+* Little fix to keep DEL quiet inside batch files.
+*
+* 28-Jan-2004 (Michael Fritscher <michael@fritscher.net>)
+* Added prompt ("/P"), yes ("/Y") and wipe("/W") option.
+*
+* 22-Jun-2005 (Brandon Turner <turnerb7@msu.edu>)
+* Added exclusive deletion "del * -abc.txt -text*.txt"
+*
+* 22-Jun-2005 (Brandon Turner <turnerb7@msu.edu>)
+* Implemented /A example "del /A:H /A:-R *.exe -ping.exe"
+*
+* 07-Aug-2005
+* Removed the exclusive deletion (see two comments above) because '-' is a valid file name character.
+* Optimized the recursive deletion in directories.
+* Preload some nice strings.
+*/
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_DEL
+
+
+enum
+{
+ DEL_ATTRIBUTES = 0x001, /* /A */
+ DEL_NOTHING = 0x004, /* /N */
+ DEL_PROMPT = 0x008, /* /P */
+ DEL_QUIET = 0x010, /* /Q */
+ DEL_SUBDIR = 0x020, /* /S */
+ DEL_TOTAL = 0x040, /* /T */
+ DEL_WIPE = 0x080, /* /W */
+ DEL_EMPTYDIR = 0x100, /* /X : not implemented */
+ DEL_YES = 0x200, /* /Y */
+ DEL_FORCE = 0x800 /* /F */
+};
+
+enum
+{
+ ATTR_ARCHIVE = 0x001, /* /A:A */
+ ATTR_HIDDEN = 0x002, /* /A:H */
+ ATTR_SYSTEM = 0x004, /* /A:S */
+ ATTR_READ_ONLY = 0x008, /* /A:R */
+ ATTR_N_ARCHIVE = 0x010, /* /A:-A */
+ ATTR_N_HIDDEN = 0x020, /* /A:-H */
+ ATTR_N_SYSTEM = 0x040, /* /A:-S */
+ ATTR_N_READ_ONLY = 0x080 /* /A:-R */
+};
+
+static TCHAR szDeleteWipe[RC_STRING_MAX_SIZE];
+static TCHAR szDelHelp2[RC_STRING_MAX_SIZE];
+static TCHAR szDelHelp3[RC_STRING_MAX_SIZE];
+static TCHAR szDelHelp4[RC_STRING_MAX_SIZE];
+static TCHAR szDelError5[RC_STRING_MAX_SIZE];
+static TCHAR szDelError6[RC_STRING_MAX_SIZE];
+static TCHAR szDelError7[RC_STRING_MAX_SIZE];
+static TCHAR CMDPath[MAX_PATH];
+
+static BOOLEAN StringsLoaded = FALSE;
+
+static VOID LoadStrings(VOID)
+{
+ LoadString( CMD_ModuleHandle, STRING_DELETE_WIPE, szDeleteWipe, RC_STRING_MAX_SIZE);
+ LoadString( CMD_ModuleHandle, STRING_DEL_HELP2, szDelHelp2, RC_STRING_MAX_SIZE);
+ LoadString( CMD_ModuleHandle, STRING_DEL_HELP3, szDelHelp3, RC_STRING_MAX_SIZE);
+ LoadString( CMD_ModuleHandle, STRING_DEL_HELP4, szDelHelp4, RC_STRING_MAX_SIZE);
+ LoadString( CMD_ModuleHandle, STRING_DEL_ERROR5, szDelError5, RC_STRING_MAX_SIZE);
+ LoadString( CMD_ModuleHandle, STRING_DEL_ERROR6, szDelError6, RC_STRING_MAX_SIZE);
+ LoadString( CMD_ModuleHandle, STRING_DEL_ERROR7, szDelError7, RC_STRING_MAX_SIZE);
+ GetModuleFileName(NULL, CMDPath, MAX_PATH);
+ StringsLoaded = TRUE;
+}
+
+static BOOL
+RemoveFile (LPTSTR lpFileName, DWORD dwFlags, WIN32_FIND_DATA* f)
+{
+ /*This function is called by CommandDelete and
+ does the actual process of deleting the single
+ file*/
+ if(CheckCtrlBreak(BREAK_INPUT))
+ return 1;
+
+ /*check to see if it is read only and if this is done based on /A
+ if it is done by file name, access is denied. However, if it is done
+ using the /A switch you must un-read only the file and allow it to be
+ deleted*/
+ if((dwFlags & DEL_ATTRIBUTES) || (dwFlags & DEL_FORCE))
+ {
+ if(f->dwFileAttributes & FILE_ATTRIBUTE_READONLY)
+ {
+ /*setting file to normal, not saving old attrs first
+ because the file is going to be deleted anyways
+ so the only thing that matters is that it isnt
+ read only.*/
+ SetFileAttributes(lpFileName,FILE_ATTRIBUTE_NORMAL);
+ }
+ }
+
+ if (dwFlags & DEL_WIPE)
+ {
+
+ HANDLE file;
+ DWORD temp;
+#define BufferSize 65536
+ BYTE buffer[BufferSize];
+ LONGLONG i;
+ LARGE_INTEGER FileSize;
+
+ FileSize.u.HighPart = f->nFileSizeHigh;
+ FileSize.u.LowPart = f->nFileSizeLow;
+
+ for(i = 0; i < BufferSize; i++)
+ {
+ buffer[i]=rand() % 256;
+ }
+ file = CreateFile (lpFileName, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL);
+ if (file != INVALID_HANDLE_VALUE)
+ {
+ for(i = 0; i < (FileSize.QuadPart - BufferSize); i += BufferSize)
+ {
+ WriteFile (file, buffer, BufferSize, &temp, NULL);
+ ConOutPrintf (_T("%I64d%% %s\r"),(i * (LONGLONG)100)/FileSize.QuadPart,szDeleteWipe);
+ }
+ WriteFile (file, buffer, (DWORD)(FileSize.QuadPart - i), &temp, NULL);
+ ConOutPrintf (_T("100%% %s\n"),szDeleteWipe);
+ CloseHandle (file);
+ }
+ }
+
+ return DeleteFile (lpFileName);
+}
+
+
+static DWORD
+DeleteFiles(LPTSTR FileName, DWORD* dwFlags, DWORD dwAttrFlags)
+{
+ TCHAR szFullPath[MAX_PATH];
+ TCHAR szFileName[MAX_PATH];
+ LPTSTR pFilePart;
+ HANDLE hFile;
+ WIN32_FIND_DATA f;
+ BOOL bExclusion;
+ INT res;
+ DWORD dwFiles = 0;
+
+ _tcscpy(szFileName, FileName);
+
+ if(_tcschr (szFileName, _T('*')) == NULL &&
+ IsExistingDirectory (szFileName))
+ {
+ /* If it doesnt have a \ at the end already then on needs to be added */
+ if(szFileName[_tcslen(szFileName) - 1] != _T('\\'))
+ _tcscat (szFileName, _T("\\"));
+ /* Add a wildcard after the \ */
+ _tcscat (szFileName, _T("*"));
+ }
+
+ if(!_tcscmp (szFileName, _T("*")) ||
+ !_tcscmp (szFileName, _T("*.*")) ||
+ (szFileName[_tcslen(szFileName) - 2] == _T('\\') && szFileName[_tcslen(szFileName) - 1] == _T('*')))
+ {
+ /* well, the user wants to delete everything but if they didnt yes DEL_YES, DEL_QUIET, or DEL_PROMPT
+ then we are going to want to make sure that in fact they want to do that. */
+
+ if (!((*dwFlags & DEL_YES) || (*dwFlags & DEL_QUIET) || (*dwFlags & DEL_PROMPT)))
+ {
+ res = FilePromptYNA (szDelHelp2);
+ if ((res == PROMPT_NO) || (res == PROMPT_BREAK))
+ return 0x80000000;
+ if(res == PROMPT_ALL)
+ *dwFlags |= DEL_YES;
+ }
+ }
+
+ GetFullPathName (szFileName,
+ MAX_PATH,
+ szFullPath,
+ &pFilePart);
+
+ hFile = FindFirstFile(szFullPath, &f);
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ bExclusion = FALSE;
+
+ /*if it is going to be excluded by - no need to check attrs*/
+ if(*dwFlags & DEL_ATTRIBUTES && !bExclusion)
+ {
+
+ /*save if file attr check if user doesnt care about that attr anyways*/
+ if(dwAttrFlags & ATTR_ARCHIVE && !(f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE))
+ bExclusion = TRUE;
+ if(dwAttrFlags & ATTR_HIDDEN && !(f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
+ bExclusion = TRUE;
+ if(dwAttrFlags & ATTR_SYSTEM && !(f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
+ bExclusion = TRUE;
+ if(dwAttrFlags & ATTR_READ_ONLY && !(f.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
+ bExclusion = TRUE;
+ if(dwAttrFlags & ATTR_N_ARCHIVE && (f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE))
+ bExclusion = TRUE;
+ if(dwAttrFlags & ATTR_N_HIDDEN && (f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
+ bExclusion = TRUE;
+ if(dwAttrFlags & ATTR_N_SYSTEM && (f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
+ bExclusion = TRUE;
+ if(dwAttrFlags & ATTR_N_READ_ONLY && (f.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
+ bExclusion = TRUE;
+ }
+
+ if(bExclusion)
+ continue;
+
+ /* ignore directories */
+ if (f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ continue;
+
+
+ _tcscpy (pFilePart, f.cFileName);
+
+ /* We cant delete ourselves */
+ if(!_tcscmp (CMDPath,szFullPath))
+ continue;
+
+
+#ifdef _DEBUG
+ ConErrPrintf(_T("Full filename: %s\n"), szFullPath);
+#endif
+
+ /* ask for deleting */
+ if (*dwFlags & DEL_PROMPT)
+ {
+ ConErrPrintf(szDelError5, szFullPath);
+
+ res = FilePromptYN (szDelError6);
+
+ if ((res == PROMPT_NO) || (res == PROMPT_BREAK))
+ {
+ nErrorLevel = 0;
+ continue;
+ }
+ }
+
+ /*user cant ask it to be quiet and tell you what it did*/
+ if (!(*dwFlags & DEL_QUIET) && !(*dwFlags & DEL_TOTAL))
+ {
+ ConErrPrintf(szDelError7, szFullPath);
+ }
+
+ /* delete the file */
+ if(*dwFlags & DEL_NOTHING)
+ continue;
+
+ if(RemoveFile (szFullPath, *dwFlags, &f))
+ dwFiles++;
+ else
+ {
+ ErrorMessage (GetLastError(), _T(""));
+// FindClose(hFile);
+// return -1;
+ }
+ }
+ while (FindNextFile (hFile, &f));
+ FindClose (hFile);
+ }
+ return dwFiles;
+}
+
+
+static DWORD
+ProcessDirectory(LPTSTR FileName, DWORD* dwFlags, DWORD dwAttrFlags)
+{
+ TCHAR szFullPath[MAX_PATH];
+ LPTSTR pFilePart;
+ LPTSTR pSearchPart;
+ HANDLE hFile;
+ WIN32_FIND_DATA f;
+ DWORD dwFiles = 0;
+
+ GetFullPathName (FileName,
+ MAX_PATH,
+ szFullPath,
+ &pFilePart);
+
+ dwFiles = DeleteFiles(szFullPath, dwFlags, dwAttrFlags);
+ if (dwFiles & 0x80000000)
+ return dwFiles;
+
+ if (*dwFlags & DEL_SUBDIR)
+ {
+ /* Get just the file name */
+ pSearchPart = _tcsrchr(FileName,_T('\\'));
+ if(pSearchPart != NULL)
+ pSearchPart++;
+ else
+ pSearchPart = FileName;
+
+ /* Get the full path to the file */
+ GetFullPathName (FileName,MAX_PATH,szFullPath,NULL);
+
+ /* strip the filename off of it */
+ pFilePart = _tcsrchr(szFullPath, _T('\\'));
+ if (pFilePart == NULL)
+ {
+ pFilePart = szFullPath;
+ }
+ else
+ {
+ pFilePart++;
+ }
+
+ _tcscpy(pFilePart, _T("*"));
+
+ hFile = FindFirstFile(szFullPath, &f);
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ if (!(f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
+ !_tcscmp(f.cFileName, _T(".")) ||
+ !_tcscmp(f.cFileName, _T("..")))
+ continue;
+
+ _tcscpy(pFilePart, f.cFileName);
+ _tcscat(pFilePart, _T("\\"));
+ _tcscat(pFilePart, pSearchPart);
+
+ dwFiles +=ProcessDirectory(szFullPath, dwFlags, dwAttrFlags);
+ if (dwFiles & 0x80000000)
+ {
+ break;
+ }
+ }
+ while (FindNextFile (hFile, &f));
+ FindClose (hFile);
+ }
+ }
+ return dwFiles;
+}
+
+
+
+INT CommandDelete (LPTSTR cmd, LPTSTR param)
+{
+ /*cmd is the command that was given, in this case it will always be "del" or "delete"
+ param is whatever is given after the command*/
+
+ LPTSTR *arg = NULL;
+ INT args;
+ INT i;
+ INT nEvalArgs = 0; /* nunber of evaluated arguments */
+ DWORD dwFlags = 0;
+ DWORD dwAttrFlags = 0;
+ DWORD dwFiles = 0;
+ LONG ch;
+ TCHAR szOrginalArg[MAX_PATH];
+
+ /*checks the first two chars of param to see if it is /?
+ this however allows the following command to not show help
+ "del frog.txt /?" */
+
+ if (!StringsLoaded)
+ {
+ LoadStrings();
+ }
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_DEL_HELP1);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ arg = split (param, &args, FALSE);
+
+ if (args == 0)
+ {
+ /* only command given */
+ error_req_param_missing ();
+ freep (arg);
+ return 1;
+ }
+ /* check for options anywhere in command line */
+ for (i = 0; i < args; i++)
+ {
+ if (*arg[i] == _T('/'))
+ {
+ /*found a command, but check to make sure it has something after it*/
+ if (_tcslen (arg[i]) >= 2)
+ {
+ ch = _totupper (arg[i][1]);
+ if (ch == _T('N'))
+ {
+ dwFlags |= DEL_NOTHING;
+ }
+ else if (ch == _T('P'))
+ {
+ dwFlags |= DEL_PROMPT;
+ }
+ else if (ch == _T('Q'))
+ {
+ dwFlags |= DEL_QUIET;
+ }
+ else if (ch == _T('F'))
+ {
+ dwFlags |= DEL_FORCE;
+ }
+ else if (ch == _T('S'))
+ {
+ dwFlags |= DEL_SUBDIR;
+ }
+ else if (ch == _T('T'))
+ {
+ dwFlags |= DEL_TOTAL;
+ }
+ else if (ch == _T('W'))
+ {
+ dwFlags |= DEL_WIPE;
+ }
+ else if (ch == _T('Y'))
+ {
+ dwFlags |= DEL_YES;
+ }
+ else if (ch == _T('A'))
+ {
+
+ dwFlags |= DEL_ATTRIBUTES;
+ /*the proper syntax for /A has a min of 4 chars
+ i.e. /A:R or /A:-H */
+ if (_tcslen (arg[i]) < 4)
+ {
+ error_invalid_parameter_format(arg[i]);
+ return 0;
+ }
+ ch = _totupper (arg[i][3]);
+ if (_tcslen (arg[i]) == 4)
+ {
+ if(ch == _T('A'))
+ {
+ dwAttrFlags |= ATTR_ARCHIVE;
+ }
+ if(ch == _T('H'))
+ {
+ dwAttrFlags |= ATTR_HIDDEN;
+ }
+ if(ch == _T('S'))
+ {
+ dwAttrFlags |= ATTR_SYSTEM;
+ }
+ if(ch == _T('R'))
+ {
+ dwAttrFlags |= ATTR_READ_ONLY;
+ }
+ }
+ if (_tcslen (arg[i]) == 5)
+ {
+ if(ch == _T('-'))
+ {
+ ch = _totupper (arg[i][4]);
+ if(ch == _T('A'))
+ {
+ dwAttrFlags |= ATTR_N_ARCHIVE;
+ }
+ if(ch == _T('H'))
+ {
+ dwAttrFlags |= ATTR_N_HIDDEN;
+ }
+ if(ch == _T('S'))
+ {
+ dwAttrFlags |= ATTR_N_SYSTEM;
+ }
+ if(ch == _T('R'))
+ {
+ dwAttrFlags |= ATTR_N_READ_ONLY;
+ }
+ }
+ }
+ }
+ }
+
+ nEvalArgs++;
+ }
+ }
+
+ /* there are only options on the command line --> error!!!
+ there is the same number of args as there is flags, so none of the args were filenames*/
+ if (args == nEvalArgs)
+ {
+ error_req_param_missing ();
+ freep (arg);
+ return 1;
+ }
+
+ /* keep quiet within batch files */
+ if (bc != NULL)
+ dwFlags |= DEL_QUIET;
+
+ /* check for filenames anywhere in command line */
+ for (i = 0; i < args && !(dwFiles & 0x80000000); i++)
+ {
+
+ /*this checks to see if it isnt a flag, if it isnt, we assume it is a file name*/
+ if((*arg[i] == _T('/')) || (*arg[i] == _T('-')))
+ continue;
+
+ /* We want to make a copies of the argument */
+ if(_tcslen(arg[i]) == 2 && arg[i][1] == _T(':'))
+ {
+ /* Check for C: D: ... */
+ GetRootPath(arg[i],szOrginalArg,MAX_PATH);
+ }
+ else
+ {
+ _tcscpy(szOrginalArg,arg[i]);
+ }
+ dwFiles += ProcessDirectory(szOrginalArg, &dwFlags, dwAttrFlags);
+
+ }
+
+ freep (arg);
+
+ /*Based on MS cmd, we only tell what files are being deleted when /S is used */
+ if (dwFlags & DEL_TOTAL)
+ {
+ dwFiles &= 0x7fffffff;
+ if (dwFiles < 2)
+ {
+ ConOutPrintf(szDelHelp3, dwFiles);
+ }
+ else
+ {
+ ConOutPrintf(szDelHelp4, dwFiles);
+ }
+ }
+
+ return 0;
+}
+
+
+#endif
--- /dev/null
+/*
+ * DELAY.C - internal command.
+ *
+ * clone from 4nt delay command
+ *
+ * 30 Aug 1999
+ * started - Paolo Pantaleo <paolopan@freemail.it>
+ *
+ *
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_DELAY
+
+
+INT CommandDelay (LPTSTR cmd, LPTSTR param)
+{
+ DWORD val;
+ DWORD mul=1000;
+
+ if (_tcsncmp (param, _T("/?"), 2) == 0)
+ {
+ ConOutResPaging(TRUE,STRING_DELAY_HELP);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ if (*param==0)
+ {
+ error_req_param_missing ();
+ return 1;
+ }
+
+ if (_tcsnicmp(param,_T("/m"),2) == 0)
+ {
+ mul = 1;
+ param += 2;
+ }
+
+ val = _ttoi(param);
+ Sleep(val * mul);
+
+ return 0;
+}
+
+#endif /* INCLUDE_CMD_DELAY */
--- /dev/null
+/*
+ * DIR.C - dir internal command.
+ *
+ *
+ * History:
+ *
+ * 01/29/97 (Tim Norman)
+ * started.
+ *
+ * 06/13/97 (Tim Norman)
+ * Fixed code.
+ *
+ * 07/12/97 (Tim Norman)
+ * Fixed bug that caused the root directory to be unlistable
+ *
+ * 07/12/97 (Marc Desrochers)
+ * Changed to use maxx, maxy instead of findxy()
+ *
+ * 06/08/98 (Rob Lake)
+ * Added compatibility for /w in dir
+ *
+ * 06/09/98 (Rob Lake)
+ * Compatibility for dir/s started
+ * Tested that program finds directories off root fine
+ *
+ * 06/10/98 (Rob Lake)
+ * do_recurse saves the cwd and also stores it in Root
+ * build_tree adds the cwd to the beginning of its' entries
+ * Program runs fine, added print_tree -- works fine.. as EXE,
+ * program won't work properly as COM.
+ *
+ * 06/11/98 (Rob Lake)
+ * Found problem that caused COM not to work
+ *
+ * 06/12/98 (Rob Lake)
+ * debugged...
+ * added free mem routine
+ *
+ * 06/13/98 (Rob Lake)
+ * debugged the free mem routine
+ * debugged whole thing some more
+ * Notes:
+ * ReadDir stores Root name and _Read_Dir does the hard work
+ * PrintDir prints Root and _Print_Dir does the hard work
+ * KillDir kills Root _after_ _Kill_Dir does the hard work
+ * Integrated program into DIR.C(this file) and made some same
+ * changes throughout
+ *
+ * 06/14/98 (Rob Lake)
+ * Cleaned up code a bit, added comments
+ *
+ * 06/16/98 (Rob Lake)
+ * Added error checking to my previously added routines
+ *
+ * 06/17/98 (Rob Lake)
+ * Rewrote recursive functions, again! Most other recursive
+ * functions are now obsolete -- ReadDir, PrintDir, _Print_Dir,
+ * KillDir and _Kill_Dir. do_recurse does what PrintDir did
+ * and _Read_Dir did what it did before along with what _Print_Dir
+ * did. Makes /s a lot faster!
+ * Reports 2 more files/dirs that MS-DOS actually reports
+ * when used in root directory(is this because dir defaults
+ * to look for read only files?)
+ * Added support for /b, /a and /l
+ * Made error message similar to DOS error messages
+ * Added help screen
+ *
+ * 06/20/98 (Rob Lake)
+ * Added check for /-(switch) to turn off previously defined
+ * switches.
+ * Added ability to check for DIRCMD in environment and
+ * process it
+ *
+ * 06/21/98 (Rob Lake)
+ * Fixed up /B
+ * Now can dir *.ext/X, no spaces!
+ *
+ * 06/29/98 (Rob Lake)
+ * error message now found in command.h
+ *
+ * 07/08/1998 (John P. Price)
+ * removed extra returns; closer to MSDOS
+ * fixed wide display so that an extra return is not displayed
+ * when there is five filenames in the last line.
+ *
+ * 07/12/98 (Rob Lake)
+ * Changed error messages
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ *
+ * 04-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Converted source code to Win32, except recursive dir ("dir /s").
+ *
+ * 10-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed recursive dir ("dir /s").
+ *
+ * 14-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Converted to Win32 directory functions and
+ * fixed some output bugs. There are still some more ;)
+ *
+ * 10-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added "/N" and "/4" options, "/O" is a dummy.
+ * Added locale support.
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Redirection safe!
+ *
+ * 01-Mar-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Replaced all runtime io functions by their Win32 counterparts.
+ *
+ * 23-Feb-2001 (Carl Nettelblad <cnettel@hem.passagen.se>)
+ * dir /s now works in deeper trees
+ *
+ * 28-Jan-2004 (Michael Fritscher <michael@fritscher.net>)
+ * Fix for /p, so it is working under Windows in GUI-mode, too.
+ *
+ * 30-Apr-2004 (Filip Navara <xnavara@volny.cz>)
+ * Fix /w to print long names.
+ *
+ * 27-Feb-2005 (Konstantinos Paliouras <squarious@gmail.com>)
+ * Implemented all the switches that were missing, and made
+ * the ros dir very similar to windows dir. Major part of
+ * the code is rewritten. /p is removed, to be rewriten in
+ * the main cmd code.
+ *
+ * 1-Jul-2004 (Brandon Turner <turnerb7@msu.edu>)
+ * Added /p back in using ConOutPrintfPaging
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_DIR
+
+
+
+/* Time Field enumeration */
+enum ETimeField
+{
+ TF_CREATIONDATE = 0,
+ TF_MODIFIEDDATE = 1,
+ TF_LASTACCESSEDDATE = 2
+};
+
+/* Ordered by enumeration */
+enum EOrderBy
+{
+ ORDER_NAME = 0,
+ ORDER_SIZE = 1,
+ ORDER_DIRECTORY = 2,
+ ORDER_EXTENSION = 3,
+ ORDER_TIME = 4
+};
+
+/* The struct for holding the switches */
+typedef struct _DirSwitchesFlags
+{
+ BOOL bBareFormat; /* Bare Format */
+ BOOL bTSeperator; /* Thousands seperator */
+ BOOL bWideList; /* Wide list format */
+ BOOL bWideListColSort; /* Wide list format but sorted by column */
+ BOOL bLowerCase; /* Uses lower case */
+ BOOL bNewLongList; /* New long list */
+ BOOL bPause; /* Pause per page */
+ BOOL bUser; /* Displays the owner of file */
+ BOOL bRecursive; /* Displays files in specified directory and all sub */
+ BOOL bShortName; /* Displays the sort name of files if exist */
+ BOOL b4Digit; /* Four digit year */
+ struct
+ {
+ DWORD dwAttribVal; /* The desired state of attribute */
+ DWORD dwAttribMask; /* Which attributes to check */
+ BOOL bUnSet; /* A helper flag if "-" was given with the switch */
+ BOOL bParSetted; /* A helper flag if parameters of switch were given */
+ } stAttribs; /* Displays files with this attributes only */
+ struct
+ {
+ enum EOrderBy eCriteria[3]; /* Criterias used to order by */
+ BOOL bCriteriaRev[3]; /* If the criteria is in reversed order */
+ short sCriteriaCount; /* The quantity of criterias */
+ BOOL bUnSet; /* A helper flag if "-" was given with the switch */
+ BOOL bParSetted; /* A helper flag if parameters of switch were given */
+ } stOrderBy; /* Ordered by criterias */
+ struct
+ {
+ enum ETimeField eTimeField; /* The time field that will be used for */
+ BOOL bUnSet; /* A helper flag if "-" was given with the switch */
+ BOOL bParSetted; /* A helper flag if parameters of switch were given */
+ } stTimeField; /* The time field to display or use for sorting */
+} DIRSWITCHFLAGS, *LPDIRSWITCHFLAGS;
+
+
+typedef struct _DIRFINDLISTNODE
+{
+ WIN32_FIND_DATA stFindInfo;
+ struct _DIRFINDLISTNODE *ptrNext;
+} DIRFINDLISTNODE, *PDIRFINDLISTNODE;
+
+
+typedef BOOL
+(WINAPI *PGETFREEDISKSPACEEX)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);
+
+
+/* Globally save the # of dirs, files and bytes,
+ * probabaly later pass them to functions. Rob Lake */
+static ULONG recurse_dir_cnt;
+static ULONG recurse_file_cnt;
+static ULARGE_INTEGER recurse_bytes;
+
+
+/*
+ * help
+ *
+ * displays help screen for dir
+ * Rob Lake
+ */
+static VOID
+DirHelp(VOID)
+{
+ ConOutResPaging(TRUE, STRING_DIR_HELP1);
+}
+
+
+
+/*
+ * DirReadParameters
+ *
+ * Parse the parameters and switches of the command line and exports them
+ */
+static BOOL
+DirReadParam(LPTSTR Line, /* [IN] The line with the parameters & switches */
+ LPTSTR** params, /* [OUT] The parameters after parsing */
+ LPINT entries, /* [OUT] The number of parameters after parsing */
+ LPDIRSWITCHFLAGS lpFlags) /* [IN/OUT] The flags after calculating switches */
+{
+ TCHAR cCurSwitch; /* The current switch */
+ TCHAR cCurChar; /* Current examing character */
+ TCHAR cCurUChar; /* Current upper examing character */
+ BOOL bNegative; /* Negative switch */
+ BOOL bPNegative; /* Negative switch parameter */
+ BOOL bIntoQuotes; /* A flag showing if we are in quotes (") */
+ LPTSTR ptrStart; /* A pointer to the first character of a parameter */
+ LPTSTR ptrEnd; /* A pointer to the last character of a parameter */
+ LPTSTR temp;
+
+ /* Initialize parameter array */
+ *params = malloc(sizeof(LPTSTR));
+ if(!params)
+ return FALSE;
+ *params = NULL;
+ *entries = 0;
+ ptrStart = NULL;
+ ptrEnd = NULL;
+
+ /* Initialize variables; */
+ cCurSwitch = _T(' ');
+ bNegative = FALSE;
+ bPNegative = FALSE;
+ bIntoQuotes = FALSE;
+
+ /* We suppose that switch parameters
+ were given to avoid setting them to default
+ if the switch was not given */
+ lpFlags->stAttribs.bParSetted = TRUE;
+ lpFlags->stOrderBy.bParSetted = TRUE;
+ lpFlags->stTimeField.bParSetted = TRUE;
+
+
+ /* Main Loop (see README_DIR.txt) */
+ /* scan the command line char per char, and we process its char */
+ while (*Line)
+ {
+ /* we save current character as it is and its upper case */
+ cCurChar = *Line;
+ cCurUChar = _totupper(*Line);
+
+ /* 1st section (see README_DIR.txt) */
+ /* When a switch is expecting */
+ if (cCurSwitch == _T('/'))
+ {
+ if ((cCurUChar == _T('A')) ||(cCurUChar == _T('T')) || (cCurUChar == _T('O')))
+ {
+ cCurSwitch = cCurUChar;
+ switch (cCurUChar)
+ {
+ case _T('A'):
+ lpFlags->stAttribs.bUnSet = bNegative;
+ lpFlags->stAttribs.bParSetted = FALSE;
+ break;
+ case _T('T'):
+ lpFlags->stTimeField.bUnSet = bNegative;
+ lpFlags->stTimeField.bParSetted = FALSE;
+ break;
+ case _T('O'):
+ lpFlags->stOrderBy.bUnSet = bNegative;
+ lpFlags->stOrderBy.bParSetted = FALSE;
+ break;
+ }
+ }
+ else if (cCurUChar == _T('L'))
+ lpFlags->bLowerCase = ! bNegative;
+ else if (cCurUChar == _T('B'))
+ lpFlags->bBareFormat = ! bNegative;
+ else if (cCurUChar == _T('C'))
+ lpFlags->bTSeperator = ! bNegative;
+ else if (cCurUChar == _T('W'))
+ lpFlags->bWideList = ! bNegative;
+ else if (cCurUChar == _T('D'))
+ lpFlags->bWideListColSort = ! bNegative;
+ else if (cCurUChar == _T('N'))
+ lpFlags->bNewLongList = ! bNegative;
+ else if (cCurUChar == _T('P'))
+ lpFlags->bPause = ! bNegative;
+ else if (cCurUChar == _T('Q'))
+ lpFlags->bUser = ! bNegative;
+ else if (cCurUChar == _T('S'))
+ lpFlags->bRecursive = ! bNegative;
+ else if (cCurUChar == _T('X'))
+ lpFlags->bShortName = ! bNegative;
+ else if (cCurChar == _T('4'))
+ lpFlags->b4Digit = ! bNegative;
+ else if (cCurChar == _T('?'))
+ {
+ DirHelp();
+ return FALSE;
+ }
+ else if (cCurChar == _T('-'))
+ {
+ bNegative = TRUE;
+ }
+ else
+ {
+ error_invalid_switch ((TCHAR)_totupper (*Line));
+ return FALSE;
+ }
+
+ /* We check if we calculated the negative value and realese the flag */
+ if ((cCurChar != _T('-')) && bNegative)
+ bNegative = FALSE;
+
+ /* if not a,o,t or - option then next parameter is not a switch */
+ if ((cCurSwitch == _T('/')) && (!bNegative))
+ cCurSwitch = _T(' ');
+
+ }
+ else if ((cCurSwitch == _T(' ')) || (cCurSwitch == _T('P')))
+ {
+ /* 2nd section (see README_DIR.txt) */
+ /* We are expecting parameter or the unknown */
+
+ if (cCurChar == _T('/'))
+ cCurSwitch = _T('/');
+
+ /* Process a spacer */
+ else if (cCurChar == _T(' '))
+ {
+ if (!bIntoQuotes)
+ {
+ cCurSwitch = _T(' ');
+ if(ptrStart && ptrEnd)
+ {
+ temp = malloc((ptrEnd - ptrStart) + 2 * sizeof (TCHAR));
+ if(!temp)
+ return FALSE;
+ memcpy(temp, ptrStart, (ptrEnd - ptrStart) + 2 * sizeof (TCHAR));
+ temp[(ptrEnd - ptrStart + 1)] = _T('\0');
+ if(!add_entry(entries, params, temp))
+ {
+ free(temp);
+ freep(*params);
+ return FALSE;
+ }
+
+ free(temp);
+
+ ptrStart = NULL;
+ ptrEnd = NULL;
+ }
+ }
+
+ }
+ else if (cCurChar == _T('\"'))
+ {
+ /* Process a quote */
+ bIntoQuotes = !bIntoQuotes;
+ if(!bIntoQuotes)
+ ptrEnd = Line;
+ }
+ else
+ {
+ /* Process a character for parameter */
+ if ((cCurSwitch == _T(' ')) && ptrStart && ptrEnd)
+ {
+ temp = malloc((ptrEnd - ptrStart) + 2 * sizeof (TCHAR));
+ if(!temp)
+ return FALSE;
+ memcpy(temp, ptrStart, (ptrEnd - ptrStart) + 2 * sizeof (TCHAR));
+ temp[(ptrEnd - ptrStart + 1)] = _T('\0');
+ if(!add_entry(entries, params, temp))
+ {
+ free(temp);
+ freep(*params);
+ return FALSE;
+ }
+
+ free(temp);
+
+ ptrStart = NULL;
+ ptrEnd = NULL;
+ }
+ cCurSwitch = _T('P');
+ if(!ptrStart)
+ ptrStart = ptrEnd = Line;
+ ptrEnd = Line;
+ }
+ }
+ else
+ {
+ /* 3rd section (see README_DIR.txt) */
+ /* We are waiting for switch parameters */
+
+ /* Check if there are no more switch parameters */
+ if ((cCurChar == _T('/')) || ( cCurChar == _T(' ')))
+ {
+ /* Wrong desicion path, reprocess current character */
+ cCurSwitch = cCurChar;
+ continue;
+ }
+ /* Process parameter switch */
+ switch(cCurSwitch)
+ {
+ case _T('A'): /* Switch parameters for /A (attributes filter) */
+ /* Ok a switch parameter was given */
+ lpFlags->stAttribs.bParSetted = TRUE;
+
+ if (cCurChar == _T(':'))
+ /* =V= dead command, used to make the "if" work */
+ cCurChar = cCurChar;
+ else if(cCurChar == _T('-'))
+ bPNegative = TRUE;
+ else if(cCurUChar == _T('D'))
+ {
+ lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_DIRECTORY;
+ if (bPNegative)
+ lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_DIRECTORY;
+ else
+ lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_DIRECTORY;
+ }
+ else if(cCurUChar == _T('R'))
+ {
+ lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_READONLY;
+ if (bPNegative)
+ lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_READONLY;
+ else
+ lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_READONLY;
+ }
+ else if(cCurUChar == _T('H'))
+ {
+ lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_HIDDEN;
+ if (bPNegative)
+ lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_HIDDEN;
+ else
+ lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_HIDDEN;
+ }
+ else if(cCurUChar == _T('A'))
+ {
+ lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_ARCHIVE;
+ if (bPNegative)
+ lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_ARCHIVE;
+ else
+ lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_ARCHIVE;
+ }
+ else if(cCurUChar == _T('S'))
+ {
+ lpFlags->stAttribs.dwAttribMask |= FILE_ATTRIBUTE_SYSTEM;
+ if (bPNegative)
+ lpFlags->stAttribs.dwAttribVal &= ~FILE_ATTRIBUTE_SYSTEM;
+ else
+ lpFlags->stAttribs.dwAttribVal |= FILE_ATTRIBUTE_SYSTEM;
+ }
+ else
+ {
+ error_parameter_format((TCHAR)_totupper (*Line));
+ return FALSE;
+ }
+ break;
+ case _T('T'): /* Switch parameters for /T (time field) */
+
+ /* Ok a switch parameter was given */
+ lpFlags->stTimeField.bParSetted = TRUE;
+
+ if (cCurChar == _T(':'))
+ /* =V= dead command, used to make the "if" work */
+ cCurChar = cCurChar;
+ else if(cCurUChar == _T('C'))
+ lpFlags->stTimeField.eTimeField= TF_CREATIONDATE ;
+ else if(cCurUChar == _T('A'))
+ lpFlags->stTimeField.eTimeField= TF_LASTACCESSEDDATE ;
+ else if(cCurUChar == _T('W'))
+ lpFlags->stTimeField.eTimeField= TF_MODIFIEDDATE ;
+ else
+ {
+ error_parameter_format((TCHAR)_totupper (*Line));
+ return FALSE;
+ }
+ break;
+ case _T('O'): /* Switch parameters for /O (order) */
+ /* Ok a switch parameter was given */
+ lpFlags->stOrderBy.bParSetted = TRUE;
+
+ if (cCurChar == _T(':'))
+ /* <== dead command, used to make the "if" work */
+ cCurChar = cCurChar;
+ else if(cCurChar == _T('-'))
+ bPNegative = TRUE;
+ else if(cCurUChar == _T('N'))
+ {
+ if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++;
+ lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative;
+ lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_NAME;
+ }
+ else if(cCurUChar == _T('S'))
+ {
+ if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++;
+ lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative;
+ lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_SIZE;
+ }
+ else if(cCurUChar == _T('G'))
+ {
+ if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++;
+ lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative;
+ lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_DIRECTORY;
+ }
+ else if(cCurUChar == _T('E'))
+ {
+ if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++;
+ lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative;
+ lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_EXTENSION;
+ }
+ else if(cCurUChar == _T('D'))
+ {
+ if (lpFlags->stOrderBy.sCriteriaCount < 3) lpFlags->stOrderBy.sCriteriaCount++;
+ lpFlags->stOrderBy.bCriteriaRev[lpFlags->stOrderBy.sCriteriaCount - 1] = bPNegative;
+ lpFlags->stOrderBy.eCriteria[lpFlags->stOrderBy.sCriteriaCount - 1] = ORDER_TIME;
+ }
+
+ else
+ {
+ error_parameter_format((TCHAR)_totupper (*Line));
+ return FALSE;
+ }
+
+
+ }
+ /* We check if we calculated the negative value and realese the flag */
+ if ((cCurChar != _T('-')) && bPNegative)
+ bPNegative = FALSE;
+ }
+
+ Line++;
+ }
+ /* Terminate the parameters */
+ if(ptrStart && ptrEnd)
+ {
+ temp = malloc((ptrEnd - ptrStart) + 2 * sizeof (TCHAR));
+ if(!temp)
+ return FALSE;
+ memcpy(temp, ptrStart, (ptrEnd - ptrStart) + 2 * sizeof (TCHAR));
+ temp[(ptrEnd - ptrStart + 1)] = _T('\0');
+ if(!add_entry(entries, params, temp))
+ {
+ free(temp);
+ freep(*params);
+ return FALSE;
+ }
+
+ free(temp);
+
+ ptrStart = NULL;
+ ptrEnd = NULL;
+ }
+
+ /* Calculate the switches with no switch paramater */
+ if (!(lpFlags->stAttribs.bParSetted))
+ {
+ lpFlags->stAttribs.dwAttribVal = 0L;
+ lpFlags->stAttribs.dwAttribMask = lpFlags->stAttribs.dwAttribVal;
+ }
+ if (!(lpFlags->stOrderBy.bParSetted))
+ {
+ lpFlags->stOrderBy.sCriteriaCount = 1;
+ lpFlags->stOrderBy.eCriteria[0] = ORDER_NAME;
+ lpFlags->stOrderBy.bCriteriaRev[0] = FALSE;
+ }
+ if (!(lpFlags->stOrderBy.bParSetted))
+ lpFlags->stTimeField.eTimeField = TF_MODIFIEDDATE ;
+
+ /* Calculate the unsetted switches (the "-" prefixed)*/
+ if (lpFlags->stAttribs.bUnSet)
+ {
+ lpFlags->stAttribs.bUnSet = FALSE;
+ lpFlags->stAttribs.dwAttribVal = 0L;
+ lpFlags->stAttribs.dwAttribMask = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
+ }
+ if (lpFlags->stOrderBy.bUnSet)
+ {
+ lpFlags->stOrderBy.bUnSet = FALSE;
+ lpFlags->stOrderBy.sCriteriaCount = 0;
+ }
+ if (lpFlags->stTimeField.bUnSet )
+ {
+ lpFlags->stTimeField.bUnSet = FALSE;
+ lpFlags->stTimeField.eTimeField = TF_MODIFIEDDATE;
+ }
+ return TRUE;
+}
+
+
+/*
+ * ExtendFilespec
+ *
+ * extend the filespec, possibly adding wildcards
+ */
+static VOID
+ExtendFilespec (LPTSTR file)
+{
+ INT len = 0;
+
+ if (!file)
+ return;
+
+
+ /* if no file spec, change to "*.*" */
+ if (*file == _T('\0'))
+ {
+ _tcscpy (file, _T("*.*"));
+ return;
+ }
+
+ // add support for *.
+ if ((file[0] == _T('*')) && (file[1] == _T('.') ))
+ {
+ return;
+ }
+
+ /* if starts with . add * in front */
+ if (*file == _T('.'))
+ {
+ memmove (&file[1], &file[0], (_tcslen (file) + 1) * sizeof(TCHAR));
+ file[0] = _T('*');
+ }
+
+ /* if no . add .* */
+ if (!_tcschr (file, _T('.')))
+ {
+ _tcscat (file, _T(".*"));
+ return;
+ }
+
+
+
+ /* if last character is '.' add '*' */
+ len = _tcslen (file);
+ if (file[len - 1] == _T('.'))
+ {
+ _tcscat (file, _T("*"));
+ return;
+ }
+}
+
+
+/*
+ * dir_parse_pathspec
+ *
+ * split the pathspec into drive, directory, and filespec
+ */
+static INT
+DirParsePathspec (LPTSTR szPathspec, LPTSTR szPath, LPTSTR szFilespec)
+{
+ TCHAR szOrigPath[MAX_PATH];
+ LPTSTR start;
+ LPTSTR tmp;
+ INT i;
+ BOOL bWildcards = FALSE;
+
+ GetCurrentDirectory (MAX_PATH, szOrigPath);
+
+ /* get the drive and change to it */
+ if (szPathspec[1] == _T(':'))
+ {
+ TCHAR szRootPath[] = _T("A:");
+
+ szRootPath[0] = szPathspec[0];
+ start = szPathspec + 2;
+ if (!SetCurrentDirectory (szRootPath))
+ {
+ ErrorMessage (GetLastError(), NULL);
+ return 1;
+ }
+ }
+ else
+ {
+ start = szPathspec;
+ }
+
+
+ /* check for wildcards */
+ for (i = 0; szPathspec[i]; i++)
+ {
+ if (szPathspec[i] == _T('*') || szPathspec[i] == _T('?'))
+ bWildcards = TRUE;
+ }
+
+ /* check if this spec is a directory */
+ if (!bWildcards)
+ {
+ if (SetCurrentDirectory (szPathspec))
+ {
+ _tcscpy (szFilespec, _T("*.*"));
+
+ if (!GetCurrentDirectory (MAX_PATH, szPath))
+ {
+ szFilespec[0] = _T('\0');
+ SetCurrentDirectory (szOrigPath);
+ error_out_of_memory();
+ return 1;
+ }
+
+ SetCurrentDirectory (szOrigPath);
+ return 0;
+ }
+ }
+
+ /* find the file spec */
+ tmp = _tcsrchr (start, _T('\\'));
+
+ /* if no path is specified */
+ if (!tmp)
+ {
+ _tcscpy (szFilespec, start);
+ ExtendFilespec (szFilespec);
+ if (!GetCurrentDirectory (MAX_PATH, szPath))
+ {
+ szFilespec[0] = _T('\0');
+ SetCurrentDirectory (szOrigPath);
+ error_out_of_memory();
+ return 1;
+ }
+
+ SetCurrentDirectory (szOrigPath);
+ return 0;
+ }
+
+ /* get the filename */
+ _tcscpy (szFilespec, tmp+1);
+ ExtendFilespec (szFilespec);
+
+ if (tmp == start)
+ {
+ /* change to the root directory */
+ if (!SetCurrentDirectory (_T("\\")))
+ {
+ szFilespec[0] = _T('\0');
+ SetCurrentDirectory (szOrigPath);
+ error_path_not_found ();
+ return 1;
+ }
+ }
+ else
+ {
+ *tmp = _T('\0');
+
+ /* change to this directory */
+ if (!SetCurrentDirectory (start))
+ {
+ *tmp = _T('\\');
+ szFilespec[0] = _T('\0');
+ SetCurrentDirectory (szOrigPath);
+ error_path_not_found ();
+ return 1;
+ }
+ }
+
+ /* get the full name of the directory */
+ if (!GetCurrentDirectory (MAX_PATH, szPath))
+ {
+ *tmp = _T('\\');
+ szFilespec[0] = _T('\0');
+ SetCurrentDirectory (szOrigPath);
+ error_out_of_memory ();
+ return 1;
+ }
+
+ *tmp = _T('\\');
+
+ SetCurrentDirectory (szOrigPath);
+
+ return 0;
+}
+
+
+/*
+ * incline
+ *
+ * increment our line if paginating, display message at end of screen
+ */
+#if 0
+static BOOL
+IncLine (LPINT pLine, LPDIRSWITCHFLAGS lpFlags)
+{
+ BOOL bError;
+ CONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo;
+ LONG WindowHeight;
+
+ bError = GetConsoleScreenBufferInfo(hConsole, &lpConsoleScreenBufferInfo);
+
+ WindowHeight = lpConsoleScreenBufferInfo.srWindow.Bottom - lpConsoleScreenBufferInfo.srWindow.Top;
+
+ /* That prevents bad behiour if WindowHeight could not be calculated */
+ if (!WindowHeight)
+ {
+ WindowHeight= 1000000;
+ }
+
+ if (!(lpFlags->bPause))
+ return FALSE;
+
+ (*pLine)++;
+
+ /*
+ * Because I don't know if WindowsHeight work in all cases,
+ * perhaps then maxy is the right value
+ */
+ if (*pLine >= (int)maxy - 2 || *pLine >= WindowHeight)
+ {
+ *pLine = 0;
+ return (PagePrompt () == PROMPT_BREAK);
+ }
+
+ return FALSE;
+}
+#endif
+
+/*
+ * PrintDirectoryHeader
+ *
+ * print the header for the dir command
+ */
+static BOOL
+PrintDirectoryHeader(LPTSTR szPath, LPINT pLine, LPDIRSWITCHFLAGS lpFlags)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR szRootName[MAX_PATH];
+ TCHAR szVolName[80];
+ DWORD dwSerialNr;
+ LPTSTR p;
+
+ if (lpFlags->bBareFormat)
+ return TRUE;
+
+ /* build usable root path */
+ if (szPath[1] == _T(':') && szPath[2] == _T('\\'))
+ {
+ /* normal path */
+ szRootName[0] = szPath[0];
+ szRootName[1] = _T(':');
+ szRootName[2] = _T('\\');
+ szRootName[3] = 0;
+ }
+ else if (szPath[0] == _T('\\') && szPath[1] == _T('\\'))
+ {
+ /* UNC path */
+ p = _tcschr(&szPath[2], _T('\\'));
+ if (p == NULL)
+ {
+ error_invalid_drive();
+ return(FALSE);
+ }
+ p = _tcschr(p+1, _T('\\'));
+ if (p == NULL)
+ {
+ _tcscpy(szRootName, szPath);
+ _tcscat(szRootName, _T("\\"));
+ }
+ else
+ {
+ *p = 0;
+ _tcscpy(szRootName, szPath);
+ _tcscat(szRootName, _T("\\"));
+ *p = _T('\\');
+ }
+ }
+ else
+ {
+ error_invalid_drive();
+ return(FALSE);
+ }
+
+ /* get the media ID of the drive */
+ if (!GetVolumeInformation(szRootName, szVolName, 80, &dwSerialNr,
+ NULL, NULL, NULL, 0))
+ {
+ error_invalid_drive();
+ return(FALSE);
+ }
+
+ /* print drive info */
+ if (szVolName[0] != _T('\0'))
+ {
+ LoadString(CMD_ModuleHandle, STRING_DIR_HELP2, szMsg, RC_STRING_MAX_SIZE);
+ //needs to have first paramter as TRUE because
+ //this is the first output and need to clear the static
+ if(lpFlags->bPause)
+ ConOutPrintfPaging(TRUE,szMsg, szRootName[0], szVolName);
+ else
+ ConOutPrintf(szMsg, szRootName[0], szVolName);
+
+ }
+ else
+ {
+ LoadString(CMD_ModuleHandle, STRING_DIR_HELP3, szMsg, RC_STRING_MAX_SIZE);
+ if(lpFlags->bPause)
+ ConOutPrintfPaging(TRUE,szMsg, szRootName[0]);
+ else
+ ConOutPrintf(szMsg, szRootName[0]);
+ }
+
+ /* print the volume serial number if the return was successful */
+ LoadString(CMD_ModuleHandle, STRING_DIR_HELP4, (LPTSTR) szMsg, RC_STRING_MAX_SIZE);
+ if(lpFlags->bPause)
+ ConOutPrintfPaging(FALSE,szMsg,
+ HIWORD(dwSerialNr),
+ LOWORD(dwSerialNr));
+ else
+ ConOutPrintf(szMsg,
+ HIWORD(dwSerialNr),
+ LOWORD(dwSerialNr));
+
+
+ return TRUE;
+}
+
+
+/*
+ * convert
+ *
+ * insert commas into a number
+ *
+ */
+#if 0
+static INT
+ConvertULong (ULONG num, LPTSTR des, INT len)
+{
+ TCHAR temp[32];
+ INT c = 0;
+ INT n = 0;
+
+ if (num == 0)
+ {
+ des[0] = _T('0');
+ des[1] = _T('\0');
+ n = 1;
+ }
+ else
+ {
+ temp[31] = 0;
+ while (num > 0)
+ {
+ if (((c + 1) % (nNumberGroups + 1)) == 0)
+ temp[30 - c++] = cThousandSeparator;
+ temp[30 - c++] = (TCHAR)(num % 10) + _T('0');
+ num /= 10;
+ }
+
+ for (n = 0; n <= c; n++)
+ des[n] = temp[31 - c + n];
+ }
+
+ return n;
+}
+#endif
+
+static VOID
+DirPrintFileDateTime(TCHAR *lpDate,
+ TCHAR *lpTime,
+ LPWIN32_FIND_DATA lpFile,
+ LPDIRSWITCHFLAGS lpFlags)
+{
+ FILETIME ft;
+ SYSTEMTIME dt;
+ TCHAR szDate[30];
+ TCHAR szTime[30];
+ WORD wYear;
+
+ /* Select the right time field */
+ switch (lpFlags->stTimeField.eTimeField)
+ {
+ case TF_CREATIONDATE:
+ if (!FileTimeToLocalFileTime(&lpFile->ftCreationTime, &ft))
+ return;
+ FileTimeToSystemTime(&ft, &dt);
+ break;
+
+ case TF_LASTACCESSEDDATE :
+ if (!FileTimeToLocalFileTime(&lpFile->ftLastAccessTime, &ft))
+ return;
+ FileTimeToSystemTime(&ft, &dt);
+ break;
+
+ case TF_MODIFIEDDATE:
+ if (!FileTimeToLocalFileTime(&lpFile->ftLastWriteTime, &ft))
+ return;
+ FileTimeToSystemTime(&ft, &dt);
+ break;
+ }
+
+ /* Format date */
+ wYear = (lpFlags->b4Digit) ? dt.wYear : dt.wYear%100;
+ switch (nDateFormat)
+ {
+ case 0: /* mmddyy */
+ default:
+ _stprintf (szDate, _T("%02d%c%02d%c%0*d"),
+ dt.wMonth, cDateSeparator,
+ dt.wDay, cDateSeparator,
+ lpFlags->b4Digit?4:2, wYear);
+ break;
+
+ case 1: /* ddmmyy */
+ _stprintf (szDate, _T("%02d%c%02d%c%0*d"),
+ dt.wDay, cDateSeparator, dt.wMonth,
+ cDateSeparator,lpFlags->b4Digit?4:2, wYear);
+ break;
+
+ case 2: /* yymmdd */
+ _stprintf (szDate, _T("%0*d%c%02d%c%02d"),
+ lpFlags->b4Digit?4:2, wYear, cDateSeparator,
+ dt.wMonth, cDateSeparator, dt.wDay);
+ break;
+ }
+ /* Format Time */
+ switch (nTimeFormat)
+ {
+ case 0: /* 12 hour format */
+ default:
+ _stprintf (szTime,_T(" %02d%c%02u%c"),
+ (dt.wHour == 0 ? 12 : (dt.wHour <= 12 ? dt.wHour : dt.wHour - 12)),
+ cTimeSeparator,
+ dt.wMinute, (dt.wHour <= 11 ? _T('a') : _T('p')));
+ break;
+
+ case 1: /* 24 hour format */
+ _stprintf (szTime, _T(" %02d%c%02u"),
+ dt.wHour, cTimeSeparator, dt.wMinute);
+ break;
+ }
+ /* Copy results */
+ _tcscpy(lpDate, szDate);
+ _tcscpy(lpTime, szTime);
+}
+
+
+static VOID
+GetUserDiskFreeSpace(LPCTSTR lpRoot,
+ PULARGE_INTEGER lpFreeSpace)
+{
+ PGETFREEDISKSPACEEX pGetFreeDiskSpaceEx;
+ HINSTANCE hInstance;
+ DWORD dwSecPerCl;
+ DWORD dwBytPerSec;
+ DWORD dwFreeCl;
+ DWORD dwTotCl;
+ ULARGE_INTEGER TotalNumberOfBytes, TotalNumberOfFreeBytes;
+
+ lpFreeSpace->QuadPart = 0;
+
+ hInstance = LoadLibrary(_T("KERNEL32"));
+ if (hInstance != NULL)
+ {
+ pGetFreeDiskSpaceEx = (PGETFREEDISKSPACEEX)GetProcAddress(hInstance,
+#ifdef _UNICODE
+ "GetDiskFreeSpaceExW");
+#else
+ "GetDiskFreeSpaceExA");
+#endif
+ if (pGetFreeDiskSpaceEx != NULL)
+ {
+ if (pGetFreeDiskSpaceEx(lpRoot, lpFreeSpace, &TotalNumberOfBytes, &TotalNumberOfFreeBytes) == TRUE)
+ return;
+ }
+ FreeLibrary(hInstance);
+ }
+
+ GetDiskFreeSpace(lpRoot,
+ &dwSecPerCl,
+ &dwBytPerSec,
+ &dwFreeCl,
+ &dwTotCl);
+
+ lpFreeSpace->QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl;
+}
+
+
+/*
+ * print_summary: prints dir summary
+ * Added by Rob Lake 06/17/98 to compact code
+ * Just copied Tim's Code and patched it a bit
+ *
+ */
+static INT
+PrintSummary(LPTSTR szPath,
+ ULONG ulFiles,
+ ULONG ulDirs,
+ ULARGE_INTEGER u64Bytes,
+ LPINT pLine,
+ LPDIRSWITCHFLAGS lpFlags)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR szBuffer[64];
+ ULARGE_INTEGER uliFree;
+ TCHAR szRoot[] = _T("A:\\");
+
+
+ /* Here we check if we didn't find anything */
+ if (!(ulFiles + ulDirs))
+ {
+ error_file_not_found();
+ return 1;
+ }
+
+
+ /* In bare format we don't print results */
+ if (lpFlags->bBareFormat)
+ return 0;
+
+ /* Print recursive specific results */
+
+ /* Take this code offline to fix /S does not print duoble info */
+ if (lpFlags->bRecursive)
+ {
+ ConvertULargeInteger(u64Bytes, szBuffer, sizeof(szBuffer), lpFlags->bTSeperator);
+ LoadString(CMD_ModuleHandle, STRING_DIR_HELP5, szMsg, RC_STRING_MAX_SIZE);
+ if(lpFlags->bPause)
+ ConOutPrintfPaging(FALSE,szMsg,ulFiles, szBuffer);
+ else
+ ConOutPrintf(szMsg,ulFiles, szBuffer);
+ }
+ else
+ {
+
+ /* Print File Summary */
+ /* Condition to print summary is:
+ If we are not in bare format and if we have results! */
+ if (ulFiles > 0)
+ {
+ ConvertULargeInteger(u64Bytes, szBuffer, 20, lpFlags->bTSeperator);
+ LoadString(CMD_ModuleHandle, STRING_DIR_HELP8, szMsg, RC_STRING_MAX_SIZE);
+ if(lpFlags->bPause)
+ ConOutPrintfPaging(FALSE,szMsg,ulFiles, szBuffer);
+ else
+ ConOutPrintf(szMsg,ulFiles, szBuffer);
+
+ }
+
+ }
+ /* Print total directories and freespace */
+ szRoot[0] = szPath[0];
+ GetUserDiskFreeSpace(szRoot, &uliFree);
+ ConvertULargeInteger(uliFree, szBuffer, sizeof(szBuffer), lpFlags->bTSeperator);
+ LoadString(CMD_ModuleHandle, STRING_DIR_HELP6, (LPTSTR) szMsg, RC_STRING_MAX_SIZE);
+ if(lpFlags->bPause)
+ ConOutPrintfPaging(FALSE,szMsg,ulDirs, szBuffer);
+ else
+ ConOutPrintf(szMsg,ulDirs, szBuffer);
+
+ return 0;
+}
+
+/*
+ * getExt
+ *
+ * Get the extension of a filename
+ */
+TCHAR* getExt(const TCHAR* file)
+{
+ static TCHAR *NoExt = _T("");
+ TCHAR* lastdot = _tcsrchr(file, _T('.'));
+ return (lastdot != NULL ? lastdot + 1 : NoExt);
+}
+
+/*
+ * getName
+ *
+ * Get the name of the file without extension
+ */
+static LPTSTR
+getName(const TCHAR* file, TCHAR * dest)
+{
+ int iLen;
+ LPTSTR end;
+
+ /* Check for "." and ".." folders */
+ if ((_tcscmp(file, _T(".")) == 0) ||
+ (_tcscmp(file, _T("..")) == 0))
+ {
+ _tcscpy(dest,file);
+ return dest;
+ }
+
+ end = _tcsrchr(file, _T('.'));
+ if (!end)
+ iLen = _tcslen(file);
+ else
+ iLen = (end - file);
+
+
+ _tcsncpy(dest, file, iLen);
+ *(dest + iLen) = _T('\0');
+
+ return dest;
+}
+
+
+/*
+ * DirPrintNewList
+ *
+ * The function that prints in new style
+ */
+static VOID
+DirPrintNewList(LPWIN32_FIND_DATA ptrFiles[], /* [IN]Files' Info */
+ DWORD dwCount, /* [IN] The quantity of files */
+ TCHAR *szCurPath, /* [IN] Full path of current directory */
+ LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */
+{
+ DWORD i;
+ TCHAR szSize[30];
+ TCHAR szShortName[15];
+ TCHAR szDate[20];
+ TCHAR szTime[20];
+ INT iSizeFormat;
+ ULARGE_INTEGER u64FileSize;
+
+ for (i = 0;i < dwCount;i++)
+ {
+ /* Calculate size */
+ if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+ /* Directory */
+ iSizeFormat = -14;
+ _tcscpy(szSize, _T("<DIR>"));
+ }
+ else
+ {
+ /* File */
+ iSizeFormat = 14;
+ u64FileSize.HighPart = ptrFiles[i]->nFileSizeHigh;
+ u64FileSize.LowPart = ptrFiles[i]->nFileSizeLow;
+ ConvertULargeInteger(u64FileSize, szSize, 20, lpFlags->bTSeperator);
+ }
+
+ /* Calculate short name */
+ szShortName[0] = _T('\0');
+ if (lpFlags->bShortName)
+ _stprintf(szShortName, _T(" %-12s"), ptrFiles[i]->cAlternateFileName);
+
+ /* Format date and time */
+ DirPrintFileDateTime(szDate, szTime, ptrFiles[i], lpFlags);
+
+ /* Print the line */
+ if(lpFlags->bPause)
+ {
+ if (ConOutPrintfPaging(FALSE,_T("%10s %-8s %*s%s %s\n"),
+ szDate,
+ szTime,
+ iSizeFormat,
+ szSize,
+ szShortName,
+ ptrFiles[i]->cFileName) == 1)
+ return ;
+ }
+ else
+ ConOutPrintf(_T("%10s %-8s %*s%s %s\n"),
+ szDate,
+ szTime,
+ iSizeFormat,
+ szSize,
+ szShortName,
+ ptrFiles[i]->cFileName);
+ }
+}
+
+
+/*
+ * DirPrintWideList
+ *
+ * The function that prints in wide list
+ */
+static VOID
+DirPrintWideList(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */
+ DWORD dwCount, /* [IN] The quantity of files */
+ TCHAR *szCurPath, /* [IN] Full path of current directory */
+ LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */
+{
+ SHORT iScreenWidth;
+ USHORT iColumns;
+ USHORT iLines;
+ UINT iLongestName;
+ TCHAR szTempFname[MAX_PATH];
+ DWORD i;
+ DWORD j;
+ DWORD temp;
+
+ /* Calculate longest name */
+ iLongestName = 1;
+ for (i = 0; i < dwCount; i++)
+ {
+ if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+ /* Directories need 2 additinal characters for brackets */
+ if ((_tcslen(ptrFiles[i]->cFileName) + 2) > iLongestName)
+ iLongestName = _tcslen(ptrFiles[i]->cFileName) + 2;
+ }
+ else
+ {
+ if (_tcslen(ptrFiles[i]->cFileName) > iLongestName)
+ iLongestName = _tcslen(ptrFiles[i]->cFileName);
+ }
+ }
+
+ /* Count the highest number of columns */
+ GetScreenSize(&iScreenWidth, 0);
+ iColumns = iScreenWidth / iLongestName;
+
+ /* Check if there is enough space for spaces between names */
+ if (((iLongestName * iColumns) + iColumns) >= (UINT)iScreenWidth)
+ iColumns --;
+
+ /* A last check at iColumns to avoid division by zero */
+ if (!(iColumns))
+ iColumns = 1;
+
+ /* Print Column sorted */
+ if (lpFlags->bWideListColSort)
+ {
+ /* Calculate the lines that will be printed */
+// iLines = ceil((float)dwCount/(float)iColumns);
+ iLines = (USHORT)(dwCount / iColumns);
+
+ for (i = 0;i < iLines;i++)
+ {
+ for (j = 0; j < iColumns; j++)
+ {
+ temp = (j * iLines) + i;
+ if (temp >= dwCount)
+ break;
+
+ if (ptrFiles[temp]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ _stprintf(szTempFname, _T("[%s]"), ptrFiles[temp]->cFileName);
+ else
+ _stprintf(szTempFname, _T("%s"), ptrFiles[temp]->cFileName);
+
+ if(lpFlags->bPause)
+ ConOutPrintfPaging(FALSE,_T("%-*s"), iLongestName + 1 , szTempFname);
+ else
+ ConOutPrintf(_T("%-*s"), iLongestName + 1 , szTempFname);
+ }
+
+ if(lpFlags->bPause)
+ ConOutPrintfPaging(FALSE,_T("\n"));
+ else
+ ConOutPrintf(_T("\n"));
+ }
+ }
+ else
+ {
+ /* Print Line sorted */
+ for (i = 0; i < dwCount; i++)
+ {
+ if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ _stprintf(szTempFname, _T("[%s]"), ptrFiles[i]->cFileName);
+ else
+ _stprintf(szTempFname, _T("%s"), ptrFiles[i]->cFileName);
+
+ if(lpFlags->bPause)
+ ConOutPrintfPaging(FALSE,_T("%-*s"), iLongestName + 1, szTempFname );
+ else
+ ConOutPrintf(_T("%-*s"), iLongestName + 1, szTempFname );
+
+ /*
+ * We print a new line at the end of each column
+ * except for the case that it is the last item.
+ */
+ if (!((i + 1) % iColumns) && (i < (dwCount - 1)))
+ {
+ if(lpFlags->bPause)
+ ConOutPrintfPaging(FALSE,_T("\n"));
+ else
+ ConOutPrintf(_T("\n"));
+ }
+ }
+
+ /* Add a new line after the last item */
+ if(lpFlags->bPause)
+ ConOutPrintfPaging(FALSE,_T("\n"));
+ else
+ ConOutPrintf(_T("\n"));
+ }
+}
+
+
+/*
+ * DirPrintOldList
+ *
+ * The function that prints in old style
+ */
+static VOID
+DirPrintOldList(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */
+ DWORD dwCount, /* [IN] The quantity of files */
+ TCHAR * szCurPath, /* [IN] Full path of current directory */
+ LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */
+{
+DWORD i; /* An indexer for "for"s */
+TCHAR szName[10]; /* The name of file */
+TCHAR szExt[5]; /* The extension of file */
+TCHAR szDate[30],szTime[30]; /* Used to format time and date */
+TCHAR szSize[30]; /* The size of file */
+int iSizeFormat; /* The format of size field */
+ULARGE_INTEGER u64FileSize; /* The file size */
+
+ for(i = 0;i < dwCount;i++)
+ {
+ /* Broke 8.3 format */
+ if (*ptrFiles[i]->cAlternateFileName )
+ {
+ /* If the file is long named then we read the alter name */
+ getName( ptrFiles[i]->cAlternateFileName, szName);
+ _tcscpy(szExt, getExt( ptrFiles[i]->cAlternateFileName));
+ }
+ else
+ {
+ /* If the file is not long name we read its original name */
+ getName( ptrFiles[i]->cFileName, szName);
+ _tcscpy(szExt, getExt( ptrFiles[i]->cFileName));
+ }
+
+ /* Calculate size */
+ if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+ /* Directory, no size it's a directory*/
+ iSizeFormat = -17;
+ _tcscpy(szSize, _T("<DIR>"));
+ }
+ else
+ {
+ /* File */
+ iSizeFormat = 17;
+ u64FileSize.HighPart = ptrFiles[i]->nFileSizeHigh;
+ u64FileSize.LowPart = ptrFiles[i]->nFileSizeLow;
+ ConvertULargeInteger(u64FileSize, szSize, 20, lpFlags->bTSeperator);
+ }
+
+ /* Format date and time */
+ DirPrintFileDateTime(szDate,szTime,ptrFiles[i],lpFlags);
+
+ /* Print the line */
+ if(lpFlags->bPause)
+ {
+ if (ConOutPrintfPaging(FALSE,_T("%-8s %-3s %*s %s %s\n"),
+ szName, /* The file's 8.3 name */
+ szExt, /* The file's 8.3 extension */
+ iSizeFormat, /* print format for size column */
+ szSize, /* The size of file or "<DIR>" for dirs */
+ szDate, /* The date of file/dir */
+ szTime) == 1) /* The time of file/dir */
+ {
+ return ;
+ }
+ }
+ else
+ ConOutPrintf(_T("%-8s %-3s %*s %s %s\n"),
+ szName, /* The file's 8.3 name */
+ szExt, /* The file's 8.3 extension */
+ iSizeFormat, /* print format for size column */
+ szSize, /* The size of file or "<DIR>" for dirs */
+ szDate, /* The date of file/dir */
+ szTime); /* The time of file/dir */
+ }
+}
+
+/*
+ * DirPrintBareList
+ *
+ * The function that prints in bare format
+ */
+static VOID
+DirPrintBareList(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */
+ DWORD dwCount, /* [IN] The number of files */
+ LPTSTR lpCurPath, /* [IN] Full path of current directory */
+ LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */
+{
+ TCHAR szFullName[MAX_PATH];
+ DWORD i;
+
+ for (i = 0; i < dwCount; i++)
+ {
+ if ((_tcscmp(ptrFiles[i]->cFileName, _T(".")) == 0) ||
+ (_tcscmp(ptrFiles[i]->cFileName, _T("..")) == 0))
+ {
+ /* at bare format we don't print "." and ".." folder */
+ continue;
+ }
+ if (lpFlags->bRecursive)
+ {
+ /* at recursive mode we print full path of file */
+ _tcscpy(szFullName, lpCurPath);
+ _tcscat(szFullName, ptrFiles[i]->cFileName);
+ if(lpFlags->bPause)
+ {
+ if (ConOutPrintfPaging(FALSE,_T("%s\n"), szFullName) == 1)
+ {
+ return ;
+ }
+ }
+ else
+ ConOutPrintf(_T("%s\n"), szFullName);
+ }
+ else
+ {
+ /* if we are not in recursive mode we print the file names */
+ if(lpFlags->bPause)
+ {
+ if (ConOutPrintfPaging(FALSE,_T("%s\n"),ptrFiles[i]->cFileName) == 1)
+ {
+ return ;
+ }
+ }
+ else
+ ConOutPrintf(_T("%s\n"),ptrFiles[i]->cFileName);
+ }
+ }
+}
+
+
+/*
+ * DirPrintFiles
+ *
+ * The functions that prints the files list
+ */
+static VOID
+DirPrintFiles(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */
+ DWORD dwCount, /* [IN] The quantity of files */
+ TCHAR *szCurPath, /* [IN] Full path of current directory */
+ LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags used */
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR szTemp[MAX_PATH]; /* A buffer to format the directory header */
+
+ /* Print directory header */
+ _tcscpy(szTemp, szCurPath);
+
+ /* We cut the trailing \ of the full path */
+ szTemp[_tcslen(szTemp)-1] = _T('\0');
+
+ /* Condition to print header:
+ We are not printing in bare format
+ and if we are in recursive mode... we must have results */
+ if (!(lpFlags->bBareFormat ) && !((lpFlags->bRecursive) && (dwCount <= 0)))
+ {
+ LoadString(CMD_ModuleHandle, STRING_DIR_HELP7, szMsg, RC_STRING_MAX_SIZE);
+ if(lpFlags->bPause)
+ {
+ if (ConOutPrintfPaging(FALSE,szMsg, szTemp) == 1)
+ {
+ return ;
+ }
+ }
+ else
+ ConOutPrintf(szMsg, szTemp);
+ }
+
+ if (lpFlags->bBareFormat)
+ {
+ /* Bare format */
+ DirPrintBareList(ptrFiles, dwCount, szCurPath, lpFlags);
+ }
+ else if(lpFlags->bShortName)
+ {
+ /* New list style / Short names */
+ DirPrintNewList(ptrFiles, dwCount, szCurPath, lpFlags);
+ }
+ else if(lpFlags->bWideListColSort || lpFlags->bWideList)
+ {
+ /* Wide list */
+ DirPrintWideList(ptrFiles, dwCount, szCurPath, lpFlags);
+ }
+ else if (lpFlags->bNewLongList )
+ {
+ /* New list style*/
+ DirPrintNewList(ptrFiles, dwCount, szCurPath, lpFlags);
+ }
+ else
+ {
+ /* If nothing is selected old list is the default */
+ DirPrintOldList(ptrFiles, dwCount, szCurPath, lpFlags);
+ }
+}
+
+
+
+/*
+ * CompareFiles
+ *
+ * Compares 2 files based on the order criteria
+ */
+static BOOL
+CompareFiles(LPWIN32_FIND_DATA lpFile1, /* [IN] A pointer to WIN32_FIND_DATA of file 1 */
+ LPWIN32_FIND_DATA lpFile2, /* [IN] A pointer to WIN32_FIND_DATA of file 2 */
+ LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags that we use to list */
+{
+ ULARGE_INTEGER u64File1;
+ ULARGE_INTEGER u64File2;
+ int i;
+ long iComp = 0; /* The comparison result */
+
+ /* Calculate critiries by order given from user */
+ for (i = 0;i < lpFlags->stOrderBy.sCriteriaCount;i++)
+ {
+
+ /* Calculate criteria */
+ switch(lpFlags->stOrderBy.eCriteria[i])
+ {
+ case ORDER_SIZE: /* Order by size /o:s */
+ /* concat the 32bit integers to a 64bit */
+ u64File1.LowPart = lpFile1->nFileSizeLow;
+ u64File1.HighPart = lpFile1->nFileSizeHigh;
+ u64File2.LowPart = lpFile2->nFileSizeLow;
+ u64File2.HighPart = lpFile2->nFileSizeHigh;
+
+ /* In case that differnce is too big for a long */
+ if (u64File1.QuadPart < u64File2.QuadPart)
+ iComp = -1;
+ else if (u64File1.QuadPart > u64File2.QuadPart)
+ iComp = 1;
+ else
+ iComp = 0;
+ break;
+
+ case ORDER_DIRECTORY: /* Order by directory attribute /o:g */
+ iComp = ((lpFile2->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)-
+ (lpFile1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY));
+ break;
+
+ case ORDER_EXTENSION: /* Order by extension name /o:e */
+ iComp = _tcsicmp(getExt(lpFile1->cFileName),getExt(lpFile2->cFileName));
+ break;
+
+ case ORDER_NAME: /* Order by filename /o:n */
+ iComp = _tcsicmp(lpFile1->cFileName, lpFile2->cFileName);
+ break;
+
+ case ORDER_TIME: /* Order by file's time /o:t */
+ /* We compare files based on the time field selected by /t */
+ switch(lpFlags->stTimeField.eTimeField)
+ {
+ case TF_CREATIONDATE:
+ /* concat the 32bit integers to a 64bit */
+ u64File1.LowPart = lpFile1->ftCreationTime.dwLowDateTime;
+ u64File1.HighPart = lpFile1->ftCreationTime.dwHighDateTime ;
+ u64File2.LowPart = lpFile2->ftCreationTime.dwLowDateTime;
+ u64File2.HighPart = lpFile2->ftCreationTime.dwHighDateTime ;
+ break;
+ case TF_LASTACCESSEDDATE :
+ /* concat the 32bit integers to a 64bit */
+ u64File1.LowPart = lpFile1->ftLastAccessTime.dwLowDateTime;
+ u64File1.HighPart = lpFile1->ftLastAccessTime.dwHighDateTime ;
+ u64File2.LowPart = lpFile2->ftLastAccessTime.dwLowDateTime;
+ u64File2.HighPart = lpFile2->ftLastAccessTime.dwHighDateTime ;
+ break;
+ case TF_MODIFIEDDATE:
+ /* concat the 32bit integers to a 64bit */
+ u64File1.LowPart = lpFile1->ftLastWriteTime.dwLowDateTime;
+ u64File1.HighPart = lpFile1->ftLastWriteTime.dwHighDateTime ;
+ u64File2.LowPart = lpFile2->ftLastWriteTime.dwLowDateTime;
+ u64File2.HighPart = lpFile2->ftLastWriteTime.dwHighDateTime ;
+ break;
+ }
+
+ /* In case that differnce is too big for a long */
+ if (u64File1.QuadPart < u64File2.QuadPart)
+ iComp = -1;
+ else if (u64File1.QuadPart > u64File2.QuadPart)
+ iComp = 1;
+ else
+ iComp = 0;
+ break;
+ }
+
+ /* Reverse if desired */
+ if (lpFlags->stOrderBy.bCriteriaRev[i])
+ iComp *= -1;
+
+ /* If that criteria was enough for distinguishing
+ the files/dirs,there is no need to calculate the others*/
+ if (iComp != 0) break;
+ }
+
+ /* Translate the value of iComp to boolean */
+ if (iComp > 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+/*
+ * QsortFiles
+ *
+ * Sort files by the order criterias using quicksort method
+ */
+static VOID
+QsortFiles(LPWIN32_FIND_DATA ptrArray[], /* [IN/OUT] The array with file info pointers */
+ int i, /* [IN] The index of first item in array */
+ int j, /* [IN] The index to last item in array */
+ LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags that we will use to sort */
+{
+ LPWIN32_FIND_DATA lpTemp; /* A temporary pointer */
+ int First, Last, Temp;
+ BOOL Way;
+
+ if (i < j)
+ {
+ First = i;
+ Last = j;
+ Way = TRUE;
+ while (i != j)
+ {
+ if (Way == CompareFiles(ptrArray[i], ptrArray[j], lpFlags))
+ {
+ /* Swap the pointers of the array */
+ lpTemp = ptrArray[i];
+ ptrArray[i]= ptrArray[j];
+ ptrArray[j] = lpTemp;
+
+ /* Swap the indexes for inverting sorting */
+ Temp = i;
+ i = j;
+ j =Temp;
+
+ Way = !Way;
+ }
+
+ j += (!Way - Way);
+ }
+
+ QsortFiles(ptrArray,First, i-1, lpFlags);
+ QsortFiles(ptrArray,i+1,Last, lpFlags);
+ }
+}
+
+
+
+/*
+ * DirList
+ *
+ * The functions that does everything except for printing results
+ */
+static INT
+DirList(LPTSTR szPath, /* [IN] The path that dir starts */
+ LPTSTR szFilespec, /* [IN] The type of file that we are looking for */
+ LPINT pLine, /* FIXME: Maybe used for paginating */
+ LPDIRSWITCHFLAGS lpFlags) /* [IN] The flags of the listing */
+{
+ HANDLE hSearch; /* The handle of the search */
+ HANDLE hRecSearch; /* The handle for searching recursivly */
+ WIN32_FIND_DATA wfdFileInfo; /* The info of file that found */
+ LPWIN32_FIND_DATA * ptrFileArray; /* An array of pointers with all the files */
+ PDIRFINDLISTNODE ptrStartNode; /* The pointer to the first node */
+ PDIRFINDLISTNODE ptrNextNode; /* A pointer used for relatives refernces */
+TCHAR szFullPath[MAX_PATH]; /* The full path that we are listing with trailing \ */
+TCHAR szFullFileSpec[MAX_PATH]; /* The full path with file specs that we ll request\ */
+DWORD dwCount; /* A counter of files found in directory */
+DWORD dwCountFiles; /* Counter for files */
+DWORD dwCountDirs; /* Counter for directories */
+ULARGE_INTEGER u64CountBytes; /* Counter for bytes */
+ULARGE_INTEGER u64Temp; /* A temporary counter */
+
+ /* Initialize Variables */
+ ptrStartNode = NULL;
+ ptrNextNode = NULL;
+ dwCount = 0;
+ dwCountFiles = 0;
+ dwCountDirs = 0;
+ u64CountBytes.QuadPart = 0;
+
+ /* Create szFullPath and szFullFileSpec */
+ _tcscpy (szFullPath, szPath);
+ if (szFullPath[_tcslen(szFullPath) - 1] != _T('\\'))
+ _tcscat (szFullPath, _T("\\"));
+ _tcscpy (szFullFileSpec, szFullPath);
+ _tcscat (szFullFileSpec, szFilespec);
+
+ /* Prepare the linked list, first node is allocated */
+ ptrStartNode = malloc(sizeof(DIRFINDLISTNODE));
+ if (ptrStartNode == NULL)
+ {
+#ifdef _DEBUG
+ ConErrPrintf(_T("DEBUG: Cannot allocate memory for ptrStartNode!\n"));
+#endif
+ return 1; /* Error cannot allocate memory for 1st object */
+ }
+ ptrNextNode = ptrStartNode;
+
+ /* Collect the results for the current folder */
+ hSearch = FindFirstFile(szFullFileSpec, &wfdFileInfo);
+ do
+ {
+ if (hSearch != INVALID_HANDLE_VALUE)
+ {
+ /* Here we filter all the specified attributes */
+ if ((wfdFileInfo.dwFileAttributes & lpFlags->stAttribs.dwAttribMask )
+ == (lpFlags->stAttribs.dwAttribMask & lpFlags->stAttribs.dwAttribVal ))
+ {
+ ptrNextNode->ptrNext = malloc(sizeof(DIRFINDLISTNODE));
+ if (ptrNextNode->ptrNext == NULL)
+ {
+#ifdef _DEBUG
+ ConErrPrintf(_T("DEBUG: Cannot allocate memory for ptrNextNode->ptrNext!\n"));
+#endif
+ while (ptrStartNode)
+ {
+ ptrNextNode = ptrStartNode->ptrNext;
+ free(ptrStartNode);
+ ptrStartNode = ptrNextNode;
+ dwCount --;
+ }
+ return 1;
+ }
+
+ /* If malloc fails we go to next file in hope it works,
+ without braking the linked list! */
+ if (ptrNextNode->ptrNext)
+ {
+ /* Copy the info of search at linked list */
+ memcpy(&ptrNextNode->ptrNext->stFindInfo,
+ &wfdFileInfo,
+ sizeof(WIN32_FIND_DATA));
+
+ /* If lower case is selected do it here */
+ if (lpFlags->bLowerCase)
+ {
+ _tcslwr(ptrNextNode->ptrNext->stFindInfo.cAlternateFileName);
+ _tcslwr(ptrNextNode->ptrNext->stFindInfo.cFileName);
+ }
+
+ /* Continue at next node at linked list */
+ ptrNextNode = ptrNextNode->ptrNext;
+ dwCount ++;
+
+ /* Grab statistics */
+ if (wfdFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+ /* Directory */
+ dwCountDirs++;
+ }
+ else
+ {
+ /* File */
+ dwCountFiles++;
+ u64Temp.HighPart = wfdFileInfo.nFileSizeHigh;
+ u64Temp.LowPart = wfdFileInfo.nFileSizeLow;
+ u64CountBytes.QuadPart += u64Temp.QuadPart;
+ }
+ }
+ }
+ }
+ }while(FindNextFile(hSearch, &wfdFileInfo));
+ FindClose(hSearch);
+
+ /* Terminate list */
+ ptrNextNode->ptrNext = NULL;
+
+ /* Calculate and allocate space need for making an array of pointers */
+ ptrFileArray = malloc(sizeof(LPWIN32_FIND_DATA) * dwCount);
+ if (ptrFileArray == NULL)
+ {
+#ifdef _DEBUG
+ ConErrPrintf(_T("DEBUG: Cannot allocate memory for ptrFileArray!\n"));
+#endif
+ while (ptrStartNode)
+ {
+ ptrNextNode = ptrStartNode->ptrNext;
+ free(ptrStartNode);
+ ptrStartNode = ptrNextNode;
+ dwCount --;
+ }
+ return 1;
+ }
+
+ /*
+ * Create an array of pointers from the linked list
+ * this will be used to sort and print data, rather than the list
+ */
+ ptrNextNode = ptrStartNode;
+ dwCount = 0;
+ while (ptrNextNode->ptrNext)
+ {
+ *(ptrFileArray + dwCount) = &ptrNextNode->ptrNext->stFindInfo;
+ ptrNextNode = ptrNextNode->ptrNext;
+ dwCount++;
+ }
+
+ /* Sort Data if requested*/
+ if (lpFlags->stOrderBy.sCriteriaCount > 0)
+ QsortFiles(ptrFileArray, 0, dwCount-1,lpFlags);
+
+ /* Print Data */
+ DirPrintFiles(ptrFileArray, dwCount, szFullPath, lpFlags);
+
+ /* Free array */
+ free(ptrFileArray);
+ if (CheckCtrlBreak(BREAK_INPUT))
+ return 1;
+
+
+ /* Add statistics to recursive statistics*/
+ recurse_dir_cnt += dwCountDirs;
+ recurse_file_cnt += dwCountFiles;
+ recurse_bytes.QuadPart += u64CountBytes.QuadPart;
+
+ /* Do the recursive job if requested
+ the recursive is be done on ALL(indepent of their attribs)
+ directoried of the current one.*/
+ if (lpFlags->bRecursive)
+ {
+ /* The new search is involving any *.* file */
+ _tcscpy(szFullFileSpec, szFullPath);
+ _tcscat(szFullFileSpec, _T("*.*"));
+ hRecSearch = FindFirstFile (szFullFileSpec, &wfdFileInfo);
+ do
+ {
+ if (hRecSearch != INVALID_HANDLE_VALUE)
+ {
+ /* We search for directories other than "." and ".." */
+ if ((_tcsicmp(wfdFileInfo.cFileName, _T(".")) != 0) &&
+ (_tcsicmp(wfdFileInfo.cFileName, _T("..")) != 0 ) &&
+ (wfdFileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ /* Concat the path and the directory to do recursive */
+ _tcscpy(szFullFileSpec, szFullPath);
+ _tcscat(szFullFileSpec, wfdFileInfo.cFileName);
+ /* We do the same for tha folder */
+ if (DirList(szFullFileSpec, szFilespec, pLine,lpFlags) != 0)
+ {
+ return 1;
+ }
+ }
+ }
+ }while(FindNextFile(hRecSearch,&wfdFileInfo));
+ FindClose(hRecSearch);
+ }
+
+ /* Free linked list */
+ while (ptrStartNode)
+ {
+ ptrNextNode = ptrStartNode->ptrNext;
+ free(ptrStartNode);
+ ptrStartNode = ptrNextNode;
+ dwCount --;
+ }
+
+ return 0;
+}
+
+
+
+/*
+ * dir
+ *
+ * internal dir command
+ */
+INT
+CommandDir(LPTSTR first, LPTSTR rest)
+{
+ TCHAR dircmd[256]; /* A variable to store the DIRCMD enviroment variable */
+ TCHAR cDrive;
+ TCHAR szPath[MAX_PATH];
+ TCHAR szFilespec[MAX_PATH];
+ LPTSTR* params;
+ INT entries = 0;
+ INT nLine = 0;
+ UINT loop = 0;
+ DIRSWITCHFLAGS stFlags;
+
+ /* Initialize variables */
+ cDrive = 0;
+ recurse_dir_cnt = 0L;
+ recurse_file_cnt = 0L;
+ recurse_bytes.QuadPart = 0;
+
+ /* Initialize Switch Flags < Default switches are setted here!> */
+ stFlags.b4Digit = TRUE;
+ stFlags.bBareFormat = FALSE;
+ stFlags.bLowerCase = FALSE;
+ stFlags.bNewLongList = TRUE;
+ stFlags.bPause = FALSE;
+ stFlags.bRecursive = FALSE;
+ stFlags.bShortName = FALSE;
+ stFlags.bTSeperator = TRUE;
+ stFlags.bUser = FALSE;
+ stFlags.bWideList = FALSE;
+ stFlags.bWideListColSort = FALSE;
+ stFlags.stTimeField.eTimeField = TF_MODIFIEDDATE;
+ stFlags.stTimeField.bUnSet = FALSE;
+ stFlags.stAttribs.dwAttribMask = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
+ stFlags.stAttribs.dwAttribVal = 0L;
+ stFlags.stAttribs.bUnSet = FALSE;
+ stFlags.stOrderBy.sCriteriaCount = 0;
+ stFlags.stOrderBy.bUnSet = FALSE;
+
+ nErrorLevel = 0;
+
+ /* read the parameters from the DIRCMD environment variable */
+ if (GetEnvironmentVariable (_T("DIRCMD"), dircmd, 256))
+ if (!DirReadParam(dircmd, ¶ms, &entries, &stFlags))
+ {
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ /* read the parameters */
+ if (!DirReadParam(rest, ¶ms, &entries, &stFlags) || CheckCtrlBreak(BREAK_INPUT))
+ {
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ /* default to current directory */
+ if(entries == 0) {
+ if(!add_entry(&entries, ¶ms, _T("."))) {
+ nErrorLevel = 1;
+ return 1;
+ }
+ }
+
+ for(loop = 0; loop < entries; loop++)
+ {
+ /* parse the directory info */
+ if (DirParsePathspec (params[loop], szPath, szFilespec) || CheckCtrlBreak(BREAK_INPUT))
+ {
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ /* <Debug :>
+ Uncomment this to show the final state of switch flags*/
+ #ifdef _DEBUG
+ {
+ int i;
+ ConOutPrintf(_T("Attributes mask/value %x/%x\n"),stFlags.stAttribs.dwAttribMask,stFlags.stAttribs.dwAttribVal );
+ ConOutPrintf(_T("(B) Bare format : %i\n"), stFlags.bBareFormat );
+ ConOutPrintf(_T("(C) Thousand : %i\n"), stFlags.bTSeperator );
+ ConOutPrintf(_T("(W) Wide list : %i\n"), stFlags.bWideList );
+ ConOutPrintf(_T("(D) Wide list sort by column : %i\n"), stFlags.bWideListColSort );
+ ConOutPrintf(_T("(L) Lowercase : %i\n"), stFlags.bLowerCase );
+ ConOutPrintf(_T("(N) New : %i\n"), stFlags.bNewLongList );
+ ConOutPrintf(_T("(O) Order : %i\n"), stFlags.stOrderBy.sCriteriaCount );
+ for (i =0;i<stFlags.stOrderBy.sCriteriaCount;i++)
+ ConOutPrintf(_T(" Order Criteria [%i]: %i (Reversed: %i)\n"),i, stFlags.stOrderBy.eCriteria[i], stFlags.stOrderBy.bCriteriaRev[i] );
+ ConOutPrintf(_T("(P) Pause : %i\n"), stFlags.bPause );
+ ConOutPrintf(_T("(Q) Owner : %i\n"), stFlags.bUser );
+ ConOutPrintf(_T("(S) Recursive : %i\n"), stFlags.bRecursive );
+ ConOutPrintf(_T("(T) Time field : %i\n"), stFlags.stTimeField.eTimeField );
+ ConOutPrintf(_T("(X) Short names : %i\n"), stFlags.bShortName );
+ ConOutPrintf(_T("Parameter : %s\n"), params[loop] );
+ }
+ #endif
+
+ /* Print the drive header if the drive changed */
+ if(cDrive != szPath[0] && !stFlags.bBareFormat) {
+ if (!PrintDirectoryHeader (szPath, &nLine, &stFlags)) {
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ cDrive = szPath[0];
+ }
+
+
+ /* do the actual dir */
+ if (DirList (szPath, szFilespec, &nLine, &stFlags))
+ {
+ nErrorLevel = 1;
+ return 1;
+ }
+ }
+
+ /* print the footer */
+ PrintSummary(szPath,
+ recurse_file_cnt,
+ recurse_dir_cnt,
+ recurse_bytes,
+ &nLine,
+ &stFlags);
+
+ return 0;
+}
+
+#endif
+
+/* EOF */
--- /dev/null
+/*
+ * DIRSTACK.C - pushd / pop (directory stack) internal commands.
+ *
+ *
+ * History:
+ *
+ * 14-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Implemented PUSHD and POPD command.
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection safe!
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added DIRS command.
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef FEATURE_DIRECTORY_STACK
+
+typedef struct tagDIRENTRY
+{
+ struct tagDIRENTRY *prev;
+ struct tagDIRENTRY *next;
+ LPTSTR pszPath;
+} DIRENTRY, *LPDIRENTRY;
+
+
+static INT nStackDepth;
+static LPDIRENTRY lpStackTop;
+static LPDIRENTRY lpStackBottom;
+
+
+static INT
+PushDirectory (LPTSTR pszPath)
+{
+ LPDIRENTRY lpDir;
+
+ nErrorLevel = 0;
+
+ lpDir = (LPDIRENTRY)malloc (sizeof (DIRENTRY));
+ if (!lpDir)
+ {
+ error_out_of_memory ();
+ return -1;
+ }
+
+ lpDir->prev = NULL;
+ if (lpStackTop == NULL)
+ {
+ lpDir->next = NULL;
+ lpStackBottom = lpDir;
+ }
+ else
+ {
+ lpDir->next = lpStackTop;
+ lpStackTop->prev = lpDir;
+ }
+ lpStackTop = lpDir;
+
+ lpDir->pszPath = (LPTSTR)malloc ((_tcslen(pszPath)+1)*sizeof(TCHAR));
+ if (!lpDir->pszPath)
+ {
+ free (lpDir);
+ error_out_of_memory ();
+ return -1;
+ }
+
+ _tcscpy (lpDir->pszPath, pszPath);
+
+ nStackDepth++;
+
+ return 0;
+}
+
+
+static VOID
+PopDirectory (VOID)
+{
+ LPDIRENTRY lpDir;
+
+ nErrorLevel = 0;
+
+ if (nStackDepth == 0)
+ return;
+
+ lpDir = lpStackTop;
+ lpStackTop = lpDir->next;
+ if (lpStackTop != NULL)
+ lpStackTop->prev = NULL;
+ else
+ lpStackBottom = NULL;
+
+ free (lpDir->pszPath);
+ free (lpDir);
+
+ nStackDepth--;
+}
+
+
+static VOID
+GetDirectoryStackTop (LPTSTR pszPath)
+{
+ nErrorLevel = 0;
+
+ if (lpStackTop)
+ _tcsncpy (pszPath, lpStackTop->pszPath, MAX_PATH);
+ else
+ *pszPath = _T('\0');
+}
+
+
+/*
+ * initialize directory stack
+ */
+VOID InitDirectoryStack (VOID)
+{
+ nStackDepth = 0;
+ lpStackTop = NULL;
+ lpStackBottom = NULL;
+}
+
+
+/*
+ * destroy directory stack
+ */
+VOID DestroyDirectoryStack (VOID)
+{
+ while (nStackDepth)
+ PopDirectory ();
+}
+
+
+INT GetDirectoryStackDepth (VOID)
+{
+ return nStackDepth;
+}
+
+
+/*
+ * pushd command
+ */
+INT CommandPushd (LPTSTR first, LPTSTR rest)
+{
+ TCHAR curPath[MAX_PATH];
+ TCHAR newPath[MAX_PATH];
+ BOOL bChangePath = FALSE;
+
+ if (!_tcsncmp (rest, _T("/?"), 2))
+ {
+ ConOutResPuts(STRING_DIRSTACK_HELP1);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ if (rest[0] != _T('\0'))
+ {
+ GetFullPathName (rest, MAX_PATH, newPath, NULL);
+ bChangePath = IsValidPathName (newPath);
+ }
+
+ GetCurrentDirectory (MAX_PATH, curPath);
+ if (PushDirectory (curPath))
+ return 0;
+
+ if (bChangePath)
+ SetCurrentDirectory (newPath);
+
+ return 0;
+}
+
+
+/*
+ * popd command
+ */
+INT CommandPopd (LPTSTR first, LPTSTR rest)
+{
+ TCHAR szPath[MAX_PATH];
+
+ if (!_tcsncmp(rest, _T("/?"), 2))
+ {
+ ConOutResPuts(STRING_DIRSTACK_HELP2);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ if (GetDirectoryStackDepth () == 0)
+ return 0;
+
+ GetDirectoryStackTop (szPath);
+ PopDirectory ();
+
+ SetCurrentDirectory (szPath);
+
+ return 0;
+}
+
+
+/*
+ * dirs command
+ */
+INT CommandDirs (LPTSTR first, LPTSTR rest)
+{
+ LPDIRENTRY lpDir;
+
+ if (!_tcsncmp(rest, _T("/?"), 2))
+ {
+ ConOutResPuts(STRING_DIRSTACK_HELP3);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ lpDir = lpStackBottom;
+
+ if (lpDir == NULL)
+ {
+ ConOutResPuts(STRING_DIRSTACK_HELP4);
+ return 0;
+ }
+
+ while (lpDir != NULL)
+ {
+ ConOutPuts (lpDir->pszPath);
+
+ lpDir = lpDir->prev;
+ }
+
+ return 0;
+}
+
+#endif /* FEATURE_DIRECTORY_STACK */
--- /dev/null
+/*
+ * ECHO.C - internal echo commands.
+ *
+ *
+ * History:
+ *
+ * 16 Jul 1998 (Hans B Pufal)
+ * Started.
+ *
+ * 16 Jul 1998 (John P Price)
+ * Separated commands into individual files.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * Added config.h include
+ *
+ * 08-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("/?").
+ *
+ * 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection ready!
+ *
+ * 13-Jul-2000 (Eric Kohl <ekohl@rz-online.de>)
+ * Implemented 'echo.' and 'echoerr.'.
+ *
+ * 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+INT CommandEcho (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ LPTSTR p1, p2;
+
+#ifdef _DEBUG
+ DebugPrintf (_T("CommandEcho '%s' : '%s'\n"), cmd, param);
+#endif
+
+ if (_tcsicmp (cmd, _T("echo.")) == 0)
+ {
+ if (param[0] == 0)
+ ConOutChar (_T('\n'));
+ else
+ ConOutPuts (param);
+ }
+ else
+ {
+ /* skip the first delimiter */
+ if (_istspace(*param))
+ param++;
+
+ /* skip all spaces for the check of '/?', 'ON' and 'OFF' */
+ p1 = param;
+ while(_istspace(*p1))
+ p1++;
+
+ if (!_tcsncmp (p1, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_ECHO_HELP4);
+ return 0;
+ }
+
+ if (_tcsnicmp (p1, D_OFF, sizeof(D_OFF)/sizeof(TCHAR) - 1) == 0)
+ {
+ p2 = p1 + sizeof(D_OFF)/sizeof(TCHAR) - 1;
+ while (_istspace(*p2))
+ p2++;
+ if (*p2 == _T('\0'))
+ {
+ bEcho = FALSE;
+ return 0;
+ }
+ }
+ else if (_tcsnicmp (p1, D_ON, sizeof(D_ON)/sizeof(TCHAR) - 1) == 0)
+ {
+ p2 = p1 + sizeof(D_ON)/sizeof(TCHAR) - 1;
+ while (_istspace(*p2))
+ p2++;
+ if (*p2 == _T('\0'))
+ {
+ bEcho = TRUE;
+ return 0;
+ }
+ }
+ if (*p1 != _T('\0'))
+ {
+ p1 = param;
+ while (NULL != (p1 = _tcschr(p1, _T('^'))))
+ {
+ memmove(p1, p1 + 1, (_tcslen(p1 + 1) + 1) * sizeof(TCHAR));
+ if (*p1)
+ {
+ //skip past the char being escaped
+ p1++;
+ }
+ }
+ ConOutPuts (param);
+ }
+ else
+ {
+ LoadString(CMD_ModuleHandle, STRING_ECHO_HELP5, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, bEcho ? D_ON : D_OFF);
+ }
+ }
+
+ return 0;
+}
+
+
+INT CommandEchos (LPTSTR cmd, LPTSTR param)
+{
+
+#ifdef _DEBUG
+ DebugPrintf (_T("CommandEchos '%s' : '%s'\n"), cmd, param);
+#endif
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPuts(STRING_ECHO_HELP1);
+ return 0;
+ }
+
+ if (*param)
+ ConOutPrintf (_T("%s"), param);
+
+ return 0;
+}
+
+
+INT CommandEchoerr (LPTSTR cmd, LPTSTR param)
+{
+
+#ifdef _DEBUG
+ DebugPrintf (_T("CommandEchoerr '%s' : '%s'\n"), cmd, param);
+#endif
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPuts(STRING_ECHO_HELP2);
+ return 0;
+ }
+
+ if (_tcsicmp (cmd, _T("echoerr.")) == 0)
+ {
+ if (param[0] == 0)
+ ConErrChar (_T('\n'));
+ else
+ ConErrPuts (param);
+ }
+ else if (*param)
+ {
+ ConErrPuts (param);
+ }
+
+ return 0;
+}
+
+
+INT CommandEchoserr (LPTSTR cmd, LPTSTR param)
+{
+
+#ifdef _DEBUG
+ DebugPrintf (_T("CommandEchoserr '%s' : '%s'\n"), cmd, param);
+#endif
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPuts(STRING_ECHO_HELP3);
+ return 0;
+ }
+
+ if (*param)
+ ConOutPrintf (_T("%s"), param);
+
+ return 0;
+}
+
+/* EOF */
--- /dev/null
+/*
+ * ERROR.C - error reporting functions.
+ *
+ *
+ * History:
+ *
+ * 07/12/98 (Rob Lake)
+ * started
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 24-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Redirection safe!
+ *
+ * 02-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Use FormatMessage() for error reports.
+ *
+ * 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+VOID ErrorMessage (DWORD dwErrorCode, LPTSTR szFormat, ...)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR szMessage[1024];
+ LPTSTR szError;
+ va_list arg_ptr;
+
+ if (dwErrorCode == ERROR_SUCCESS)
+ return;
+
+ nErrorLevel = 1;
+
+ if (szFormat)
+ {
+ va_start (arg_ptr, szFormat);
+ _vstprintf (szMessage, szFormat, arg_ptr);
+ va_end (arg_ptr);
+ }
+
+ if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
+ NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR)&szError, 0, NULL))
+ {
+ ConErrPrintf (_T("%s %s\n"), szError, szMessage);
+ if(szError)
+ LocalFree (szError);
+ return;
+ }
+
+ /* Fall back just in case the error is not defined */
+ if (szFormat)
+ ConErrPrintf (_T("%s -- %s\n"), szMsg, szMessage);
+ else
+ ConErrPrintf (_T("%s\n"), szMsg);
+}
+
+VOID error_parameter_format(TCHAR ch)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+ LoadString(CMD_ModuleHandle, STRING_ERROR_PARAMETERF_ERROR, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, ch);
+ nErrorLevel = 1;
+}
+
+
+VOID error_invalid_switch (TCHAR ch)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+ LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_SWITCH, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, ch);
+ nErrorLevel = 1;
+}
+
+
+VOID error_too_many_parameters (LPTSTR s)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+ LoadString(CMD_ModuleHandle, STRING_ERROR_TOO_MANY_PARAMETERS, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, s);
+ nErrorLevel = 1;
+}
+
+
+VOID error_path_not_found (VOID)
+{
+ ConErrResPuts(STRING_ERROR_PATH_NOT_FOUND);
+ nErrorLevel = 1;
+}
+
+
+VOID error_file_not_found (VOID)
+{
+ ConErrResPuts(STRING_ERROR_FILE_NOT_FOUND);
+ nErrorLevel = 1;
+}
+
+
+VOID error_sfile_not_found (LPTSTR f)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+ LoadString(CMD_ModuleHandle, STRING_ERROR_FILE_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(_T("%s - %s\n"), szMsg, f);
+ nErrorLevel = 1;
+}
+
+
+VOID error_req_param_missing (VOID)
+{
+ ConErrResPuts(STRING_ERROR_REQ_PARAM_MISSING);
+ nErrorLevel = 1;
+}
+
+
+VOID error_invalid_drive (VOID)
+{
+ ConErrResPuts(STRING_ERROR_INVALID_DRIVE);
+ nErrorLevel = 1;
+}
+
+
+VOID error_bad_command (VOID)
+{
+ ConErrResPuts(STRING_ERROR_BADCOMMAND);
+ nErrorLevel = 9009;
+}
+
+
+VOID error_no_pipe (VOID)
+{
+ ConErrResPuts(STRING_ERROR_CANNOTPIPE);
+ nErrorLevel = 1;
+}
+
+
+VOID error_out_of_memory (VOID)
+{
+ ConErrResPuts(STRING_ERROR_OUT_OF_MEMORY);
+ nErrorLevel = 1;
+}
+
+
+VOID error_invalid_parameter_format (LPTSTR s)
+{
+ ConErrResPuts(STRING_ERROR_INVALID_PARAM_FORMAT);
+ nErrorLevel = 1;
+}
+
+
+VOID error_syntax (LPTSTR s)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+ LoadString(CMD_ModuleHandle, STRING_ERROR_ERROR2, szMsg, RC_STRING_MAX_SIZE);
+
+ if (s)
+ ConErrPrintf(_T("%s - %s\n"), szMsg, s);
+ else
+ ConErrPrintf(_T("%s.\n"), szMsg);
+
+ nErrorLevel = 1;
+}
+
+
+VOID msg_pause (VOID)
+{
+ ConOutResPuts(STRING_ERROR_D_PAUSEMSG);
+}
+
+/* EOF */
--- /dev/null
+/*
+ * FILECOMP.C - handles filename completion.
+ *
+ *
+ * Comments:
+ *
+ * 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * moved from command.c file
+ * made second TAB display list of filename matches
+ * made filename be lower case if last character typed is lower case
+ *
+ * 25-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Cleanup. Unicode safe!
+ *
+ * 30-Apr-2004 (Filip Navara <xnavara@volny.cz>)
+ * Make the file listing readable when there is a lot of long names.
+ *
+
+ * 05-Jul-2004 (Jens Collin <jens.collin@lakhei.com>)
+ * Now expands lfn even when trailing " is omitted.
+ */
+
+#include <precomp.h>
+#include "cmd.h"
+
+#ifdef FEATURE_UNIX_FILENAME_COMPLETION
+
+VOID CompleteFilename (LPTSTR str, UINT charcount)
+{
+ WIN32_FIND_DATA file;
+ HANDLE hFile;
+ INT curplace = 0;
+ INT start;
+ INT count;
+ INT step;
+ INT c = 0;
+ BOOL found_dot = FALSE;
+ BOOL perfectmatch = TRUE;
+ TCHAR path[MAX_PATH];
+ TCHAR fname[MAX_PATH];
+ TCHAR maxmatch[MAX_PATH] = _T("");
+ TCHAR directory[MAX_PATH];
+ LPCOMMAND cmds_ptr;
+
+ /* expand current file name */
+ count = charcount - 1;
+ if (count < 0)
+ count = 0;
+
+ /* find how many '"'s there is typed already.*/
+ step = count;
+ while (step > 0)
+ {
+ if (str[step] == _T('"'))
+ c++;
+ step--;
+ }
+ /* if c is odd, then user typed " before name, else not.*/
+
+ /* find front of word */
+ if (str[count] == _T('"') || (c % 2))
+ {
+ count--;
+ while (count > 0 && str[count] != _T('"'))
+ count--;
+ }
+ else
+ {
+ while (count > 0 && str[count] != _T(' '))
+ count--;
+ }
+
+ /* if not at beginning, go forward 1 */
+ if (str[count] == _T(' '))
+ count++;
+
+ start = count;
+
+ if (str[count] == _T('"'))
+ count++; /* don't increment start */
+
+ /* extract directory from word */
+ _tcscpy (directory, &str[count]);
+ curplace = _tcslen (directory) - 1;
+
+ if (curplace >= 0 && directory[curplace] == _T('"'))
+ directory[curplace--] = _T('\0');
+
+ _tcscpy (path, directory);
+
+ while (curplace >= 0 && directory[curplace] != _T('\\') &&
+ directory[curplace] != _T(':'))
+ {
+ directory[curplace] = 0;
+ curplace--;
+ }
+
+ /* look for a '.' in the filename */
+ for (count = _tcslen (directory); path[count] != _T('\0'); count++)
+ {
+ if (path[count] == _T('.'))
+ {
+ found_dot = TRUE;
+ break;
+ }
+ }
+
+ if (found_dot)
+ _tcscat (path, _T("*"));
+ else
+ _tcscat (path, _T("*.*"));
+
+ /* current fname */
+ curplace = 0;
+
+ hFile = FindFirstFile (path, &file);
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ /* find anything */
+ do
+ {
+ /* ignore "." and ".." */
+ if (!_tcscmp (file.cFileName, _T(".")) ||
+ !_tcscmp (file.cFileName, _T("..")))
+ continue;
+
+ _tcscpy (fname, file.cFileName);
+
+ if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ _tcscat (fname, _T("\\"));
+
+ if (!maxmatch[0] && perfectmatch)
+ {
+ _tcscpy(maxmatch, fname);
+ }
+ else
+ {
+ for (count = 0; maxmatch[count] && fname[count]; count++)
+ {
+ if (tolower(maxmatch[count]) != tolower(fname[count]))
+ {
+ perfectmatch = FALSE;
+ maxmatch[count] = 0;
+ break;
+ }
+ }
+
+ if (maxmatch[count] == _T('\0') &&
+ fname[count] != _T('\0'))
+ perfectmatch = FALSE;
+ }
+ }
+ while (FindNextFile (hFile, &file));
+
+ FindClose (hFile);
+
+ /* only quote if the filename contains spaces */
+ if (_tcschr(directory, _T(' ')) ||
+ _tcschr(maxmatch, _T(' ')))
+ {
+ str[start] = _T('\"');
+ _tcscpy (&str[start+1], directory);
+ _tcscat (&str[start], maxmatch);
+ _tcscat (&str[start], _T("\"") );
+ }
+ else
+ {
+ _tcscpy (&str[start], directory);
+ _tcscat (&str[start], maxmatch);
+ }
+
+ if(!perfectmatch)
+ {
+ MessageBeep (-1);
+ }
+ }
+ else
+ {
+ /* no match found - search for internal command */
+ for (cmds_ptr = cmds; cmds_ptr->name; cmds_ptr++)
+ {
+ if (!_tcsnicmp (&str[start], cmds_ptr->name,
+ _tcslen (&str[start])))
+ {
+ /* return the mach only if it is unique */
+ if (_tcsnicmp (&str[start], (cmds_ptr+1)->name, _tcslen (&str[start])))
+ _tcscpy (&str[start], cmds_ptr->name);
+ break;
+ }
+ }
+
+ MessageBeep (-1);
+ }
+}
+
+
+/*
+ * returns 1 if at least one match, else returns 0
+ */
+
+BOOL ShowCompletionMatches (LPTSTR str, INT charcount)
+{
+ WIN32_FIND_DATA file;
+ HANDLE hFile;
+ BOOL found_dot = FALSE;
+ INT curplace = 0;
+ INT start;
+ UINT count;
+ TCHAR path[MAX_PATH];
+ TCHAR fname[MAX_PATH];
+ TCHAR directory[MAX_PATH];
+ UINT longestfname = 0;
+ SHORT screenwidth;
+
+ /* expand current file name */
+ count = charcount - 1;
+ if (count < 0)
+ count = 0;
+
+ /* find front of word */
+ if (str[count] == _T('"'))
+ {
+ count--;
+ while (count > 0 && str[count] != _T('"'))
+ count--;
+ }
+ else
+ {
+ while (count > 0 && str[count] != _T(' '))
+ count--;
+ }
+
+ /* if not at beginning, go forward 1 */
+ if (str[count] == _T(' '))
+ count++;
+
+ start = count;
+
+ if (str[count] == _T('"'))
+ count++; /* don't increment start */
+
+ /* extract directory from word */
+ _tcscpy (directory, &str[count]);
+ curplace = _tcslen (directory) - 1;
+
+ if (curplace >= 0 && directory[curplace] == _T('"'))
+ directory[curplace--] = _T('\0');
+
+ _tcscpy (path, directory);
+
+ while (curplace >= 0 &&
+ directory[curplace] != _T('\\') &&
+ directory[curplace] != _T(':'))
+ {
+ directory[curplace] = 0;
+ curplace--;
+ }
+
+ /* look for a . in the filename */
+ for (count = _tcslen (directory); path[count] != _T('\0'); count++)
+ {
+ if (path[count] == _T('.'))
+ {
+ found_dot = TRUE;
+ break;
+ }
+ }
+
+ if (found_dot)
+ _tcscat (path, _T("*"));
+ else
+ _tcscat (path, _T("*.*"));
+
+ /* current fname */
+ curplace = 0;
+
+ hFile = FindFirstFile (path, &file);
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ /* Get the size of longest filename first. */
+ do
+ {
+ if (_tcslen(file.cFileName) > longestfname)
+ {
+ longestfname = _tcslen(file.cFileName);
+ /* Directories get extra brackets around them. */
+ if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ longestfname += 2;
+ }
+ }
+ while (FindNextFile (hFile, &file));
+ FindClose (hFile);
+
+ hFile = FindFirstFile (path, &file);
+
+ /* Count the highest number of columns */
+ GetScreenSize(&screenwidth, 0);
+
+ /* For counting columns of output */
+ count = 0;
+
+ /* Increase by the number of spaces behind file name */
+ longestfname += 3;
+
+ /* find anything */
+ ConOutChar (_T('\n'));
+ do
+ {
+ /* ignore . and .. */
+ if (!_tcscmp (file.cFileName, _T(".")) ||
+ !_tcscmp (file.cFileName, _T("..")))
+ continue;
+
+ if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ _stprintf (fname, _T("[%s]"), file.cFileName);
+ else
+ _tcscpy (fname, file.cFileName);
+
+ ConOutPrintf (_T("%*s"), - longestfname, fname);
+ count++;
+ /* output as much columns as fits on the screen */
+ if (count >= (screenwidth / longestfname))
+ {
+ /* print the new line only if we aren't on the
+ * last column, in this case it wraps anyway */
+ if (count * longestfname != (UINT)screenwidth)
+ ConOutPrintf (_T("\n"));
+ count = 0;
+ }
+ }
+ while (FindNextFile (hFile, &file));
+
+ FindClose (hFile);
+
+ if (count)
+ ConOutChar (_T('\n'));
+ }
+ else
+ {
+ /* no match found */
+ MessageBeep (-1);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+#endif
+
+#ifdef FEATURE_4NT_FILENAME_COMPLETION
+
+typedef struct _FileName
+{
+ TCHAR Name[MAX_PATH];
+} FileName;
+
+VOID FindPrefixAndSuffix(LPTSTR strIN, LPTSTR szPrefix, LPTSTR szSuffix)
+{
+ /* String that is to be examined */
+ TCHAR str[MAX_PATH];
+ /* temp pointers to used to find needed parts */
+ TCHAR * szSearch;
+ TCHAR * szSearch1;
+ TCHAR * szSearch2;
+ /* number of quotes in the string */
+ INT nQuotes = 0;
+ /* used in for loops */
+ UINT i;
+ /* Char number to break the string at */
+ INT PBreak = 0;
+ INT SBreak = 0;
+ /* when phrasing a string, this tells weather
+ you are inside quotes ot not. */
+ BOOL bInside = FALSE;
+
+ szPrefix[0] = _T('\0');
+ szSuffix[0] = _T('\0');
+
+ /* Copy over the string to later be edited */
+ _tcscpy(str,strIN);
+
+ /* Count number of " */
+ for(i = 0; i < _tcslen(str); i++)
+ if(str[i] == _T('\"'))
+ nQuotes++;
+
+ /* Find the prefix and suffix */
+ if(nQuotes % 2 && nQuotes >= 1)
+ {
+ /* Odd number of quotes. Just start from the last " */
+ /* THis is the way MS does it, and is an easy way out */
+ szSearch = _tcsrchr(str, _T('\"'));
+ /* Move to the next char past the " */
+ szSearch++;
+ _tcscpy(szSuffix,szSearch);
+ /* Find the one closest to end */
+ szSearch1 = _tcsrchr(str, _T('\"'));
+ szSearch2 = _tcsrchr(str, _T('\\'));
+ if(szSearch2 != NULL && _tcslen(szSearch1) > _tcslen(szSearch2))
+ szSearch = szSearch2;
+ else
+ szSearch = szSearch1;
+ /* Move one char past */
+ szSearch++;
+ szSearch[0] = _T('\0');
+ _tcscpy(szPrefix,str);
+ return;
+
+ }
+
+ if(!_tcschr(str, _T(' ')))
+ {
+ /* No spaces, everything goes to Suffix */
+ _tcscpy(szSuffix,str);
+ /* look for a slash just in case */
+ szSearch = _tcsrchr(str, _T('\\'));
+ if(szSearch)
+ {
+ szSearch++;
+ szSearch[0] = _T('\0');
+ _tcscpy(szPrefix,str);
+ }
+ else
+ {
+ szPrefix[0] = _T('\0');
+ }
+ return;
+ }
+
+ if(!nQuotes)
+ {
+ /* No quotes, and there is a space*/
+ /* Take it after the last space */
+ szSearch = _tcsrchr(str, _T(' '));
+ szSearch++;
+ _tcscpy(szSuffix,szSearch);
+ /* Find the closest to the end space or \ */
+ _tcscpy(str,strIN);
+ szSearch1 = _tcsrchr(str, _T(' '));
+ szSearch2 = _tcsrchr(str, _T('\\'));
+ if(szSearch2 != NULL && _tcslen(szSearch1) > _tcslen(szSearch2))
+ szSearch = szSearch2;
+ else
+ szSearch = szSearch1;
+ szSearch++;
+ szSearch[0] = _T('\0');
+ _tcscpy(szPrefix,str);
+ return;
+ }
+
+ /* All else fails and there is a lot of quotes, spaces and |
+ Then we search through and find the last space or \ that is
+ not inside a quotes */
+ for(i = 0; i < _tcslen(str); i++)
+ {
+ if(str[i] == _T('\"'))
+ bInside = !bInside;
+ if(str[i] == _T(' ') && !bInside)
+ SBreak = i;
+ if((str[i] == _T(' ') || str[i] == _T('\\')) && !bInside)
+ PBreak = i;
+
+ }
+ SBreak++;
+ PBreak++;
+ _tcscpy(szSuffix,&strIN[SBreak]);
+ strIN[PBreak] = _T('\0');
+ _tcscpy(szPrefix,strIN);
+ if(szPrefix[_tcslen(szPrefix) - 2] == _T('\"'))
+ {
+ /* need to remove the " right before a \ at the end to
+ allow the next stuff to stay inside one set of quotes
+ otherwise you would have multiple sets of quotes*/
+ _tcscpy(&szPrefix[_tcslen(szPrefix) - 2],_T("\\"));
+
+ }
+
+}
+ int __cdecl compare(const void *arg1,const void *arg2)
+ {
+ FileName * File1;
+ FileName * File2;
+ INT ret;
+
+ File1 = malloc(sizeof(FileName));
+ File2 = malloc(sizeof(FileName));
+ if(!File1 || !File2)
+ return 0;
+
+ memcpy(File1,arg1,sizeof(FileName));
+ memcpy(File2,arg2,sizeof(FileName));
+
+ /* ret = _tcsicmp(File1->Name, File2->Name); */
+ ret = lstrcmpi(File1->Name, File2->Name);
+
+ free(File1);
+ free(File2);
+ return ret;
+ }
+
+VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor)
+{
+ /* Length of string before we complete it */
+ INT StartLength;
+ /* Length of string after completed */
+ INT EndLength;
+ /* The number of chars added too it */
+ static INT DiffLength = 0;
+ /* Used to find and assemble the string that is returned */
+ TCHAR szBaseWord[MAX_PATH];
+ TCHAR szPrefix[MAX_PATH];
+ TCHAR szOrginal[MAX_PATH];
+ TCHAR szSearchPath[MAX_PATH];
+ /* Save the strings used last time, so if they hit tab again */
+ static TCHAR LastReturned[MAX_PATH];
+ static TCHAR LastSearch[MAX_PATH];
+ static TCHAR LastPrefix[MAX_PATH];
+ /* Used to search for files */
+ HANDLE hFile;
+ WIN32_FIND_DATA file;
+ /* List of all the files */
+ FileName * FileList = NULL;
+ /* Number of files */
+ INT FileListSize = 0;
+ /* Used for loops */
+ UINT i;
+ /* Editable string of what was passed in */
+ TCHAR str[MAX_PATH];
+ /* Keeps track of what element was last selected */
+ static INT Sel;
+ BOOL NeededQuote = FALSE;
+ BOOL ShowAll = TRUE;
+ TCHAR * line = strIN;
+
+ strOut[0] = _T('\0');
+
+ while (_istspace (*line))
+ line++;
+ if(!_tcsnicmp (line, _T("rd "), 3) || !_tcsnicmp (line, _T("cd "), 3))
+ ShowAll = FALSE;
+
+ /* Copy the string, str can be edited and orginal should not be */
+ _tcscpy(str,strIN);
+ _tcscpy(szOrginal,strIN);
+
+ /* Look to see if the cusor is not at the end of the string */
+ if((cusor + 1) < _tcslen(str))
+ str[cusor] = _T('\0');
+
+ /* Look to see if they hit tab again, if so cut off the diff length */
+ if(_tcscmp(str,LastReturned) || !_tcslen(str))
+ {
+ /* We need to know how many chars we added from the start */
+ StartLength = _tcslen(str);
+
+ /* no string, we need all files in that directory */
+ if(!StartLength)
+ {
+ _tcscat(str,_T("*"));
+ }
+
+ /* Zero it out first */
+ szBaseWord[0] = _T('\0');
+ szPrefix[0] = _T('\0');
+
+ /*What comes out of this needs to be:
+ szBaseWord = path no quotes to the object
+ szPrefix = what leads up to the filename
+ no quote at the END of the full name */
+ FindPrefixAndSuffix(str,szPrefix,szBaseWord);
+ /* Strip quotes */
+ for(i = 0; i < _tcslen(szBaseWord); )
+ {
+ if(szBaseWord[i] == _T('\"'))
+ memmove(&szBaseWord[i],&szBaseWord[i + 1], _tcslen(&szBaseWord[i]) * sizeof(TCHAR));
+ else
+ i++;
+ }
+
+ /* clear it out */
+ memset(szSearchPath, 0, sizeof(szSearchPath));
+
+ /* Start the search for all the files */
+ GetFullPathName(szBaseWord, MAX_PATH, szSearchPath, NULL);
+ if(StartLength > 0)
+ {
+ _tcscat(szSearchPath,_T("*"));
+ }
+ _tcscpy(LastSearch,szSearchPath);
+ _tcscpy(LastPrefix,szPrefix);
+ }
+ else
+ {
+ _tcscpy(szSearchPath, LastSearch);
+ _tcscpy(szPrefix, LastPrefix);
+ StartLength = 0;
+ }
+ /* search for the files it might be */
+ hFile = FindFirstFile (szSearchPath, &file);
+
+ /* aseemble a list of all files names */
+ do
+ {
+ if(hFile == INVALID_HANDLE_VALUE)
+ {
+ /* Assemble the orginal string and return */
+ _tcscpy(strOut,szOrginal);
+ CloseHandle(hFile);
+ if(FileList != NULL)
+ free(FileList);
+ return;
+ }
+
+ if(!_tcscmp (file.cFileName, _T(".")) ||
+ !_tcscmp (file.cFileName, _T("..")))
+ continue;
+
+ /* Don't show files when they are doing 'cd' or 'rd' */
+ if(!ShowAll &&
+ file.dwFileAttributes != 0xFFFFFFFF &&
+ !(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ continue;
+ }
+
+ /* Add the file to the list of files */
+ if(FileList == NULL)
+ {
+ FileListSize = 1;
+ FileList = malloc(FileListSize * sizeof(FileName));
+ }
+ else
+ {
+ FileListSize++;
+ FileList = realloc(FileList, FileListSize * sizeof(FileName));
+ }
+
+ if(FileList == NULL)
+ {
+ /* Assemble the orginal string and return */
+ _tcscpy(strOut,szOrginal);
+ CloseHandle(hFile);
+ ConOutFormatMessage (GetLastError());
+ return;
+ }
+ /* Copies the file name into the struct */
+ _tcscpy(FileList[FileListSize-1].Name,file.cFileName);
+
+ }while(FindNextFile(hFile,&file));
+
+ /* Check the size of the list to see if we
+ found any matches */
+ if(FileListSize == 0)
+ {
+ _tcscpy(strOut,szOrginal);
+ CloseHandle(hFile);
+ if(FileList != NULL)
+ free(FileList);
+ return;
+
+ }
+ /* Sort the files */
+ qsort(FileList,FileListSize,sizeof(FileName), compare);
+
+ /* Find the next/previous */
+ if(!_tcscmp(szOrginal,LastReturned))
+ {
+ if(bNext)
+ {
+ if(FileListSize - 1 == Sel)
+ Sel = 0;
+ else
+ Sel++;
+ }
+ else
+ {
+ if(!Sel)
+ Sel = FileListSize - 1;
+ else
+ Sel--;
+ }
+ }
+ else
+ {
+ Sel = 0;
+ }
+
+ /* nothing found that matched last time
+ so return the first thing in the list */
+ strOut[0] = _T('\0');
+
+ /* space in the name */
+ if(_tcschr(FileList[Sel].Name, _T(' ')))
+ {
+ INT LastSpace;
+ BOOL bInside;
+ /* It needs a " at the end */
+ NeededQuote = TRUE;
+ LastSpace = -1;
+ bInside = FALSE;
+ /* Find the place to put the " at the start */
+ for(i = 0; i < _tcslen(szPrefix); i++)
+ {
+ if(szPrefix[i] == _T('\"'))
+ bInside = !bInside;
+ if(szPrefix[i] == _T(' ') && !bInside)
+ LastSpace = i;
+
+ }
+ /* insert the quoation and move things around */
+ if(szPrefix[LastSpace + 1] != _T('\"') && LastSpace != -1)
+ {
+ memmove ( &szPrefix[LastSpace+1], &szPrefix[LastSpace], (_tcslen(szPrefix)-LastSpace+1) * sizeof(TCHAR) );
+
+ if((UINT)(LastSpace + 1) == _tcslen(szPrefix))
+ {
+ _tcscat(szPrefix,_T("\""));
+ }
+ szPrefix[LastSpace + 1] = _T('\"');
+ }
+ else if(LastSpace == -1)
+ {
+ _tcscpy(szBaseWord,_T("\""));
+ _tcscat(szBaseWord,szPrefix);
+ _tcscpy(szPrefix,szBaseWord);
+
+ }
+ }
+
+ _tcscpy(strOut,szPrefix);
+ _tcscat(strOut,FileList[Sel].Name);
+
+ /* check for odd number of quotes means we need to close them */
+ if(!NeededQuote)
+ {
+ for(i = 0; i < _tcslen(strOut); i++)
+ if(strOut[i] == _T('\"'))
+ NeededQuote = !NeededQuote;
+ }
+
+ if(szPrefix[_tcslen(szPrefix) - 1] == _T('\"') || NeededQuote)
+ _tcscat(strOut,_T("\""));
+
+ _tcscpy(LastReturned,strOut);
+ EndLength = _tcslen(strOut);
+ DiffLength = EndLength - StartLength;
+ CloseHandle(hFile);
+ if(FileList != NULL)
+ free(FileList);
+
+}
+#endif
--- /dev/null
+Archive Contents
+~~~~~~~~~~~~~~~~
+files.txt This file list
+history.txt History of revsions. Not to date. see svn.reactos.com for more info.
+license.txt GNU license - applies to all files named here
+readme.txt General shell info
+readme2.txt Techincal shell info
+todo.txt Things that need to be implmented or fixed(including bugs)
+
+alias.c Alias code
+alias.h Alias header file
+attrib.c Implements attrib command
+batch.c Batch file interpreter
+beep.c Implements beep command
+call.c Implements call command
+chcp.c Implements chcp command
+choice.c Implements choice command
+cls.c Implements cls command
+cmdinput.c Command-line input functions
+cmdtable.c Table of available internal commands
+cmd.c Main code for command-line interpreter
+cmd.h Command header file
+color.c Implements color command
+console.c Windows console handling code
+copy.c Implements copy command
+date.c Implements date command
+del.c Implements del command
+dir.c Directory listing code
+dirstack.c Directory stack code (PUSHD and POPD)
+echo.c Implements echo command
+error.c Error Message Routines
+filecomp.c Filename completion functions
+for.c Implements for command
+free.c Implements free command
+goto.c Implements goto command
+history.c Command-line history handling
+if.c Implements if command
+internal.c Internal commands (DIR, RD, CD, etc)
+label.c Implements label command
+locale.c Locale handling code
+memory.c Implements memory command
+misc.c Misc. Functions
+msgbox.c Implements msgbox command
+move.c Implements move command
+path.c Implements path command
+pause.c Implements pause command
+prompt.c Prompt handling functions
+redir.c Redirection and piping parsing functions
+ren.c Implements rename command
+set.c Implements set command
+shift.c Implements shift command
+time.c Implements time command
+timer.c Implements timer command
+type.c Implements type command
+ver.c Implements ver command
+where.c Code to search path for executables
+verify.c Implements verify command
--- /dev/null
+/*
+ * FOR.C - for internal batch command.
+ *
+ *
+ * History:
+ *
+ * 16-Jul-1998 (Hans B Pufal)
+ * Started.
+ *
+ * 16-Jul-1998 (John P Price)
+ * Seperated commands into individual files.
+ *
+ * 19-Jul-1998 (Hans B Pufal)
+ * Implementation of FOR.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * Added config.h include.
+ *
+ * 20-Jan-1999 (Eric Kohl)
+ * Unicode and redirection safe!
+ *
+ * 01-Sep-1999 (Eric Kohl)
+ * Added help text.
+ *
+ * 23-Feb-2001 (Carl Nettelblad <cnettel@hem.passagen.se>)
+ * Implemented preservation of echo flag. Some other for related
+ * code in other files fixed, too.
+ *
+ * 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+/*
+ * Perform FOR command.
+ *
+ * First check syntax is correct : FOR %v IN ( <list> ) DO <command>
+ * v must be alphabetic, <command> must not be empty.
+ *
+ * If all is correct build a new bcontext structure which preserves
+ * the necessary information so that readbatchline can expand
+ * each the command prototype for each list element.
+ *
+ * You might look on a FOR as being a called batch file with one line
+ * per list element.
+ */
+
+INT cmd_for (LPTSTR cmd, LPTSTR param)
+{
+ LPBATCH_CONTEXT lpNew;
+ LPTSTR pp;
+ TCHAR var;
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+#ifdef _DEBUG
+ DebugPrintf (_T("cmd_for (\'%s\', \'%s\'\n"), cmd, param);
+#endif
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_FOR_HELP1);
+ return 0;
+ }
+
+ /* Check that first element is % then an alpha char followed by space */
+ if ((*param != _T('%')) || !_istalpha (*(param + 1)) || !_istspace (*(param + 2)))
+ {
+ LoadString( CMD_ModuleHandle, STRING_FOR_ERROR, szMsg, RC_STRING_MAX_SIZE);
+ error_syntax (szMsg);
+ return 1;
+ }
+
+ param++;
+ var = *param++; /* Save FOR var name */
+
+ while (_istspace (*param))
+ param++;
+
+ /* Check next element is 'IN' */
+ if ((_tcsnicmp (param, _T("in"), 2) != 0) || !_istspace (*(param + 2)))
+ {
+ LoadString(CMD_ModuleHandle, STRING_FOR_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ error_syntax(szMsg);
+ return 1;
+ }
+
+ param += 2;
+ while (_istspace (*param))
+ param++;
+
+ /* Folowed by a '(', find also matching ')' */
+ if ((*param != _T('(')) || (NULL == (pp = _tcsrchr (param, _T(')')))))
+ {
+ LoadString(CMD_ModuleHandle, STRING_FOR_ERROR2, szMsg, RC_STRING_MAX_SIZE);
+ error_syntax(szMsg);
+ return 1;
+ }
+
+ *pp++ = _T('\0');
+ param++; /* param now points at null terminated list */
+
+ while (_istspace (*pp))
+ pp++;
+
+ /* Check DO follows */
+ if ((_tcsnicmp (pp, _T("do"), 2) != 0) || !_istspace (*(pp + 2)))
+ {
+ LoadString(CMD_ModuleHandle, STRING_FOR_ERROR3, szMsg, RC_STRING_MAX_SIZE);
+ error_syntax(szMsg);
+ return 1;
+ }
+
+ pp += 2;
+ while (_istspace (*pp))
+ pp++;
+
+ /* Check that command tail is not empty */
+ if (*pp == _T('\0'))
+ {
+ LoadString(CMD_ModuleHandle, STRING_FOR_ERROR4, szMsg, RC_STRING_MAX_SIZE);
+ error_syntax(szMsg);
+ return 1;
+ }
+
+ /* OK all is correct, build a bcontext.... */
+ lpNew = (LPBATCH_CONTEXT)malloc (sizeof (BATCH_CONTEXT));
+
+ lpNew->prev = bc;
+ bc = lpNew;
+
+ bc->hBatchFile = INVALID_HANDLE_VALUE;
+ bc->ffind = NULL;
+ bc->params = BatchParams (_T(""), param); /* Split out list */
+ bc->shiftlevel = 0;
+ bc->forvar = var;
+ bc->forproto = _tcsdup (pp);
+ if (bc->prev)
+ bc->bEcho = bc->prev->bEcho;
+ else
+ bc->bEcho = bEcho;
+ bc->In[0] = _T('\0');
+ bc->Out[0] = _T('\0');
+ bc->Err[0] = _T('\0');
+
+
+ return 0;
+}
+
+/* EOF */
--- /dev/null
+/*
+ * FREE.C - internal command.
+ *
+ *
+ * History:
+ *
+ * 01-Sep-1999 (Eric Kohl)
+ * Started.
+ *
+ * 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_FREE
+
+static VOID
+PrintDiskInfo (LPTSTR szDisk)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR szRootPath[4] = _T("A:\\");
+ TCHAR szDrive[2] = _T("A");
+ TCHAR szVolume[64];
+ TCHAR szSerial[10];
+ TCHAR szTotal[40];
+ TCHAR szUsed[40];
+ TCHAR szFree[40];
+ DWORD dwSerial;
+ ULARGE_INTEGER uliSize;
+ DWORD dwSecPerCl;
+ DWORD dwBytPerSec;
+ DWORD dwFreeCl;
+ DWORD dwTotCl;
+
+ if (_tcslen (szDisk) < 2 || szDisk[1] != _T(':'))
+ {
+ LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg);
+ return;
+ }
+
+ szRootPath[0] = szDisk[0];
+ szDrive[0] = _totupper (szRootPath[0]);
+
+ if (!GetVolumeInformation (szRootPath, szVolume, 64, &dwSerial,
+ NULL, NULL, NULL, 0))
+ {
+ LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(_T("%s %s:\n"), szMsg, szDrive);
+ return;
+ }
+
+ if (szVolume[0] == _T('\0'))
+ {
+
+ LoadString(CMD_ModuleHandle, STRING_FREE_ERROR2, szMsg, RC_STRING_MAX_SIZE);
+ _tcscpy (szVolume, szMsg);
+ }
+
+ _stprintf (szSerial,
+ _T("%04X-%04X"),
+ HIWORD(dwSerial),
+ LOWORD(dwSerial));
+
+ if (!GetDiskFreeSpace (szRootPath, &dwSecPerCl,
+ &dwBytPerSec, &dwFreeCl, &dwTotCl))
+ {
+ LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf (_T("%s %s:\n"), szMsg, szDrive);
+ return;
+ }
+
+ uliSize.QuadPart = dwSecPerCl * dwBytPerSec * dwTotCl;
+ ConvertULargeInteger (uliSize, szTotal, 40, TRUE);
+
+ uliSize.QuadPart = dwSecPerCl * dwBytPerSec * (dwTotCl - dwFreeCl);
+ ConvertULargeInteger (uliSize, szUsed, 40, TRUE);
+
+ uliSize.QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl;
+ ConvertULargeInteger (uliSize, szFree, 40, TRUE);
+
+
+ LoadString(CMD_ModuleHandle, STRING_FREE_HELP1, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, szDrive, szVolume, szSerial, szTotal, szUsed, szFree);
+}
+
+
+INT CommandFree (LPTSTR cmd, LPTSTR param)
+{
+ LPTSTR szParam;
+ TCHAR szDefPath[MAX_PATH];
+ INT argc, i;
+ LPTSTR *arg;
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_FREE_HELP2);
+ return 0;
+ }
+
+ if (!param || *param == _T('\0'))
+ {
+ GetCurrentDirectory (MAX_PATH, szDefPath);
+ szDefPath[2] = _T('\0');
+ szParam = szDefPath;
+ }
+ else
+ szParam = param;
+
+ arg = split (szParam, &argc, FALSE);
+
+ for (i = 0; i < argc; i++)
+ PrintDiskInfo (arg[i]);
+
+ freep (arg);
+
+ return 0;
+}
+
+#endif /* INCLUDE_CMD_FREE */
+
+/* EOF */
--- /dev/null
+/*
+ * GOTO.C - goto internal batch command.
+ *
+ * History:
+ *
+ * 16 Jul 1998 (Hans B Pufal)
+ * started.
+ *
+ * 16 Jul 1998 (John P Price)
+ * Seperated commands into individual files.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 28 Jul 1998 (Hans B Pufal) [HBP_003]
+ * Terminate label on first space character, use only first 8 chars of
+ * label string
+ *
+ * 24-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection safe!
+ *
+ * 27-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("/?").
+ *
+ * 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+/*
+ * Perform GOTO command.
+ *
+ * Only valid if batch file current.
+ *
+ */
+
+INT cmd_goto (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ LPTSTR tmp;
+ LONG lNewPosHigh;
+
+#ifdef _DEBUG
+ DebugPrintf (_T("cmd_goto (\'%s\', \'%s\'\n"), cmd, param);
+#endif
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_GOTO_HELP1);
+ return 0;
+ }
+
+ /* if not in batch -- error!! */
+ if (bc == NULL)
+ {
+ return 1;
+ }
+
+ if (*param == _T('\0'))
+ {
+ LoadString(CMD_ModuleHandle, STRING_GOTO_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ExitBatch(szMsg);
+ return 1;
+ }
+
+ /* terminate label at first space char */
+ tmp = param+1;
+ while (!_istcntrl (*tmp) && !_istspace (*tmp) && (*tmp != _T(':')))
+ tmp++;
+ *(tmp) = _T('\0');
+
+ /* set file pointer to the beginning of the batch file */
+ lNewPosHigh = 0;
+
+ /* jump to end of the file */
+ if ( _tcsicmp( param, _T(":eof"))==0)
+ {
+ SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_END);
+ return 0;
+ }
+
+ /* jump to begin of the file */
+ SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_BEGIN);
+
+ while (FileGetString (bc->hBatchFile, textline, sizeof(textline) / sizeof(textline[0])))
+ {
+ int pos;
+ int size;
+
+ /* Strip out any trailing spaces or control chars */
+ tmp = textline + _tcslen (textline) - 1;
+
+
+ while (_istcntrl (*tmp) || _istspace (*tmp) || (*tmp == _T(':')))
+ tmp--;
+ *(tmp + 1) = _T('\0');
+
+ /* Then leading spaces... */
+ tmp = textline;
+ while (_istspace (*tmp))
+ tmp++;
+
+ /* All space after leading space terminate the string */
+ size = _tcslen(tmp) -1;
+ pos=0;
+ while (tmp+pos < tmp+size)
+ {
+ if (_istspace(tmp[pos]))
+ tmp[pos]=_T('\0');
+ pos++;
+ }
+
+ /* use whole label name */
+ if ((*tmp == _T(':')) && (_tcsicmp (++tmp, param) == 0))
+ return 0;
+ }
+
+ LoadString(CMD_ModuleHandle, STRING_GOTO_ERROR2, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, param);
+ ExitBatch(NULL);
+ return 1;
+}
+
+/* EOF */
--- /dev/null
+/*
+ * HISTORY.C - command line history.
+ *
+ *
+ * History:
+ *
+ * 14/01/95 (Tim Norman)
+ * started.
+ *
+ * 08/08/95 (Matt Rains)
+ * i have cleaned up the source code. changes now bring this source
+ * into guidelines for recommended programming practice.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 25-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Cleanup!
+ * Unicode and redirection safe!
+ *
+ * 25-Jan-1999 (Paolo Pantaleo <paolopan@freemail.it>)
+ * Added lots of comments (beginning studying the source)
+ * Added command.com's F3 support (see cmdinput.c)
+ *
+ */
+
+
+
+/*
+ * HISTORY.C - command line history. Second version
+ *
+ *
+ * History:
+ *
+ * 06/12/99 (Paolo Pantaleo <paolopan@freemail.it>)
+ * started.
+ *
+ */
+
+#include <precomp.h>
+
+#ifdef FEATURE_HISTORY
+
+typedef struct tagHISTORY
+{
+ struct tagHISTORY *prev;
+ struct tagHISTORY *next;
+ LPTSTR string;
+} HIST_ENTRY, * LPHIST_ENTRY;
+
+static INT size,
+ max_size=100;
+
+
+
+static LPHIST_ENTRY Top;
+static LPHIST_ENTRY Bottom;
+
+
+static LPHIST_ENTRY curr_ptr=0;
+
+
+VOID InitHistory(VOID);
+VOID History_move_to_bottom(VOID);
+VOID History (INT dir, LPTSTR commandline);
+VOID CleanHistory(VOID);
+VOID History_del_current_entry(LPTSTR str);
+
+/*service functions*/
+static VOID del(LPHIST_ENTRY item);
+static VOID add_at_bottom(LPTSTR string);
+/*VOID add_before_last(LPTSTR string);*/
+VOID set_size(INT new_size);
+
+
+
+INT CommandHistory (LPTSTR cmd, LPTSTR param)
+{
+ LPTSTR tmp;
+ INT tmp_int;
+ LPHIST_ENTRY h_tmp;
+ TCHAR szBuffer[2048];
+
+ tmp=_tcschr(param,_T('/'));
+
+ if (tmp)
+ {
+ param=tmp;
+ switch (_totupper(param[1]))
+ {
+ case _T('F'):/*delete history*/
+ CleanHistory();InitHistory();
+ break;
+
+ case _T('R'):/*read history from standard in*/
+ //hIn=GetStdHandle (STD_INPUT_HANDLE);
+
+ for(;;)
+ {
+ ConInString(szBuffer,sizeof(szBuffer)/sizeof(TCHAR));
+ if (*szBuffer!=_T('\0'))
+ History(0,szBuffer);
+ else
+ break;
+ }
+ break;
+
+ case _T('A'):/*add an antry*/
+ History(0,param+2);
+ break;
+
+ case _T('S'):/*set history size*/
+ if ((tmp_int=_ttoi(param+2)))
+ set_size(tmp_int);
+ break;
+
+ default:
+ return 1;
+ }
+ }
+ else
+ {
+ for (h_tmp = Top->prev; h_tmp != Bottom; h_tmp = h_tmp->prev)
+ ConErrPuts(h_tmp->string);
+ }
+ return 0;
+}
+
+VOID set_size(INT new_size)
+{
+ while (new_size<size)
+ del(Top->prev);
+
+ max_size=new_size;
+}
+
+
+VOID InitHistory(VOID)
+{
+ size=0;
+
+ Top = malloc(sizeof(HIST_ENTRY));
+ Bottom = malloc(sizeof(HIST_ENTRY));
+
+ Top->prev = Bottom;
+ Top->next = NULL;
+ Top->string = NULL;
+
+ Bottom->prev = NULL;
+ Bottom->next = Top;
+ Bottom->string = NULL;
+
+ curr_ptr=Bottom;
+}
+
+
+
+
+VOID CleanHistory(VOID)
+{
+ while (Bottom->next!=Top)
+ del(Bottom->next);
+
+ free(Top);
+ free(Bottom);
+}
+
+
+VOID History_del_current_entry(LPTSTR str)
+{
+ LPHIST_ENTRY tmp;
+
+ if (size == 0)
+ return;
+
+ if (curr_ptr == Bottom)
+ curr_ptr=Bottom->next;
+
+ if (curr_ptr == Top)
+ curr_ptr=Top->prev;
+
+
+ tmp = curr_ptr;
+ curr_ptr = curr_ptr->prev;
+ del(tmp);
+ History(-1, str);
+}
+
+
+static
+VOID del(LPHIST_ENTRY item)
+{
+ if (item==NULL || item==Top || item==Bottom)
+ {
+#ifdef _DEBUG
+ DebugPrintf(_T("del in ") _T(__FILE__) _T(": retrning\n")
+ _T("item is 0x%08x (Bottom is0x%08x)\n"),
+ item, Bottom);
+#endif
+ return;
+ }
+
+
+
+ /*free string's mem*/
+ if (item->string)
+ free(item->string);
+
+ /*set links in prev and next item*/
+ item->next->prev=item->prev;
+ item->prev->next=item->next;
+
+ free(item);
+
+ size--;
+}
+
+
+#if 0
+static
+VOID add_before_last(LPTSTR string)
+{
+ LPHIST_ENTRY tmp,before,after;
+
+ /*delete first entry if maximum number of entries is reached*/
+ while(size>=max_size)
+ del(Top->prev);
+
+ while (_istspace(*string))
+ string++;
+
+ if (*string==_T('\0'))
+ return;
+
+ /*allocte entry and string*/
+ tmp=malloc(sizeof(HIST_ENTRY));
+ tmp->string=malloc((_tcslen(string)+1)*sizeof(TCHAR));
+ _tcscpy(tmp->string,string);
+
+ /*set links*/
+ before=Bottom->next;
+ after=before->next;
+
+ tmp->prev=before;
+ tmp->next=after;
+
+ after->prev=tmp;
+ before->next=tmp;
+
+ /*set new size*/
+ size++;
+
+
+}
+#endif/*0*/
+
+static
+VOID add_at_bottom(LPTSTR string)
+{
+
+
+ LPHIST_ENTRY tmp;
+
+
+ /*delete first entry if maximum number of entries is reached*/
+ while(size>=max_size)
+ del(Top->prev);
+
+ while (_istspace(*string))
+ string++;
+
+ if (*string==_T('\0'))
+ return;
+
+
+ /*if new entry is the same than the last do not add it*/
+ if(size)
+ if(_tcscmp(string,Bottom->next->string)==0)
+ return;
+
+
+ /*fill bottom with string, it will become Bottom->next*/
+ Bottom->string=malloc((_tcslen(string)+1)*sizeof(TCHAR));
+ _tcscpy(Bottom->string,string);
+
+ /*save Bottom value*/
+ tmp=Bottom;
+
+
+ /*create new void Bottom*/
+ Bottom=malloc(sizeof(HIST_ENTRY));
+ Bottom->next=tmp;
+ Bottom->prev=NULL;
+ Bottom->string=NULL;
+
+ tmp->prev=Bottom;
+
+ /*set new size*/
+ size++;
+
+}
+
+
+
+VOID History_move_to_bottom(VOID)
+{
+ curr_ptr=Bottom;
+
+}
+
+
+VOID History (INT dir, LPTSTR commandline)
+{
+
+ if(dir==0)
+ {
+ add_at_bottom(commandline);
+ curr_ptr=Bottom;
+ return;
+ }
+
+ if (size==0)
+ {
+ commandline[0]=_T('\0');
+ return;
+ }
+
+
+ if(dir<0)/*key up*/
+ {
+ if (curr_ptr->next==Top || curr_ptr==Top)
+ {
+#ifdef WRAP_HISTORY
+ curr_ptr=Bottom;
+#else
+ curr_ptr=Top;
+ commandline[0]=_T('\0');
+ return;
+#endif
+ }
+
+
+ curr_ptr = curr_ptr->next;
+ if(curr_ptr->string)
+ _tcscpy(commandline,curr_ptr->string);
+
+ }
+
+
+
+
+
+ if(dir>0)
+ {
+
+ if (curr_ptr->prev==Bottom || curr_ptr==Bottom)
+ {
+#ifdef WRAP_HISTORY
+ curr_ptr=Top;
+#else
+ curr_ptr=Bottom;
+ commandline[0]=_T('\0');
+ return;
+#endif
+ }
+
+ curr_ptr=curr_ptr->prev;
+ if(curr_ptr->string)
+ _tcscpy(commandline,curr_ptr->string);
+
+ }
+}
+
+
+
+
+
+
+#if 0
+
+LPTSTR history = NULL; /*buffer to sotre all the lines*/
+LPTSTR lines[MAXLINES]; /*array of pointers to each line(entry)*/
+ /*located in history buffer*/
+
+INT curline = 0; /*the last line recalled by user*/
+INT numlines = 0; /*number of entries, included the last*/
+ /*empty one*/
+
+INT maxpos = 0; /*index of last byte of last entry*/
+
+
+
+VOID History (INT dir, LPTSTR commandline)
+{
+
+ INT count; /*used in for loops*/
+ INT length; /*used in the same loops of count*/
+ /*both to make room when is full
+ either history or lines*/
+
+ /*first time History is called allocate mem*/
+ if (!history)
+ {
+ history = malloc (history_size * sizeof (TCHAR));
+ lines[0] = history;
+ history[0] = 0;
+ }
+
+ if (dir > 0)
+ {
+ /* next command */
+ if (curline < numlines)
+ {
+ curline++;
+ }
+
+ if (curline == numlines)
+ {
+ commandline[0] = 0;
+ }
+ else
+ {
+ _tcscpy (commandline, lines[curline]);
+ }
+ }
+ else if (dir < 0)
+ {
+ /* prev command */
+ if (curline > 0)
+ {
+ curline--;
+ }
+
+ _tcscpy (commandline, lines[curline]);
+ }
+ else
+ {
+ /* add to history */
+ /* remove oldest string until there's enough room for next one */
+ /* strlen (commandline) must be less than history_size! */
+ while ((maxpos + (INT)_tcslen (commandline) + 1 > history_size) || (numlines >= MAXLINES))
+ {
+ length = _tcslen (lines[0]) + 1;
+
+ for (count = 0; count < maxpos && count + (lines[1] - lines[0]) < history_size; count++)
+ {
+ history[count] = history[count + length];
+ }
+
+ maxpos -= length;
+
+ for (count = 0; count <= numlines && count < MAXLINES; count++)
+ {
+ lines[count] = lines[count + 1] - length;
+ }
+
+ numlines--;
+#ifdef DEBUG
+ ConOutPrintf (_T("Reduced size: %ld lines\n"), numlines);
+
+ for (count = 0; count < numlines; count++)
+ {
+ ConOutPrintf (_T("%d: %s\n"), count, lines[count]);
+ }
+#endif
+ }
+
+ /*copy entry in the history bufer*/
+ _tcscpy (lines[numlines], commandline);
+ numlines++;
+
+ /*set last lines[numlines] pointer next the end of last, valid,
+ just setted entry (the two lines above)*/
+ lines[numlines] = lines[numlines - 1] + _tcslen (commandline) + 1;
+ maxpos += _tcslen (commandline) + 1;
+ /* last line, empty */
+
+ curline = numlines;
+ }
+
+ return;
+}
+
+#endif
+
+#endif //#if 0
--- /dev/null
+FreeDOS Command Line Interface Development History
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+11/11/94 version 0.01
+~~~~~~~~~~~~~~~~~~~~~
+o initial release.
+
+01/01/95 version 0.10
+~~~~~~~~~~~~~~~~~~~~~
+o removed some scaffolding.
+o modified CD.
+o added tab file completion.
+o added command line history.
+
+01/15/95 version 0.20
+~~~~~~~~~~~~~~~~~~~~~
+o formatted all existing source modules.
+o added prompt support.
+o added drive selection.
+o added dir command.
+o started this development log.
+
+08/06/95 prerelease of version 0.30
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+o reorganized code into separate source modules.
+o added batch processing support (thanks to Evan Jeffrey).
+o added exec code (thanks to Steffan Kaiser).
+o removed environment handling (thanks again to Steffan Kaiser)
+
+ [ 08/08/95 -- Matt Rains ]
+o formatted this development log.
+o formatted all existing source modules so that they comply with recommended
+ programming practice.
+o added MD command.
+o added RD command.
+o added VER command.
+o replaced CD command.
+o modified DIR command.
+o DIR now called regardless of other DIR.??? files. this is done because of
+ exec() problems.
+
+12/10/95 version 0.30
+~~~~~~~~~~~~~~~~~~~~~
+o used Borland's spawnve to fix exec problem
+o fixed CD again so you don't need a space after it
+o couple of spelling fixes
+
+12/14/95 version 0.31
+~~~~~~~~~~~~~~~~~~~~~
+o modified cmdinput.c to work with non-standard screen sizes (see 28.com)
+o fixed a bug in history.c that made it not work when you hit the up arrow
+ on the first line
+o fixed DIR to work a little more like MS-DOS's DIR (see internal.c)
+o fixed some code in where.c to make things a bit more efficient and nicer
+
+01/06/96 version 0.40 (never released)
+~~~~~~~~~~~~~~~~~~~~~
+o added redirection and piping support!!! (see redir.c and command.c)
+o fixed a stupid pointer problem in where.c that was causing LOTS of
+ problems in the strangest places...
+o added day of the week support to prompt.c (oops, that was already supposed
+ to be there! :)
+o fixed and reorganized the EXEC code!!! Thanks to Svante Frey!
+o reorganized command.c and internal.c to handle parsing internal commands
+ more efficiently and consistently.
+o changed the behavior of MD, CD, RD to work without spaces (e.g. CD\DOS)
+o small changes here and there to make it work with redirection/piping
+ (e.g. DIR only pauses if you're not doing redirection)
+
+01/17/96 version 0.50
+~~~~~~~~~~~~~~~~~~~~~
+Version 0.40 was never released because I was home on Christmas vacation,
+and I couldn't upload it. By the time I got back to school, I had the
+LOADHIGH patch from Svante Frey, so I decided to jump up to 0.50 without any
+release of 0.40... - Tim Norman
+
+o LOADHIGH/LOADFIX/LH support added!!!! Many thanks go to Svante Frey!
+o bug fixed in command parsing that didn't handle / switches correctly...
+o removed debugging output from history.c
+
+07/26/96 version 0.60
+~~~~~~~~~~~~~~~~~~~~~
+Lots of internal changes here... Not much added to the interface.
+
+o Changed internals to use first,rest parameters instead of arrays of params
+o Fixed some bugs
+o Some other things I don't remember :)
+
+07/26/96 version 0.61
+~~~~~~~~~~~~~~~~~~~~~
+Bugfixes
+
+o Added hook to the PATH command
+o Fixed CD.. bug
+
+08/27/96 version 0.70
+~~~~~~~~~~~~~~~~~~~~~
+Finally added Oliver Mueller's ALIAS command! Also numerous bug fixes.
+
+o Added ALIAS command
+o Removed support for - as a switch in LOADHIGH.C
+o Bugfixes in BATCH.C. %0 was returning garbage
+o Removed lots of unused variables, reducing # of warnings when compiling
+o Other miscellaneous code clean-ups
+o Changed WHERE.C to use a little less memory
+
+06/14/97 version 0.71
+~~~~~~~~~~~~~~~~~~~~~
+Lots of bug fixes, plus some additional features.
+
+o New DIR command. Now more like MS-DOS's DIR. /p supported, /s coming soon
+o bug fix in internal.c - parse_firstarg
+o Rewrote parser in batch.c (Steffan Kaiser)
+o Ctrl-Break checking in various places (Steffan Kaiser)
+o Error level setting/checking (%? in batch files) (Steffan Kaiser)
+o bug fix in cmdinput.c ("%i" on command-line caused weird behavior)
+o bug fix in where.c (first item in path wasn't searched)
+
+07/12/97 version 0.72
+~~~~~~~~~~~~~~~~~~~~~
+More bug fixes and code cleanup
+
+o Rewrote cmdinput.c to be more efficient (Marc Desrochers)
+o Added insert/overstrike modes (Marc Desrochers)
+o Replaced findxy() with pointers into BIOS (maxx, maxy) (Marc Desrochers)
+o Fixed bug that disallowed listing of root directories
+o Fixed bug that didn't search the first path (again!)
+
+07/13/97 version 0.72b
+~~~~~~~~~~~~~~~~~~~~~~
+Disabled a feature that caused a crash on some machines.
+
+o Replaced setcursor calls in cmdinput.c with _setcursortype
+o Added dir.c to the distribution (was left out in 0.72)
+
+07/01/98 version 0.73 (Rob Lake)
+~~~~~~~~~~~~~~~~~~~~~~
+o New DIR commands supported: /S, /B, /L, /A and /W.
+ (/R changed to /S). Also /? added.
+o Supports DIRCMD in environment.
+o Supports turning off commands with hyphen (ex. /-S
+ turns off recursive listing)
+o Changed error messages for DIR and DEL to more MS-DOS'ish
+o Moved error messages from DIR.C and DEL.C to COMMAND.H
+ (more may go there soon)
+o Fixed bug that caused dir *.ext/X not to work (no spaces
+ between filespec and slash)
+o Added wildcard support for DEL command
+o Added prompt and help switch for DEL command, /P and /?
+ respectively.
+o Added support for /C when envoking the shell
+o Added /P support when Kernel loads shell. This means
+ the shell now is permanent and runs the autoexec.bat
+ (/E is not implemented)
+o Added my name (Rob Lake) to the developer listing
+o Changed version routine to print out copyright notice
+ with no args, and with appropriate switches, warranty
+ and redistribution notices and developer listing
+
+07/08/1998 version 0.74 (John P. Price (linux-guru@gcfl.net))
+~~~~~~~~~~~~~~~~~~~~~~~~
+COMMAND.C/COMMAND.H:
+o Now sets COMSPEC environment variable
+o misc clean up and optimization
+o added date, time and type commands
+o changed to using spawnl instead of exec. exec does not copy the
+ environment to the child process!
+DIR.C
+o removed extra returns; closer to MSDOS
+o fixed wide display so that an extra return is not displayed when
+ there is five filenames in the last line.
+ENVIRON.C
+o commented out show_environment function. Not used anymore.
+INTERAL.C
+o removed call to show_environment in set command.
+o moved test for syntax before allocating memory in set command.
+o misc clean up and optimization.
+
+o created DATE.C
+o created TIME.C
+o created TYPE.C
+
+07/08/1998 version 0.74b (John P. Price (linux-guru@gcfl.net))
+~~~~~~~~~~~~~~~~~~~~~~~~
+COMMAND.C
+o fixed call to spawnl so that it would pass command line arguments
+ correctly.
+
+07/12/98 version 0.74c (Rob Lake rlake@cs.mun.ca)
+~~~~~~~~~~~~~~~~~~~~~~
+Various Files:
+o removed redundant use of error message defines and moved
+ error printing calls to ERROR.C to reduced program size.
+
+o created MISC.C
+o created ERR_HAND.C/H
+o created ERROR.C
+
+07/13/98 version 0.74d (Rob Lake rlake@cs.mun.ca)
+~~~~~~~~~~~~~~~~~~~~~~
+INTERNAL.C
+o removed most of the commands and placed them in there own file
+ -- del, ren, set and ver
+o created DEL.C, REN.C SET.C and VER.C
+o fixed bug that caused del not to delete files with no attributes
+o the critical error handler count number of times called, autofails
+ at 5 calls
+
+
+16 Jul 1998 (Hans B Pufal <hansp@digiweb.com>)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+batch.c
+ A new version, implements CALL, ECHO, GOT, IF, PAUSE, SHIFT and
+ BEEP. There is a stub for FOR but that's all.
+
+cmdtable.c
+ New file to keep the internal command table. I plan on getting rid
+ of the table real soon now and replacing it with a dynamic
+ mechanism.
+
+command.c
+ A new (improved ;) version. Conforms closely to MS-DOS specs.
+ Cleaned up (and fixed) the redirection handler.
+
+command.h
+ Version D with changes. Look for the HBP tag.
+
+redir.c
+ Modified file, now supports append redirects.
+
+
+16 Jul 1998 (Rob Lake rlake@cs.mun.ca)
+~~~~~~~~~~~~~~~~~~~~~~
+Added TRUENAME command.
+
+
+19 Jul 1998 (Hans B Pufal) <hansp@digiweb.com>)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+o Preserve state of echo flag across batch calls.
+o Implementation of FOR command
+
+
+20 Jul 1998 (John P Price <linux-guru@gcfl.net>)
+~~~~~~~~~~~~~~~~~~~~~~
+o Fixed bug in DATE.C.
+o Fixed bug in LH.ASM.
+o Separated commands into individual files.
+
+
+28 Jul 1998 (John P Price <linux-guru@gcfl.net>)
+~~~~~~~~~~~~~~~~~~~~~~
+o Added CLS command.
+o Put ifdef's around all commands and added include file config.h
+ Now you can define exact what commands you want to include in
+ command.com.
+o Also added ifdefs for optional features: aliases, command history
+ and filename completion.
+o Added display of available internal commands and options at startup.
+
+
+29 Jul 1998 (Rob Lake rlake@cs.mun.ca)
+~~~~~~~~~~~~~~~~~~~~~~
+o changed date.c and time.c, and wrote datefunc.c and timefunc.c to
+ impliment _dos_getdate, _dos_setdate, _dos_gettime and _dos_settime.
+ This is the first of many steps to make the shell compatible under
+ Pacific C.
+
+30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+~~~~~~~~~~~~~~~~~~~~~~
+o Changed filename completion so that a second TAB displays a list of
+ matching filenames!
+o made filename be lower case if last character typed is lower case.
+o Moved filename completion code to filecomp.c.
+o Change ver command to display email address to report bugs, and the
+ web page address for updates.
+o fixed so that it find_which returns NULL if filename is not
+ executable (does not have .bat, .com, or .exe extension). Before
+ command would to execute any file with any extension. (opps!)
+
+30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+~~~~~~~~~~~~~~~~~~~~~~
+o Fixed bug where if you typed something, then hit HOME, then tried to
+ type something else in insert mode, it locked up.
+o Changed default insert mode to on. There should be a way to change
+ this. Maybe options to doskey command.
+o Added VERIFY command
+
+02-Aug-1998 (Hans B Pufal) <hansp@digiweb.com>)
+~~~~~~~~~~~~~~~~~~~~~~
+o batch.c: Fixed bug in ECHO flag restoration at exit from batch file
+o command.c: Fixed return value when called with /C option
+o Terminate label on first space character, use only first 8 chars of
+ label string
+
+04-Aug-1998 (Hans B Pufal) <hansp@digiweb.com>)
+~~~~~~~~~~~~~~~~~~~~~~
+o call.c: added lines to initialize for pointers. This fixed the
+ lock-up that happened sometimes when calling a batch file from
+ another batch file.
+
+07-Aug-1998 (John P Price <linux-guru@gcfl.net>)
+~~~~~~~~~~~~~~~~~~~~~~
+o Fixed carrage return output to better match MSDOS with echo on or off.
+
+
+07-Dec-1998 ReactOS CMD version 0.0.1 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+o First test release.
+o Added internal ATTRIB command.
+
+11-Dec-1998 ReactOS CMD version 0.0.2 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+o Fixed bug in ALIAS. CMD crashed when you tried to remove an alias.
+o Fixed bug in split(). Added freep(). This fixed the DEL command.
+o Improved ATTRIB command.
+o Added most help texts.
+o Fixed recursive DIR ("dir /s").
+o Fixed DATE and TIME command. Now they accept values when used
+ without parameter.
+o Implemented LABEL command.
+
+05-Jan-1999 ReactOS CMD version 0.0.3 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+o Added COLOR command and "/t" option.
+o Cursor shows insert/overwrite mode.
+o COMSPEC environment variable is set upon startup.
+o Started COPY command.
+o Started MOVE command.
+o Added directory stack (PUSHD and POPD commands).
+o Added support for file names or paths that contain spaces
+ (quoted paths / file names).
+o Added recursion to ATTRIB command.
+o Added locale support for DIR, DATE, TIME and PROMPT.
+o Fixed VERIFY.
+
+10-Feb-1999 ReactOS CMD version 0.0.4 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+o "?" lists all available commands.
+o Most commands are unicode and redirection aware now.
+o Input-, Output- and Error-Redirections works with most commands.
+o ATTRIB and DEL can handle multiple filenames now.
+o Fixed handling of environment variables.
+o Added CHCP command.
+o Fixed keyboard input bug.
+o Rewrote DEL and MOVE commands.
+
+28-Dec-1999 ReactOS CMD version 0.1 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+o Cleaned up DIR command.
+o Searching for executables in the right order.
+o Fixed some little but nasty bugs.
+o Added TITLE command. Thanks to Emanuele Aliberti!
+o Added "/Q", "/W" and "/Z" options to DEL command.
+o Added CHOICE, TIMER, FREE and MEMORY commands.
+o Added MSGBOX command (not available under ReactOS).
+o Added and fixed missing help texts.
+o Fixed bugs in MD and RD that crashed cmd when no directory was specified.
+o Improved history support.
+o Improved COLOR command.
+
+09-Apr-2000 ReactOS CMD version 0.1 (EricKohl <ekohl@rz-online.de>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+o Fixed bug in COPY command. CMD crashed if source file didn't exist.
+
+13-Jul-2000 ReactOS CMD version 0.1.1 (EricKohl <ekohl@rz-online.de>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+o Implemented 'ECHO.' and 'ECHOERR.' commands.
--- /dev/null
+/*
+ * IF.C - if internal batch command.
+ *
+ *
+ * History:
+ *
+ * 16 Jul 1998 (Hans B Pufal)
+ * started.
+ *
+ * 16 Jul 1998 (John P Price)
+ * Seperated commands into individual files.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("if /?") and cleaned up.
+ *
+ * 21-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection ready!
+ *
+ * 01-Sep-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed help text.
+ *
+ * 17-Feb-2001 (ea)
+ * IF DEFINED variable command
+ *
+ * 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ *
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+#define X_EXEC 1
+#define X_EMPTY 0x80
+
+INT cmd_if (LPTSTR cmd, LPTSTR param)
+{
+ INT x_flag = 0; /* when set cause 'then' clause to be executed */
+ LPTSTR pp;
+
+#ifdef _DEBUG
+ DebugPrintf (_T("cmd_if: (\'%s\', \'%s\')\n"), cmd, param);
+#endif
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_IF_HELP1);
+ return 0;
+ }
+
+ /* First check if param string begins with 'not' */
+ if (!_tcsnicmp (param, _T("not"), 3) && _istspace (*(param + 3)))
+ {
+ x_flag = X_EXEC; /* Remember 'NOT' */
+ param += 3; /* Step over 'NOT' */
+ while (_istspace (*param)) /* And subsequent spaces */
+ param++;
+ }
+
+ /* Check for 'exist' form */
+ if (!_tcsnicmp (param, _T("exist"), 5) && _istspace (*(param + 5)))
+ {
+ UINT i;
+ BOOL bInside = FALSE;
+
+ param += 5;
+ while (_istspace (*param))
+ param++;
+
+ pp = param;
+
+ /* find the whole path to the file */
+ for(i = 0; i < _tcslen(param); i++)
+ {
+ if(param[i] == _T('\"'))
+ bInside = !bInside;
+ if((param[i] == _T(' ')) && !bInside)
+ {
+ break;
+ }
+ pp++;
+ }
+ *pp++ = _T('\0');
+ i = 0;
+ /* remove quotes */
+ while(i < _tcslen(param))
+ {
+ if(param[i] == _T('\"'))
+ memmove(¶m[i],¶m[i + 1], _tcslen(¶m[i]) * sizeof(TCHAR));
+ else
+ i++;
+ }
+
+ if (*pp)
+ {
+ WIN32_FIND_DATA f;
+ HANDLE hFind;
+
+ hFind = FindFirstFile (param, &f);
+ x_flag ^= (hFind == INVALID_HANDLE_VALUE) ? 0 : X_EXEC;
+ if (hFind != INVALID_HANDLE_VALUE)
+ {
+ FindClose (hFind);
+ }
+ }
+ else
+ return 0;
+ }
+ else if (!_tcsnicmp (param, _T("defined"), 7) && _istspace (*(param + 7)))
+ {
+ /* Check for 'defined' form */
+ TCHAR Value [1];
+ INT ValueSize = 0;
+
+ param += 7;
+ /* IF [NOT] DEFINED var COMMAND */
+ /* ^ */
+ while (_istspace (*param))
+ param++;
+ /* IF [NOT] DEFINED var COMMAND */
+ /* ^ */
+ pp = param;
+ while (*pp && !_istspace (*pp))
+ pp++;
+ /* IF [NOT] DEFINED var COMMAND */
+ /* ^ */
+ if (*pp)
+ {
+ *pp++ = _T('\0');
+ ValueSize = GetEnvironmentVariable(param, Value, sizeof(Value) / sizeof(Value[0]));
+ x_flag ^= (0 == ValueSize)
+ ? 0
+ : X_EXEC;
+ x_flag |= X_EMPTY;
+ }
+ else
+ return 0;
+ }
+ else if (!_tcsnicmp (param, _T("errorlevel"), 10) && _istspace (*(param + 10)))
+ {
+ /* Check for 'errorlevel' form */
+ INT n = 0;
+
+ pp = param + 10;
+ while (_istspace (*pp))
+ pp++;
+
+ while (_istdigit (*pp))
+ n = n * 10 + (*pp++ - _T('0'));
+
+ x_flag ^= (nErrorLevel != n) ? 0 : X_EXEC;
+
+ x_flag |= X_EMPTY; /* Syntax error if comd empty */
+ }
+ else
+ {
+ BOOL bInQuote = FALSE;
+ INT p1len;
+ pp = param;
+ while ( *pp && ( bInQuote || *pp != _T('=') ) )
+ {
+ if ( *pp == _T('\"') )
+ bInQuote = !bInQuote;
+ ++pp;
+ }
+ p1len = pp-param;
+ /* check for "==" */
+ if ( *pp++ != _T('=') || *pp++ != _T('=') )
+ {
+ error_syntax ( NULL );
+ return 1;
+ }
+ while (_istspace (*pp)) /* Skip subsequent spaces */
+ pp++;
+
+ /* are the two sides equal, and does the second end in the same place? */
+ if ( !_tcsncmp(param,pp,p1len) && _tcschr(_T(" ("),pp[p1len]) )
+ x_flag ^= X_EXEC;
+ pp += p1len;
+
+ if ( x_flag )
+ {
+ while (*pp && !_istspace (*pp)) /* Find first space, */
+ pp++;
+ x_flag |= X_EMPTY;
+ }
+ }
+
+ if (x_flag & X_EMPTY)
+ {
+ while (_istspace (*pp)) /* Then skip spaces */
+ pp++;
+
+ if (*pp == _T('\0')) /* If nothing left then syntax err */
+ {
+ error_syntax (NULL);
+ return 1;
+ }
+ }
+
+ if (x_flag & X_EXEC)
+ {
+ ParseCommandLine (pp);
+ }
+
+ return 0;
+}
+
+/* EOF */
--- /dev/null
+/*
+ * INTERNAL.C - command.com internal commands.
+ *
+ *
+ * History:
+ *
+ * 17/08/94 (Tim Norman)
+ * started.
+ *
+ * 08/08/95 (Matt Rains)
+ * i have cleaned up the source code. changes now bring this source into
+ * guidelines for recommended programming practice.
+ *
+ * cd()
+ * started.
+ *
+ * dir()
+ * i have added support for file attributes to the DIR() function. the
+ * routine adds "d" (directory) and "r" (read only) output. files with the
+ * system attribute have the filename converted to lowercase. files with
+ * the hidden attribute are not displayed.
+ *
+ * i have added support for directorys. now if the directory attribute is
+ * detected the file size if replaced with the string "<dir>".
+ *
+ * ver()
+ * started.
+ *
+ * md()
+ * started.
+ *
+ * rd()
+ * started.
+ *
+ * del()
+ * started.
+ *
+ * does not support wildcard selection.
+ *
+ * todo: add delete directory support.
+ * add recursive directory delete support.
+ *
+ * ren()
+ * started.
+ *
+ * does not support wildcard selection.
+ *
+ * todo: add rename directory support.
+ *
+ * a general structure has been used for the cd, rd and md commands. this
+ * will be better in the long run. it is too hard to maintain such diverse
+ * functions when you are involved in a group project like this.
+ *
+ * 12/14/95 (Tim Norman)
+ * fixed DIR so that it will stick \*.* if a directory is specified and
+ * that it will stick on .* if a file with no extension is specified or
+ * *.* if it ends in a \
+ *
+ * 1/6/96 (Tim Norman)
+ * added an isatty call to DIR so it won't prompt for keypresses unless
+ * stdin and stdout are the console.
+ *
+ * changed parameters to be mutually consistent to make calling the
+ * functions easier
+ *
+ * rem()
+ * started.
+ *
+ * doskey()
+ * started.
+ *
+ * 01/22/96 (Oliver Mueller)
+ * error messages are now handled by perror.
+ *
+ * 02/05/96 (Tim Norman)
+ * converted all functions to accept first/rest parameters
+ *
+ * 07/26/96 (Tim Norman)
+ * changed return values to int instead of void
+ *
+ * path() started.
+ *
+ * 12/23/96 (Aaron Kaufman)
+ * rewrote dir() to mimic MS-DOS's dir
+ *
+ * 01/28/97 (Tim Norman)
+ * cleaned up Aaron's DIR code
+ *
+ * 06/13/97 (Tim Norman)
+ * moved DIR code to dir.c
+ * re-implemented Aaron's DIR code
+ *
+ * 06/14/97 (Steffan Kaiser)
+ * ctrl-break handling
+ * bug fixes
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 03-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Replaced DOS calls by Win32 calls.
+ *
+ * 08-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help texts ("/?").
+ *
+ * 18-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added support for quoted arguments (cd "program files").
+ *
+ * 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Clean up.
+ *
+ * 26-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Replaced remaining CRT io functions by Win32 io functions.
+ * Unicode safe!
+ *
+ * 30-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added "cd -" feature. Changes to the previous directory.
+ *
+ * 15-Mar-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed bug in "cd -" feature. If the previous directory was a root
+ * directory, it was ignored.
+ *
+ * 23-Feb-2001 (Carl Nettelblad <cnettel@hem.passagen.se>)
+ * Improved chdir/cd command.
+ *
+ * 02-Apr-2004 (Magnus Olsen <magnus@greatlord.com>)
+ * Remove all hard code string so they can be
+ * translate to other langues.
+ *
+ * 19-jul-2005 (Brandon Turner <turnerb7@msu.edu)
+ * Rewrite the CD, it working as Windows 2000 CMD
+ *
+ * 19-jul-2005 (Magnus Olsen <magnus@greatlord.com)
+ * Add SetRootPath and GetRootPath
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_CHDIR
+
+static LPTSTR lpLastPath;
+
+
+VOID InitLastPath (VOID)
+{
+ lpLastPath = NULL;
+}
+
+
+VOID FreeLastPath (VOID)
+{
+ if (lpLastPath)
+ free (lpLastPath);
+}
+
+/* help functions for getting current path from drive
+ without changing drive. Return code 0 = ok, 1 = fail.
+ INT GetRootPath("C:",outbuffer,chater size of outbuffer);
+ the first param can have any size, if the the two frist
+ letter are not a drive with : it will get Currentpath on
+ current drive exacly as GetCurrentDirectory does.
+ */
+
+INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size)
+{
+ INT retcode = 1;
+
+ if (_tcslen(InPath)>1)
+ {
+ if (InPath[1]==_T(':'))
+ {
+ INT t=0;
+
+ if ((InPath[0] >= _T('0')) && (InPath[0] <= _T('9')))
+ {
+ t = (InPath[0] - _T('0')) +28;
+ }
+
+ if ((InPath[0] >= _T('a')) && (InPath[0] <= _T('z')))
+ {
+ t = (InPath[0] - _T('a')) +1;
+ InPath[0] = t + _T('A') - 1;
+ }
+
+ if ((InPath[0] >= _T('A')) && (InPath[0] <= _T('Z')))
+ {
+ t = (InPath[0] - _T('A')) +1;
+ }
+
+ if (_tgetdcwd(t,OutPath,size) != NULL)
+ {
+ return 0;
+ }
+ }
+ }
+
+ /* fail */
+ if (_tcslen(InPath)>1)
+ {
+ if (InPath[1]==_T(':'))
+ return 1;
+ }
+
+ /* Get current directory */
+ retcode = GetCurrentDirectory(size,OutPath);
+ if (retcode==0)
+ return 1;
+
+ return 0;
+}
+
+
+BOOL SetRootPath(TCHAR *InPath)
+{
+ TCHAR oldpath[MAX_PATH];
+ TCHAR OutPath[MAX_PATH];
+ TCHAR OutPathTemp[MAX_PATH];
+ TCHAR OutPathTemp2[MAX_PATH];
+ BOOL fail;
+
+
+ /* Get The current directory path and save it */
+ fail = GetCurrentDirectory(MAX_PATH,oldpath);
+ if (!fail)
+ return 1;
+
+ /* Get current drive directory path if C: was only pass down*/
+
+ if (_tcsncicmp(&InPath[1],_T(":\\"),2)!=0)
+ {
+ if (!GetRootPath(InPath,OutPathTemp,MAX_PATH))
+ _tcscpy(OutPathTemp,InPath);
+ }
+ else
+ {
+ _tcscpy(OutPathTemp,InPath);
+ }
+
+ _tcsupr(OutPathTemp);
+ /* The use of both of these together will correct the case of a path
+ where as one alone or GetFullPath will not. Exameple:
+ c:\windows\SYSTEM32 => C:\WINDOWS\system32 */
+ GetFullPathName(OutPathTemp, MAX_PATH, OutPathTemp2, NULL);
+ GetPathCase(OutPathTemp2, OutPath);
+
+ fail = SetCurrentDirectory(OutPath);
+ if (!fail)
+ return 1;
+
+
+
+ SetCurrentDirectory(OutPath);
+ GetCurrentDirectory(MAX_PATH,OutPath);
+ _tchdir(OutPath);
+
+ if (_tcsncicmp(OutPath,oldpath,2)!=0)
+ SetCurrentDirectory(oldpath);
+
+ return 0;
+}
+
+
+/*
+ * CD / CHDIR
+ *
+ */
+INT cmd_chdir (LPTSTR cmd, LPTSTR param)
+{
+
+ WIN32_FIND_DATA f;
+ HANDLE hFile;
+ BOOL bChangeDrive = FALSE;
+ TCHAR szPath[MAX_PATH];
+ TCHAR szFinalPath[MAX_PATH];
+ TCHAR * tmpPath;
+ TCHAR szCurrent[MAX_PATH];
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ INT i;
+
+
+ /* Filter out special cases first */
+
+ /* Print Help */
+ if (!_tcsncmp(param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_CD_HELP);
+ return 0;
+ }
+
+ /* Set Error Level to Success */
+ nErrorLevel = 0;
+
+ /* Input String Contains /D Switch */
+ if (!_tcsncicmp(param, _T("/D"), 2))
+ {
+ bChangeDrive = TRUE;
+ tmpPath = _tcsstr(param,_T(" "));
+ if(!tmpPath)
+ {
+ /* Didnt find an directories */
+ LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg);
+ nErrorLevel = 1;
+ return 1;
+ }
+ tmpPath++;
+ _tcscpy(szPath,tmpPath);
+ }
+ else
+ {
+ _tcscpy(szPath,param);
+ }
+
+ /* Print Current Directory on a disk */
+ if (_tcslen(szPath) == 2 && szPath[1] == _T(':'))
+ {
+ if(GetRootPath(szPath,szCurrent,MAX_PATH))
+ {
+ nErrorLevel = 1;
+ return 1;
+ }
+ ConOutPuts(szCurrent);
+ return 0;
+ }
+
+ /* Get Current Directory */
+ GetRootPath(_T("."),szCurrent,MAX_PATH);
+
+ /* Remove " */
+ i = 0;
+ while(i < (INT)_tcslen(szPath))
+ {
+ if(szPath[i] == _T('\"'))
+ memmove(&szPath[i],&szPath[i + 1], _tcslen(&szPath[i]) * sizeof(TCHAR));
+ else
+ i++;
+ }
+
+ tmpPath = szPath;
+ while (_istspace (*tmpPath))
+ tmpPath++;
+ _tcscpy(szPath,tmpPath);
+
+ if (szPath[0] == _T('\0'))
+ {
+ ConOutPuts(szCurrent);
+ return 0;
+ }
+
+
+ /* change to full path if relative path was given */
+ GetFullPathName(szPath,MAX_PATH,szFinalPath,NULL);
+
+ if(szFinalPath[_tcslen(szFinalPath) - 1] == _T('\\') && _tcslen(szFinalPath) > 3)
+ szFinalPath[_tcslen(szFinalPath) - 1] = _T('\0');
+
+ /* Handle Root Directory Alone*/
+ if (_tcslen(szFinalPath) == 3 && szFinalPath[1] == _T(':'))
+ {
+ if(!SetRootPath(szFinalPath))
+ {
+ /* Change prompt if it is one the same drive or /D */
+ if(bChangeDrive || !_tcsncicmp(szFinalPath,szCurrent,1))
+ SetCurrentDirectory(szFinalPath);
+ return 0;
+ }
+ /* Didnt find an directories */
+ LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg);
+ nErrorLevel = 1;
+ return 1;
+
+ }
+
+ /* Get a list of all the files */
+ hFile = FindFirstFile (szFinalPath, &f);
+
+ do
+ {
+ if(hFile == INVALID_HANDLE_VALUE)
+ {
+ ConErrFormatMessage (GetLastError(), szFinalPath);
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ /* Strip the paths back to the folder they are in */
+ for(i = (_tcslen(szFinalPath) - 1); i > -1; i--)
+ if(szFinalPath[i] != _T('\\'))
+ szFinalPath[i] = _T('\0');
+ else
+ break;
+
+ _tcscat(szFinalPath,f.cFileName);
+
+ if ((f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
+ {
+ if(!SetRootPath(szFinalPath))
+ {
+ /* Change for /D */
+ if(bChangeDrive)
+ {
+ _tcsupr(szFinalPath);
+ GetPathCase(szFinalPath, szPath);
+ SetCurrentDirectory(szPath);
+ }
+ return 0;
+ }
+
+ }
+ }while(FindNextFile (hFile, &f));
+
+ /* Didnt find an directories */
+ LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg);
+ nErrorLevel = 1;
+ return 1;
+}
+
+#endif
+
+
+
+#ifdef INCLUDE_CMD_MKDIR
+
+/* Helper funtion for mkdir to make directories in a path.
+Dont use the api to decrease depence on libs */
+BOOL
+MakeFullPath(TCHAR * DirPath)
+{
+ TCHAR path[MAX_PATH];
+ TCHAR *p = DirPath;
+ INT n;
+
+ if (p[0] && p[1] == _T(':'))
+ p += 2;
+ while (*p == _T('\\'))
+ p++; /* skip drive root */
+ while ((p = _tcschr(p, _T('\\'))) != NULL)
+ {
+ n = p - DirPath + 1;
+ memcpy(path, DirPath, n);
+ path[n] = _T('\0');
+ if( !CreateDirectory(path, NULL) &&
+ (GetLastError() != ERROR_ALREADY_EXISTS))
+ return FALSE;
+ p++;
+ }
+ if (GetLastError() == ERROR_ALREADY_EXISTS)
+ SetLastError(ERROR_SUCCESS);
+
+ return TRUE;
+}
+
+/*
+ * MD / MKDIR
+ *
+ */
+INT cmd_mkdir (LPTSTR cmd, LPTSTR param)
+{
+ LPTSTR dir; /* pointer to the directory to change to */
+ LPTSTR place; /* used to search for the \ when no space is used */
+ LPTSTR *p = NULL;
+ INT argc;
+ nErrorLevel = 0;
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_MKDIR_HELP);
+ return 0;
+ }
+
+
+ /* check if there is no space between the command and the path */
+ if (param[0] == _T('\0'))
+ {
+ /* search for the \ or . so that both short & long names will work */
+ for (place = cmd; *place; place++)
+ if (*place == _T('.') || *place == _T('\\'))
+ break;
+
+ if (*place)
+ dir = place;
+ else
+ /* signal that there are no parameters */
+ dir = NULL;
+ }
+ else
+ {
+ p = split (param, &argc, FALSE);
+ if (argc > 1)
+ {
+ /*JPP 20-Jul-1998 use standard error message */
+ error_too_many_parameters (param);
+ freep (p);
+ return 1;
+ }
+ else
+ dir = p[0];
+ }
+
+ if (!dir)
+ {
+ ConErrResPuts (STRING_ERROR_REQ_PARAM_MISSING);
+ nErrorLevel = 1;
+ if(p != NULL)
+ freep (p);
+ return 1;
+ }
+
+ /* Add a \ at the end of the path is there isnt on already */
+ if (dir[_tcslen (dir) - 1] != _T('\\'))
+ _tcscat(dir,_T("\\"));
+
+ if (!MakeFullPath(dir))
+ {
+ if(GetLastError() == ERROR_PATH_NOT_FOUND)
+ {
+ ConErrResPuts(STRING_MD_ERROR2);
+ }
+ else
+ {
+ ErrorMessage (GetLastError(), _T("MD"));
+ }
+ nErrorLevel = 1;
+ freep (p);
+ return 1;
+ }
+
+ freep (p);
+
+ return 0;
+}
+#endif
+
+
+#ifdef INCLUDE_CMD_RMDIR
+/*
+ * RD / RMDIR
+ *
+ */
+BOOL DeleteFolder(LPTSTR FileName)
+{
+ TCHAR Base[MAX_PATH];
+ TCHAR TempFileName[MAX_PATH];
+ HANDLE hFile;
+ WIN32_FIND_DATA f;
+ _tcscpy(Base,FileName);
+ _tcscat(Base,_T("\\*"));
+ hFile = FindFirstFile(Base, &f);
+ Base[_tcslen(Base) - 1] = _T('\0');
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ if (!_tcscmp(f.cFileName, _T(".")) ||
+ !_tcscmp(f.cFileName, _T("..")))
+ continue;
+ _tcscpy(TempFileName,Base);
+ _tcscat(TempFileName,f.cFileName);
+
+ if(f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ DeleteFolder(TempFileName);
+ else
+ {
+ SetFileAttributes(TempFileName,FILE_ATTRIBUTE_NORMAL);
+ if(!DeleteFile(TempFileName))
+ return 0;
+ }
+
+ }while (FindNextFile (hFile, &f));
+ FindClose (hFile);
+ }
+ return RemoveDirectory(FileName);
+}
+INT cmd_rmdir (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR dir[MAX_PATH]; /* pointer to the directory to change to */
+ char ch;
+ INT args;
+ LPTSTR *arg = NULL;
+ INT i;
+ BOOL RD_SUB = FALSE;
+ BOOL RD_QUIET = FALSE;
+ HANDLE hFile;
+ WIN32_FIND_DATA f;
+ INT res;
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR szFullPath[MAX_PATH];
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_RMDIR_HELP);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ arg = split (param, &args, FALSE);
+
+ if (args == 0)
+ {
+ /* only command given */
+ error_req_param_missing ();
+ freep (arg);
+ return 1;
+ }
+
+ dir[0] = 0;
+ /* check for options anywhere in command line */
+ for (i = 0; i < args; i++)
+ {
+ if (*arg[i] == _T('/'))
+ {
+ /*found a command, but check to make sure it has something after it*/
+ if (_tcslen (arg[i]) == 2)
+ {
+ ch = _totupper (arg[i][1]);
+ if (ch == _T('S'))
+ {
+ RD_SUB = TRUE;
+ }
+ else if (ch == _T('Q'))
+ {
+ RD_QUIET = TRUE;
+ }
+ }
+ }
+ else
+ {
+ /* get the folder name */
+ _tcscpy(dir,arg[i]);
+ }
+ }
+
+ if (dir[0] == _T('\0'))
+ {
+ /* No folder to remove */
+ ConErrResPuts(STRING_ERROR_REQ_PARAM_MISSING);
+ freep(arg);
+ return 1;
+ }
+
+ GetFullPathName(dir,MAX_PATH,szFullPath,NULL);
+ /* remove trailing \ if any, but ONLY if dir is not the root dir */
+ if (_tcslen (szFullPath) >= 2 && szFullPath[_tcslen (szFullPath) - 1] == _T('\\'))
+ szFullPath[_tcslen(szFullPath) - 1] = _T('\0');
+
+ if(RD_SUB)
+ {
+ /* ask if they want to delete evrything in the folder */
+ if (!RD_QUIET)
+ {
+ LoadString( CMD_ModuleHandle, STRING_DEL_HELP2, szMsg, RC_STRING_MAX_SIZE);
+ res = FilePromptYNA (szMsg);
+ if ((res == PROMPT_NO) || (res == PROMPT_BREAK))
+ {
+ freep(arg);
+ nErrorLevel = 1;
+ return 1;
+ }
+ }
+
+ }
+ else
+ {
+ /* check for files in the folder */
+ _tcscat(szFullPath,_T("\\*"));
+
+ hFile = FindFirstFile(szFullPath, &f);
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ if (!_tcscmp(f.cFileName,_T(".")) ||
+ !_tcscmp(f.cFileName,_T("..")))
+ continue;
+ ConOutResPuts(STRING_RMDIR_HELP2);
+ freep(arg);
+ FindClose (hFile);
+ nErrorLevel = 1;
+ return 1;
+ }while (FindNextFile (hFile, &f));
+ FindClose (hFile);
+ }
+ /* reovme the \\* */
+ szFullPath[_tcslen(szFullPath) - 2] = _T('\0');
+ }
+
+ if (!DeleteFolder(szFullPath))
+ {
+ /* Couldnt delete the folder, clean up and print out the error */
+ ErrorMessage (GetLastError(), _T("RD"));
+ freep (arg);
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ freep (arg);
+ return 0;
+}
+#endif
+
+
+/*
+ * set the exitflag to true
+ *
+ */
+INT CommandExit (LPTSTR cmd, LPTSTR param)
+{
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_EXIT_HELP);
+ /* Just make sure */
+ bExit = FALSE;
+ /* Dont exit */
+ return 0;
+ }
+
+ if (bc != NULL && _tcsnicmp(param,_T("/b"),2) == 0)
+ {
+ param += 2;
+ while (_istspace (*param))
+ param++;
+ if (_istdigit(*param))
+ nErrorLevel = _ttoi(param);
+ ExitBatch (NULL);
+ }
+
+ else
+ bExit = TRUE;
+
+
+ return 0;
+
+}
+
+#ifdef INCLUDE_CMD_REM
+/*
+ * does nothing
+ *
+ */
+INT CommandRem (LPTSTR cmd, LPTSTR param)
+{
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_REM_HELP);
+ }
+
+ return 0;
+}
+#endif /* INCLUDE_CMD_REM */
+
+
+INT CommandShowCommands (LPTSTR cmd, LPTSTR param)
+{
+ PrintCommandList ();
+ return 0;
+}
+
+INT CommandShowCommandsDetail (LPTSTR cmd, LPTSTR param)
+{
+ PrintCommandListDetail ();
+ return 0;
+}
+
+/* EOF */
--- /dev/null
+/*
+ * LABEL.C - label internal command.
+ *
+ *
+ * History:
+ *
+ * 10-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Started.
+ *
+ * 11-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Finished.
+ *
+ * 19-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode ready!
+ *
+ * 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_LABEL
+
+
+INT cmd_label (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR szRootPath[] = _T("A:\\");
+ TCHAR szLabel[80];
+ TCHAR szOldLabel[80];
+ DWORD dwSerialNr;
+ LPTSTR *arg;
+ INT args;
+
+ /* set empty label string */
+ szLabel[0] = _T('\0');
+
+ /* print help */
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_LABEL_HELP1);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ /* get parameters */
+ arg = split (param, &args, FALSE);
+
+ if (args > 2)
+ {
+ /* too many parameters */
+ error_too_many_parameters (arg[args - 1]);
+ freep (arg);
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ if (args == 0)
+ {
+ /* get label of current drive */
+ TCHAR szCurPath[MAX_PATH];
+ GetCurrentDirectory (MAX_PATH, szCurPath);
+ szRootPath[0] = szCurPath[0];
+ }
+ else
+ {
+ if ((_tcslen (arg[0]) >= 2) && (arg[0][1] == _T(':')))
+ {
+ szRootPath[0] = toupper (*arg[0]);
+ if (args == 2)
+ _tcsncpy (szLabel, arg[1], 12);
+ }
+ else
+ {
+ TCHAR szCurPath[MAX_PATH];
+ GetCurrentDirectory (MAX_PATH, szCurPath);
+ szRootPath[0] = szCurPath[0];
+ _tcsncpy (szLabel, arg[0], 12);
+ }
+ }
+
+ /* check root path */
+ if (!IsValidPathName (szRootPath))
+ {
+ error_invalid_drive ();
+ freep (arg);
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ GetVolumeInformation(szRootPath, szOldLabel, 80, &dwSerialNr,
+ NULL, NULL, NULL, 0);
+
+ /* print drive info */
+ if (szOldLabel[0] != _T('\0'))
+ {
+ LoadString(CMD_ModuleHandle, STRING_LABEL_HELP2, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, _totupper(szRootPath[0]), szOldLabel);
+ }
+ else
+ {
+ LoadString(CMD_ModuleHandle, STRING_LABEL_HELP3, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, _totupper(szRootPath[0]));
+ }
+
+ /* print the volume serial number */
+ LoadString(CMD_ModuleHandle, STRING_LABEL_HELP4, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, HIWORD(dwSerialNr), LOWORD(dwSerialNr));
+
+ if (szLabel[0] == _T('\0'))
+ {
+ LoadString(CMD_ModuleHandle, STRING_LABEL_HELP5, szMsg, RC_STRING_MAX_SIZE);
+ ConOutResPuts(STRING_LABEL_HELP5);
+
+ ConInString(szLabel, 80);
+ }
+
+ SetVolumeLabel(szRootPath, szLabel);
+
+ freep(arg);
+
+ return 0;
+}
+
+#endif /* INCLUDE_CMD_LABEL */
+
+/* EOF */
--- /dev/null
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+\f
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+
--- /dev/null
+/*
+ * LOCALE.C - locale handling.
+ *
+ *
+ * History:
+ *
+ * 09-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Started.
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode safe!
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+TCHAR cDateSeparator;
+TCHAR cTimeSeparator;
+TCHAR cThousandSeparator;
+TCHAR cDecimalSeparator;
+INT nDateFormat;
+INT nTimeFormat;
+INT nNumberGroups;
+
+
+VOID InitLocale (VOID)
+{
+ TCHAR szBuffer[256];
+
+ /* date settings */
+ GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDATE, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
+ cDateSeparator = szBuffer[0];
+ GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_IDATE | LOCALE_RETURN_NUMBER, (LPTSTR)&nDateFormat, sizeof(nDateFormat) / sizeof(TCHAR));
+
+ /* time settings */
+ GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STIME, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
+ cTimeSeparator = szBuffer[0];
+ GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITIME | LOCALE_RETURN_NUMBER, (LPTSTR)&nTimeFormat, sizeof(nTimeFormat) / sizeof(TCHAR));
+
+ /* number settings */
+ GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
+ cThousandSeparator = szBuffer[0];
+ GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
+ cDecimalSeparator = szBuffer[0];
+ GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SGROUPING, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
+ nNumberGroups = _ttoi(szBuffer);
+#if 0
+ /* days of week */
+ for (i = 0; i < 7; i++)
+ {
+ GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SABBREVDAYNAME1 + i, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
+ _tcscpy (aszDayNames[(i+1)%7], szBuffer); /* little hack */
+ }
+#endif
+}
+
+
+VOID PrintDate (VOID)
+{
+ TCHAR szDateDay[32];
+ TCHAR szDate[32];
+
+ GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, _T("ddd"), szDateDay, sizeof (szDateDay));
+
+ GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL,szDate, sizeof (szDate));
+ ConOutPrintf(_T("%s %s"),szDateDay, szDate);
+}
+
+
+VOID PrintTime (VOID)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ SYSTEMTIME t;
+ GetLocalTime(&t);
+
+ LoadString(CMD_ModuleHandle, STRING_LOCALE_HELP1, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(_T("%s: %02d%c%02d%c%02d%c%02d\n"), szMsg, t.wHour, cTimeSeparator,
+ t.wMinute , cTimeSeparator,
+ t.wSecond , cDecimalSeparator, t.wMilliseconds );
+}
--- /dev/null
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef _UNICODE
+extern int _main (void);
+#else
+extern int _main (int argc, char *argv[]);
+#endif
+
+/*
+ * main function
+ */
+#ifdef _UNICODE
+int main(void)
+#else
+int main (int argc, char *argv[])
+#endif
+{
+#ifdef _UNICODE
+ return _main();
+#else
+ return _main(argc, argv);
+#endif
+}
+
+/* EOF */
--- /dev/null
+/*
+ * MEMORY.C - internal command.
+ *
+ *
+ * History:
+ *
+ * 01-Sep-1999 (Eric Kohl)
+ * Started.
+ *
+ * 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_MEMORY
+
+
+/*
+ * convert
+ *
+ * insert commas into a number
+ */
+static INT
+ConvertDWord (DWORD num, LPTSTR des, INT len, BOOL bSeparator)
+{
+ TCHAR temp[32];
+ INT c = 0;
+ INT n = 0;
+
+ if (num == 0)
+ {
+ des[0] = _T('0');
+ des[1] = _T('\0');
+ n = 1;
+ }
+ else
+ {
+ temp[31] = 0;
+ while (num > 0)
+ {
+ if (bSeparator && (((c + 1) % (nNumberGroups + 1)) == 0))
+ temp[30 - c++] = cThousandSeparator;
+ temp[30 - c++] = (TCHAR)(num % 10) + _T('0');
+ num /= 10;
+ }
+
+ for (n = 0; n <= c; n++)
+ des[n] = temp[31 - c + n];
+ }
+
+ return n;
+}
+
+
+INT CommandMemory (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ MEMORYSTATUS ms;
+ TCHAR szMemoryLoad[20];
+ TCHAR szTotalPhys[20];
+ TCHAR szAvailPhys[20];
+ TCHAR szTotalPageFile[20];
+ TCHAR szAvailPageFile[20];
+ TCHAR szTotalVirtual[20];
+ TCHAR szAvailVirtual[20];
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_MEMMORY_HELP1);
+ return 0;
+ }
+
+ ms.dwLength = sizeof(MEMORYSTATUS);
+
+ GlobalMemoryStatus (&ms);
+
+ ConvertDWord (ms.dwMemoryLoad, szMemoryLoad, 20, FALSE);
+ ConvertDWord (ms.dwTotalPhys, szTotalPhys, 20, TRUE);
+ ConvertDWord (ms.dwAvailPhys, szAvailPhys, 20, TRUE);
+ ConvertDWord (ms.dwTotalPageFile, szTotalPageFile, 20, TRUE);
+ ConvertDWord (ms.dwAvailPageFile, szAvailPageFile, 20, TRUE);
+ ConvertDWord (ms.dwTotalVirtual, szTotalVirtual, 20, TRUE);
+ ConvertDWord (ms.dwAvailVirtual, szAvailVirtual, 20, TRUE);
+
+ LoadString(CMD_ModuleHandle, STRING_MEMMORY_HELP2, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg,
+ szMemoryLoad, szTotalPhys, szAvailPhys, szTotalPageFile,
+ szAvailPageFile, szTotalVirtual, szAvailVirtual);
+
+ return 0;
+}
+
+#endif /* INCLUDE_CMD_MEMORY */
+
+/* EOF */
--- /dev/null
+/*
+ * MISC.C - misc. functions.
+ *
+ *
+ * History:
+ *
+ * 07/12/98 (Rob Lake)
+ * started
+ *
+ * 07/13/98 (Rob Lake)
+ * moved functions in here
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 18-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Changed split() to accept quoted arguments.
+ * Removed parse_firstarg().
+ *
+ * 23-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed an ugly bug in split(). In rare cases (last character
+ * of the string is a space) it ignored the NULL character and
+ * tried to add the following to the argument list.
+ *
+ * 28-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * FileGetString() seems to be working now.
+ *
+ * 06-Nov-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added PagePrompt() and FilePrompt().
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+/*
+ * get a character out-of-band and honor Ctrl-Break characters
+ */
+TCHAR cgetchar (VOID)
+{
+ HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
+ INPUT_RECORD irBuffer;
+ DWORD dwRead;
+/*
+ do
+ {
+ ReadConsoleInput (hInput, &irBuffer, 1, &dwRead);
+ if ((irBuffer.EventType == KEY_EVENT) &&
+ (irBuffer.Event.KeyEvent.bKeyDown == TRUE))
+ {
+ if ((irBuffer.Event.KeyEvent.dwControlKeyState &
+ (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) &
+ (irBuffer.Event.KeyEvent.wVirtualKeyCode == 'C'))
+ bCtrlBreak = TRUE;
+
+ break;
+ }
+ }
+ while (TRUE);
+*/
+ do
+ {
+ ReadConsoleInput (hInput, &irBuffer, 1, &dwRead);
+
+ if (irBuffer.EventType == KEY_EVENT)
+ {
+ if (irBuffer.Event.KeyEvent.dwControlKeyState &
+ (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))
+ {
+ if (irBuffer.Event.KeyEvent.wVirtualKeyCode == 'C')
+ {
+// if (irBuffer.Event.KeyEvent.bKeyDown == TRUE)
+// {
+ bCtrlBreak = TRUE;
+ break;
+// }
+ }
+ }
+ else if ((irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) ||
+ (irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_MENU) ||
+ (irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL))
+ {
+ ;
+ }
+
+ else
+ {
+ break;
+ }
+ }
+ }
+ while (TRUE);
+
+#ifndef _UNICODE
+ return irBuffer.Event.KeyEvent.uChar.AsciiChar;
+#else
+ return irBuffer.Event.KeyEvent.uChar.UnicodeChar;
+#endif /* _UNICODE */
+}
+
+/*
+ * Takes a path in and returns it with the correct case of the letters
+ */
+VOID GetPathCase( TCHAR * Path, TCHAR * OutPath)
+{
+ INT i = 0;
+ TCHAR TempPath[MAX_PATH];
+ WIN32_FIND_DATA FindFileData;
+ HANDLE hFind;
+ _tcscpy(TempPath, _T(""));
+ _tcscpy(OutPath, _T(""));
+
+
+ for(i = 0; i < _tcslen(Path); i++)
+ {
+ if(Path[i] != _T('\\'))
+ {
+ _tcsncat(TempPath, &Path[i], 1);
+ if(i != _tcslen(Path) - 1)
+ continue;
+ }
+ /* Handle the base part of the path different.
+ Because if you put it into findfirstfile, it will
+ return your current folder */
+ if(_tcslen(TempPath) == 2 && TempPath[1] == _T(':'))
+ {
+ _tcscat(OutPath, TempPath);
+ _tcscat(OutPath, _T("\\"));
+ _tcscat(TempPath, _T("\\"));
+ }
+ else
+ {
+ hFind = FindFirstFile(TempPath,&FindFileData);
+ if(hFind == INVALID_HANDLE_VALUE)
+ {
+ _tcscpy(OutPath, Path);
+ return;
+ }
+ _tcscat(TempPath, _T("\\"));
+ _tcscat(OutPath, FindFileData.cFileName);
+ _tcscat(OutPath, _T("\\"));
+ CloseHandle(hFind);
+ }
+ }
+}
+
+/*
+ * Check if Ctrl-Break was pressed during the last calls
+ */
+
+BOOL CheckCtrlBreak (INT mode)
+{
+ static BOOL bLeaveAll = FALSE; /* leave all batch files */
+ TCHAR c;
+
+ switch (mode)
+ {
+ case BREAK_OUTOFBATCH:
+ bLeaveAll = 0;
+ return FALSE;
+
+ case BREAK_BATCHFILE:
+ if (bLeaveAll)
+ return TRUE;
+
+ if (!bCtrlBreak)
+ return FALSE;
+
+ /* we need to be sure the string arrives on the screen! */
+ do
+ ConOutPuts (_T("\r\nCtrl-Break pressed. Cancel batch file? (Yes/No/All) "));
+ while (!_tcschr (_T("YNA\3"), c = _totupper (cgetchar())) || !c);
+
+ ConOutPuts (_T("\r\n"));
+
+ if (c == _T('N'))
+ return bCtrlBreak = FALSE; /* ignore */
+
+ /* leave all batch files */
+ bLeaveAll = ((c == _T('A')) || (c == _T('\3')));
+ break;
+
+ case BREAK_INPUT:
+ if (!bCtrlBreak)
+ return FALSE;
+ break;
+ }
+
+ /* state processed */
+ bCtrlBreak = FALSE;
+ return TRUE;
+}
+
+/* add new entry for new argument */
+BOOL add_entry (LPINT ac, LPTSTR **arg, LPCTSTR entry)
+{
+ LPTSTR q;
+ LPTSTR *oldarg;
+
+ q = malloc ((_tcslen(entry) + 1) * sizeof (TCHAR));
+ if (NULL == q)
+ {
+ return FALSE;
+ }
+ _tcscpy (q, entry);
+
+ oldarg = *arg;
+ *arg = realloc (oldarg, (*ac + 2) * sizeof (LPTSTR));
+ if (NULL == *arg)
+ {
+ *arg = oldarg;
+ return FALSE;
+ }
+
+ /* save new entry */
+ (*arg)[*ac] = q;
+ (*arg)[++(*ac)] = NULL;
+
+ return TRUE;
+}
+
+static BOOL expand (LPINT ac, LPTSTR **arg, LPCTSTR pattern)
+{
+ HANDLE hFind;
+ WIN32_FIND_DATA FindData;
+ BOOL ok;
+ LPCTSTR pathend;
+ LPTSTR dirpart, fullname;
+
+ pathend = _tcsrchr (pattern, _T('\\'));
+ if (NULL != pathend)
+ {
+ dirpart = malloc((pathend - pattern + 2) * sizeof(TCHAR));
+ if (NULL == dirpart)
+ {
+ return FALSE;
+ }
+ memcpy(dirpart, pattern, pathend - pattern + 1);
+ dirpart[pathend - pattern + 1] = _T('\0');
+ }
+ else
+ {
+ dirpart = NULL;
+ }
+ hFind = FindFirstFile (pattern, &FindData);
+ if (INVALID_HANDLE_VALUE != hFind)
+ {
+ do
+ {
+ if (NULL != dirpart)
+ {
+ fullname = malloc((_tcslen(dirpart) + _tcslen(FindData.cFileName) + 1) * sizeof(TCHAR));
+ if (NULL == fullname)
+ {
+ ok = FALSE;
+ }
+ else
+ {
+ _tcscat (_tcscpy (fullname, dirpart), FindData.cFileName);
+ ok = add_entry(ac, arg, fullname);
+ free (fullname);
+ }
+ }
+ else
+ {
+ ok = add_entry(ac, arg, FindData.cFileName);
+ }
+ } while (FindNextFile (hFind, &FindData) && ok);
+ FindClose (hFind);
+ }
+ else
+ {
+ ok = add_entry(ac, arg, pattern);
+ }
+
+ if (NULL != dirpart)
+ {
+ free (dirpart);
+ }
+
+ return ok;
+}
+
+/*
+ * split - splits a line up into separate arguments, deliminators
+ * are spaces and slashes ('/').
+ */
+
+LPTSTR *split (LPTSTR s, LPINT args, BOOL expand_wildcards)
+{
+ LPTSTR *arg;
+ LPTSTR start;
+ LPTSTR q;
+ INT ac;
+ INT len;
+ BOOL bQuoted = FALSE;
+
+ arg = malloc (sizeof (LPTSTR));
+ if (!arg)
+ return NULL;
+ *arg = NULL;
+
+ ac = 0;
+ while (*s)
+ {
+ /* skip leading spaces */
+ while (*s && (_istspace (*s) || _istcntrl (*s)))
+ ++s;
+
+ /* if quote (") then set bQuoted */
+ if (*s == _T('\"'))
+ {
+ ++s;
+ bQuoted = TRUE;
+ }
+
+ start = s;
+
+ /* the first character can be '/' */
+ if (*s == _T('/'))
+ ++s;
+
+ /* skip to next word delimiter or start of next option */
+ if (bQuoted)
+ {
+ while (_istprint (*s) && (*s != _T('\"')) && (*s != _T('/')))
+ ++s;
+ }
+ else
+ {
+ while (_istprint (*s) && !_istspace (*s) && (*s != _T('/')))
+ ++s;
+ }
+
+ /* a word was found */
+ if (s != start)
+ {
+ q = malloc (((len = s - start) + 1) * sizeof (TCHAR));
+ if (!q)
+ {
+ return NULL;
+ }
+ memcpy (q, start, len * sizeof (TCHAR));
+ q[len] = _T('\0');
+ if (expand_wildcards && _T('/') != *start &&
+ (NULL != _tcschr(q, _T('*')) || NULL != _tcschr(q, _T('?'))))
+ {
+ if (! expand(&ac, &arg, q))
+ {
+ free (q);
+ freep (arg);
+ return NULL;
+ }
+ }
+ else
+ {
+ if (! add_entry(&ac, &arg, q))
+ {
+ free (q);
+ freep (arg);
+ return NULL;
+ }
+ }
+ free (q);
+ }
+
+ /* adjust string pointer if quoted (") */
+ if (bQuoted)
+ {
+ /* Check to make sure if there is no ending "
+ * we dont run over the null char */
+ if(*s == _T('\0'))
+ {
+ break;
+ }
+ ++s;
+ bQuoted = FALSE;
+ }
+ }
+
+ *args = ac;
+
+ return arg;
+}
+
+
+/*
+ * freep -- frees memory used for a call to split
+ *
+ */
+VOID freep (LPTSTR *p)
+{
+ LPTSTR *q;
+
+ if (!p)
+ return;
+
+ q = p;
+ while (*q)
+ free(*q++);
+
+ free(p);
+}
+
+
+LPTSTR _stpcpy (LPTSTR dest, LPCTSTR src)
+{
+ _tcscpy (dest, src);
+ return (dest + _tcslen (src));
+}
+
+
+
+/*
+ * Checks if a path is valid (accessible)
+ */
+
+BOOL IsValidPathName (LPCTSTR pszPath)
+{
+ TCHAR szOldPath[MAX_PATH];
+ BOOL bResult;
+
+ GetCurrentDirectory (MAX_PATH, szOldPath);
+ bResult = SetCurrentDirectory (pszPath);
+
+ SetCurrentDirectory (szOldPath);
+
+ return bResult;
+}
+
+
+/*
+ * Checks if a file exists (accessible)
+ */
+
+BOOL IsExistingFile (LPCTSTR pszPath)
+{
+ DWORD attr = GetFileAttributes (pszPath);
+ return (attr != 0xFFFFFFFF && (! (attr & FILE_ATTRIBUTE_DIRECTORY)) );
+}
+
+
+BOOL IsExistingDirectory (LPCTSTR pszPath)
+{
+ DWORD attr = GetFileAttributes (pszPath);
+ return (attr != 0xFFFFFFFF && (attr & FILE_ATTRIBUTE_DIRECTORY) );
+}
+
+
+BOOL FileGetString (HANDLE hFile, LPTSTR lpBuffer, INT nBufferLength)
+{
+ LPSTR lpString;
+ CHAR ch;
+ DWORD dwRead;
+ INT len;
+#ifdef _UNICODE
+ lpString = malloc(nBufferLength);
+#else
+ lpString = lpBuffer;
+#endif
+ len = 0;
+ while ((--nBufferLength > 0) &&
+ ReadFile(hFile, &ch, 1, &dwRead, NULL) && dwRead)
+ {
+ lpString[len++] = ch;
+ if ((ch == _T('\n')) || (ch == _T('\r')))
+ {
+ /* break at new line*/
+ break;
+ }
+ }
+
+ if (!dwRead && !len)
+ return FALSE;
+
+ lpString[len++] = _T('\0');
+#ifdef _UNICODE
+ MultiByteToWideChar(CP_ACP, 0, lpString, len, lpBuffer, len);
+ free(lpString);
+#endif
+ return TRUE;
+}
+
+INT PagePrompt (VOID)
+{
+ INPUT_RECORD ir;
+
+ ConOutResPuts(STRING_MISC_HELP1);
+
+ RemoveBreakHandler ();
+ ConInDisable ();
+
+ do
+ {
+ ConInKey (&ir);
+ }
+ while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) ||
+ (ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) ||
+ (ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL));
+
+ AddBreakHandler ();
+ ConInEnable ();
+
+ if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) ||
+ ((ir.Event.KeyEvent.wVirtualKeyCode == _T('C')) &&
+ (ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))))
+ {
+ bCtrlBreak = TRUE;
+ return PROMPT_BREAK;
+ }
+
+ return PROMPT_YES;
+}
+
+
+INT FilePromptYN (LPTSTR szFormat, ...)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR szOut[512];
+ va_list arg_ptr;
+// TCHAR cKey = 0;
+// LPTSTR szKeys = _T("yna");
+
+ TCHAR szIn[10];
+ LPTSTR p;
+
+ va_start (arg_ptr, szFormat);
+ _vstprintf (szOut, szFormat, arg_ptr);
+ va_end (arg_ptr);
+
+ ConOutPrintf (szFormat);
+
+ /* preliminary fix */
+ ConInString (szIn, 10);
+ ConOutPrintf (_T("\n"));
+
+ _tcsupr (szIn);
+ for (p = szIn; _istspace (*p); p++)
+ ;
+
+ LoadString(CMD_ModuleHandle, STRING_CHOICE_OPTION, szMsg, RC_STRING_MAX_SIZE);
+
+ if (_tcsncmp(p, &szMsg[0], 1) == 0)
+ return PROMPT_YES;
+ else if (_tcsncmp(p, &szMsg[1], 1) == 0)
+ return PROMPT_NO;
+#if 0
+ else if (*p == _T('\03'))
+ return PROMPT_BREAK;
+#endif
+
+ return PROMPT_NO;
+
+
+ /* unfinished sollution */
+#if 0
+ RemoveBreakHandler ();
+ ConInDisable ();
+
+ do
+ {
+ ConInKey (&ir);
+ cKey = _totlower (ir.Event.KeyEvent.uChar.AsciiChar);
+ if (_tcschr (szKeys, cKey[0]) == NULL)
+ cKey = 0;
+
+
+ }
+ while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) ||
+ (ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) ||
+ (ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL));
+
+ AddBreakHandler ();
+ ConInEnable ();
+
+ if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) ||
+ ((ir.Event.KeyEvent.wVirtualKeyCode == 'C') &&
+ (ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))))
+ return PROMPT_BREAK;
+
+ return PROMPT_YES;
+#endif
+}
+
+
+INT FilePromptYNA (LPTSTR szFormat, ...)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR szOut[512];
+ va_list arg_ptr;
+// TCHAR cKey = 0;
+// LPTSTR szKeys = _T("yna");
+
+ TCHAR szIn[10];
+ LPTSTR p;
+
+ va_start (arg_ptr, szFormat);
+ _vstprintf (szOut, szFormat, arg_ptr);
+ va_end (arg_ptr);
+
+ ConOutPrintf (szFormat);
+
+ /* preliminary fix */
+ ConInString (szIn, 10);
+ ConOutPrintf (_T("\n"));
+
+ _tcsupr (szIn);
+ for (p = szIn; _istspace (*p); p++)
+ ;
+
+ LoadString( CMD_ModuleHandle, STRING_COPY_OPTION, szMsg, RC_STRING_MAX_SIZE);
+
+ if (_tcsncmp(p, &szMsg[0], 1) == 0)
+ return PROMPT_YES;
+ else if (_tcsncmp(p, &szMsg[1], 1) == 0)
+ return PROMPT_NO;
+ else if (_tcsncmp(p, &szMsg[2], 1) == 0)
+ return PROMPT_ALL;
+
+#if 0
+ else if (*p == _T('\03'))
+ return PROMPT_BREAK;
+#endif
+
+ return PROMPT_NO;
+
+
+/* unfinished sollution */
+#if 0
+ RemoveBreakHandler ();
+ ConInDisable ();
+
+ do
+ {
+ ConInKey (&ir);
+ cKey = _totlower (ir.Event.KeyEvent.uChar.AsciiChar);
+ if (_tcschr (szKeys, cKey[0]) == NULL)
+ cKey = 0;
+ }
+ while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) ||
+ (ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) ||
+ (ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL));
+
+ AddBreakHandler ();
+ ConInEnable ();
+
+ if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) ||
+ ((ir.Event.KeyEvent.wVirtualKeyCode == _T('C')) &&
+ (ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))))
+ return PROMPT_BREAK;
+
+ return PROMPT_YES;
+#endif
+}
+
+/* EOF */
--- /dev/null
+/*
+* MOVE.C - move internal command.
+*
+*
+* History:
+*
+* 14-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+* Started.
+*
+* 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+* Unicode safe!
+* Preliminary version!!!
+*
+* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+* Redirection safe!
+*
+* 27-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+* Added help text ("/?").
+* Added more error checks.
+*
+* 03-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+* Added "/N" option.
+*
+* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+* Remove all hardcode string to En.rc
+*
+* 24-Jun-2005 (Brandon Turner) <turnerb7@msu.edu>)
+* Fixed bug to allow MS style wildcards + code clean up
+* added /y and /-y
+*/
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_MOVE
+
+enum
+{
+ MOVE_NOTHING = 0x001, /* /N */
+ MOVE_OVER_YES = 0x002, /* /Y */
+ MOVE_OVER_NO = 0x004, /* /-Y */
+};
+
+enum
+{ /* Move status flags */
+ MOVE_SOURCE_IS_DIR = 0x001,
+ MOVE_SOURCE_IS_FILE = 0x002,
+ MOVE_DEST_IS_DIR = 0x004,
+ MOVE_DEST_IS_FILE = 0x008,
+ MOVE_SOURCE_HAS_WILD = 0x010, /* source has wildcard */
+ MOVE_SRC_CURRENT_IS_DIR = 0x020, /* source is file but at the current round we found a directory */
+ MOVE_DEST_EXISTS = 0x040,
+ MOVE_PATHS_ON_DIF_VOL = 0x080 /* source and destination paths are on different volume */
+};
+
+static INT MoveOverwrite (LPTSTR fn)
+{
+ /*ask the user if they want to override*/
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ INT res;
+ LoadString(CMD_ModuleHandle, STRING_MOVE_HELP1, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg,fn);
+ res = FilePromptYNA (_T(""));
+ return res;
+}
+
+void GetDirectory (LPTSTR wholepath, LPTSTR directory, BOOL CheckExisting)
+{
+ /* returns only directory part of path with backslash */
+ /* TODO: make code unc aware */
+ /* Is there a better alternative to this? */
+ LPTSTR last;
+ if (CheckExisting && IsExistingDirectory(wholepath))
+ {
+ _tcscpy(directory, wholepath);
+ }
+ else if ((last = _tcsrchr(wholepath,_T('\\'))) != NULL)
+ {
+ _tcsncpy(directory, wholepath, last - wholepath + 1);
+ directory[last - wholepath + 1] = 0;
+ }
+ else
+ {
+ GetRootPath(wholepath,directory, MAX_PATH);
+ }
+}
+
+
+INT cmd_move (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ LPTSTR *arg;
+ INT argc, i, nFiles;
+ TCHAR szDestPath[MAX_PATH];
+ TCHAR szFullDestPath[MAX_PATH];
+ TCHAR szSrcDirPath[MAX_PATH];
+ TCHAR szSrcPath[MAX_PATH];
+ TCHAR szFullSrcPath[MAX_PATH];
+ DWORD dwFlags = 0;
+ INT nOverwrite = 0;
+ WIN32_FIND_DATA findBuffer;
+ HANDLE hFile;
+
+ /* used only when source and destination directories are on different volume*/
+ HANDLE hDestFile;
+ WIN32_FIND_DATA findDestBuffer;
+ TCHAR szMoveDest[MAX_PATH];
+ TCHAR szMoveSrc[MAX_PATH];
+ LPTSTR pszDestDirPointer;
+ LPTSTR pszSrcDirPointer;
+ INT nDirLevel = 0;
+
+ LPTSTR pszFile;
+ BOOL OnlyOneFile;
+ BOOL FoundFile;
+ BOOL MoveStatus;
+ DWORD dwMoveFlags = 0;
+ DWORD dwMoveStatusFlags = 0;
+
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+#if 0
+ ConOutPuts (_T("Moves files and renames files and directories.\n\n"
+ "To move one or more files:\n"
+ "MOVE [/N][/Y|/-Y][drive:][path]filename1[,...] destination\n"
+ "\n"
+ "To rename a directory:\n"
+ "MOVE [/N][/Y|/-Y][drive:][path]dirname1 dirname2\n"
+ "\n"
+ " [drive:][path]filename1 Specifies the location and name of the file\n"
+ " or files you want to move.\n"
+ " /N Nothing. Don everthing but move files or direcories.\n"
+ " /Y\n"
+ " /-Y\n"
+ "..."));
+#else
+ ConOutResPaging(TRUE,STRING_MOVE_HELP2);
+#endif
+ return 0;
+ }
+
+ nErrorLevel = 0;
+ arg = split (param, &argc, FALSE);
+ nFiles = argc;
+
+ /* read options */
+ for (i = 0; i < argc; i++)
+ {
+ if (*arg[i] == _T('/'))
+ {
+ if (_tcslen(arg[i]) >= 2)
+ {
+ switch (_totupper(arg[i][1]))
+ {
+ case _T('N'):
+ dwFlags |= MOVE_NOTHING;
+ break;
+
+ case _T('Y'):
+ dwFlags |= MOVE_OVER_YES;
+ break;
+
+ case _T('-'):
+ dwFlags |= MOVE_OVER_NO;
+ break;
+ }
+ }
+ nFiles--;
+ }
+ }
+
+ if (nFiles < 2)
+ {
+ /* there must be at least two pathspecs */
+ error_req_param_missing ();
+ return 1;
+ }
+
+ /* check for wildcards in source and destination */
+ if (_tcschr (arg[argc - 1], _T('*')) != NULL || _tcschr (arg[argc - 1], _T('?')) != NULL)
+ {
+ /* '*'/'?' in dest, this doesnt happen. give folder name instead*/
+ error_invalid_parameter_format(arg[argc - 1]);
+ return 1;
+ }
+ if (_tcschr (arg[argc - 2], _T('*')) != NULL || _tcschr (arg[argc - 2], _T('?')) != NULL)
+ {
+ dwMoveStatusFlags |= MOVE_SOURCE_HAS_WILD;
+ }
+
+
+ /* get destination */
+ GetFullPathName (arg[argc - 1], MAX_PATH, szDestPath, NULL);
+#ifdef _DEBUG
+ DebugPrintf (_T("Destination: %s\n"), szDestPath);
+#endif
+
+ /* get source folder */
+ GetDirectory(arg[argc - 2], szSrcDirPath, 1);
+ GetFullPathName(szSrcDirPath, MAX_PATH, szSrcPath, &pszFile);
+ _tcscpy(szSrcDirPath,szSrcPath);
+ /* we need following check to see if source happens to be directly given directory
+ and if it is then rip off last directory part so that there won't be any clashes with codes after this point */
+ GetFullPathName(arg[argc - 2], MAX_PATH, szSrcPath, &pszFile);
+ if (_tcscmp(szSrcDirPath,szSrcPath) == 0)
+ szSrcDirPath[pszFile - szSrcPath] = _T('\0');
+#ifdef _DEBUG
+ DebugPrintf (_T("Source Folder: %s\n"), szSrcDirPath);
+#endif
+
+ hFile = FindFirstFile (arg[argc - 2], &findBuffer);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ ErrorMessage (GetLastError (), arg[argc - 2]);
+ freep (arg);
+ return 1;
+
+ }
+
+ /* check for special cases "." and ".." and if found skip them */
+ FoundFile = TRUE;
+ while(FoundFile &&
+ (_tcscmp(findBuffer.cFileName,_T(".")) == 0 ||
+ _tcscmp(findBuffer.cFileName,_T("..")) == 0))
+ FoundFile = FindNextFile (hFile, &findBuffer);
+
+ if (!FoundFile)
+ {
+ /* what? we don't have anything to move? */
+ error_file_not_found();
+ FindClose(hFile);
+ freep(arg);
+ return 1;
+ }
+
+ OnlyOneFile = TRUE;
+ _tcscpy(szSrcPath,szSrcDirPath);
+ /*check to see if there is an ending slash, if not add one*/
+ if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\'))
+ _tcscat (szSrcPath, _T("\\"));
+ _tcscat(szSrcPath,findBuffer.cFileName);
+#ifdef _DEBUG
+ DebugPrintf (_T("Source Path: %s\n"), szSrcPath);
+#endif
+ /* check if there can be found files as files have first priority */
+ if (IsExistingFile(szSrcPath)) dwMoveStatusFlags |= MOVE_SOURCE_IS_FILE;
+ else dwMoveStatusFlags |= MOVE_SOURCE_IS_DIR;
+ while(OnlyOneFile && FindNextFile(hFile,&findBuffer))
+ {
+ _tcscpy(szSrcPath,szSrcDirPath);
+ if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\'))
+ _tcscat (szSrcPath, _T("\\"));
+ _tcscat(szSrcPath,findBuffer.cFileName);
+ if (IsExistingFile(szSrcPath))
+ {
+ ConOutPrintf(_T(""));
+ if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) OnlyOneFile = FALSE;
+ else
+ { /* this has been done this way so that we don't disturb other settings if they have been set before this */
+ dwMoveStatusFlags |= MOVE_SOURCE_IS_FILE;
+ dwMoveStatusFlags &= ~MOVE_SOURCE_IS_DIR;
+ }
+ }
+ }
+ FindClose(hFile);
+
+#ifdef _DEBUG
+ DebugPrintf(_T("Do we have only one file: %s\n"), OnlyOneFile ? _T("TRUE") : _T("FALSE"));
+#endif
+
+ /* we have to start again to be sure we don't miss any files or folders*/
+ hFile = FindFirstFile (arg[argc - 2], &findBuffer);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ ErrorMessage (GetLastError (), arg[argc - 2]);
+ freep (arg);
+ return 1;
+
+ }
+
+ /* check for special cases "." and ".." and if found skip them */
+ FoundFile = TRUE;
+ while(FoundFile &&
+ (_tcscmp(findBuffer.cFileName,_T(".")) == 0 ||
+ _tcscmp(findBuffer.cFileName,_T("..")) == 0))
+ FoundFile = FindNextFile (hFile, &findBuffer);
+
+ if (!FoundFile)
+ {
+ /* huh? somebody removed files and/or folders which were there */
+ error_file_not_found();
+ FindClose(hFile);
+ freep(arg);
+ return 1;
+ }
+
+ /* check if source and destination paths are on different volumes */
+ if (szSrcPath[0] != szDestPath[0])
+ dwMoveStatusFlags |= MOVE_PATHS_ON_DIF_VOL;
+
+ /* move it */
+ do
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("Found file/directory: %s\n"), findBuffer.cFileName);
+#endif
+ nOverwrite = 1;
+ dwMoveFlags = 0;
+ dwMoveStatusFlags &= ~MOVE_DEST_IS_FILE &
+ ~MOVE_DEST_IS_DIR &
+ ~MOVE_SRC_CURRENT_IS_DIR &
+ ~MOVE_DEST_EXISTS;
+ _tcscpy(szFullSrcPath,szSrcDirPath);
+ if(szFullSrcPath[_tcslen(szFullSrcPath) - 1] != _T('\\'))
+ _tcscat (szFullSrcPath, _T("\\"));
+ _tcscat(szFullSrcPath,findBuffer.cFileName);
+ _tcscpy(szSrcPath, szFullSrcPath);
+
+ if (IsExistingDirectory(szSrcPath))
+ {
+ /* source is directory */
+
+ if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE)
+ {
+ dwMoveStatusFlags |= MOVE_SRC_CURRENT_IS_DIR; /* source is file but at the current round we found a directory */
+ continue;
+ }
+#ifdef _DEBUG
+ DebugPrintf (_T("Source is dir: %s\n"), szSrcPath);
+#endif
+ dwMoveFlags = MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
+ }
+
+ /* if source is file we don't need to do anything special */
+
+ if (IsExistingDirectory(szDestPath))
+ {
+ /* destination is existing directory */
+#ifdef _DEBUG
+ DebugPrintf (_T("Destination is directory: %s\n"), szDestPath);
+#endif
+
+ dwMoveStatusFlags |= MOVE_DEST_IS_DIR;
+
+ /*build the dest string(accounts for *)*/
+ _tcscpy (szFullDestPath, szDestPath);
+ /*check to see if there is an ending slash, if not add one*/
+ if(szFullDestPath[_tcslen(szFullDestPath) - 1] != _T('\\'))
+ _tcscat (szFullDestPath, _T("\\"));
+ _tcscat (szFullDestPath, findBuffer.cFileName);
+
+ if (IsExistingFile(szFullDestPath) || IsExistingDirectory(szFullDestPath))
+ dwMoveStatusFlags |= MOVE_DEST_EXISTS;
+
+ dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
+
+ }
+ if (IsExistingFile(szDestPath))
+ {
+ /* destination is a file */
+#ifdef _DEBUG
+ DebugPrintf (_T("Destination is file: %s\n"), szDestPath);
+#endif
+
+ dwMoveStatusFlags |= MOVE_DEST_IS_FILE | MOVE_DEST_EXISTS;
+ _tcscpy (szFullDestPath, szDestPath);
+
+ dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
+
+ }
+
+#ifdef _DEBUG
+ DebugPrintf(_T("Move Status Flags: 0x%X\n"),dwMoveStatusFlags);
+#endif
+
+ if (dwMoveStatusFlags & MOVE_SOURCE_IS_DIR &&
+ dwMoveStatusFlags & MOVE_DEST_IS_DIR &&
+ dwMoveStatusFlags & MOVE_SOURCE_HAS_WILD)
+ {
+ /* We are not allowed to have existing source and destination dir when there is wildcard in source */
+ error_syntax(NULL);
+ FindClose(hFile);
+ freep(arg);
+ return 1;
+ }
+
+ if (!(dwMoveStatusFlags & (MOVE_DEST_IS_FILE | MOVE_DEST_IS_DIR)))
+ {
+ /* destination doesn't exist */
+ _tcscpy (szFullDestPath, szDestPath);
+ if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) dwMoveStatusFlags |= MOVE_DEST_IS_FILE;
+ if (dwMoveStatusFlags & MOVE_SOURCE_IS_DIR) dwMoveStatusFlags |= MOVE_DEST_IS_DIR;
+
+ dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
+ }
+
+ if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE &&
+ dwMoveStatusFlags & MOVE_DEST_IS_FILE &&
+ !OnlyOneFile)
+ {
+ /*source has many files but there is only one destination file*/
+ error_invalid_parameter_format(arg[argc - 1]);
+ FindClose(hFile);
+ freep (arg);
+ return 1;
+ }
+
+ /*checks to make sure user wanted/wants the override*/
+ if((dwFlags & MOVE_OVER_NO) &&
+ (dwMoveStatusFlags & MOVE_DEST_EXISTS))
+ continue;
+ if(!(dwFlags & MOVE_OVER_YES) &&
+ (dwMoveStatusFlags & MOVE_DEST_EXISTS))
+ nOverwrite = MoveOverwrite (szFullDestPath);
+ if (nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK)
+ continue;
+ if (nOverwrite == PROMPT_ALL)
+ dwFlags |= MOVE_OVER_YES;
+
+
+ ConOutPrintf (_T("%s => %s "), szSrcPath, szFullDestPath);
+
+ /* are we really supposed to do something */
+ if (dwFlags & MOVE_NOTHING)
+ continue;
+
+ /*move the file*/
+ if (!(dwMoveStatusFlags & MOVE_SOURCE_IS_DIR &&
+ dwMoveStatusFlags & MOVE_PATHS_ON_DIF_VOL))
+ /* we aren't moving source folder to different drive */
+ MoveStatus = MoveFileEx (szSrcPath, szFullDestPath, dwMoveFlags);
+ else
+ { /* we are moving source folder to different drive */
+ _tcscpy(szMoveDest, szFullDestPath);
+ _tcscpy(szMoveSrc, szSrcPath);
+ DeleteFile(szMoveDest);
+ MoveStatus = CreateDirectory(szMoveDest, NULL); /* we use default security settings */
+ if (MoveStatus)
+ {
+ _tcscat(szMoveDest,_T("\\"));
+ _tcscat(szMoveSrc,_T("\\"));
+ nDirLevel = 0;
+ pszDestDirPointer = szMoveDest + _tcslen(szMoveDest);
+ pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc);
+ _tcscpy(pszSrcDirPointer,_T("*.*"));
+ hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer);
+ if (hDestFile == INVALID_HANDLE_VALUE)
+ MoveStatus = FALSE;
+ else
+ {
+ BOOL FirstTime = TRUE;
+ FoundFile = TRUE;
+ MoveStatus = FALSE;
+ while(FoundFile)
+ {
+ if (FirstTime)
+ FirstTime = FALSE;
+ else
+ FoundFile = FindNextFile (hDestFile, &findDestBuffer);
+
+ if (!FoundFile)
+ { /* Nothing to do in this folder so we stop working on it */
+ FindClose(hDestFile);
+ (pszSrcDirPointer)--;
+ (pszDestDirPointer)--;
+ _tcscpy(pszSrcDirPointer,_T(""));
+ _tcscpy(pszDestDirPointer,_T(""));
+ if (nDirLevel > 0)
+ {
+ TCHAR szTempPath[MAX_PATH];
+ INT nDiff;
+
+ FoundFile = TRUE; /* we need to continue our seek for files */
+ nDirLevel--;
+ RemoveDirectory(szMoveSrc);
+ GetDirectory(szMoveSrc,szTempPath,0);
+ nDiff = _tcslen(szMoveSrc) - _tcslen(szTempPath);
+ pszSrcDirPointer = pszSrcDirPointer - nDiff;
+ _tcscpy(pszSrcDirPointer,_T(""));
+ GetDirectory(szMoveDest,szTempPath,0);
+ nDiff = _tcslen(szMoveDest) - _tcslen(szTempPath);
+ pszDestDirPointer = pszDestDirPointer - nDiff;
+ _tcscpy(pszDestDirPointer,_T(""));
+ if(szMoveSrc[_tcslen(szMoveSrc) - 1] != _T('\\'))
+ _tcscat (szMoveSrc, _T("\\"));
+ if(szMoveDest[_tcslen(szMoveDest) - 1] != _T('\\'))
+ _tcscat (szMoveDest, _T("\\"));
+ pszDestDirPointer = szMoveDest + _tcslen(szMoveDest);
+ pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc);
+ _tcscpy(pszSrcDirPointer,_T("*.*"));
+ hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer);
+ if (hDestFile == INVALID_HANDLE_VALUE)
+ continue;
+ FirstTime = TRUE;
+ }
+ else
+ {
+ MoveStatus = TRUE; /* we moved everything so lets tell user about it */
+ RemoveDirectory(szMoveSrc);
+ }
+ continue;
+ }
+
+ /* if we find "." or ".." we'll skip them */
+ if (_tcscmp(findDestBuffer.cFileName,_T(".")) == 0 ||
+ _tcscmp(findDestBuffer.cFileName,_T("..")) == 0)
+ continue;
+
+ _tcscpy(pszSrcDirPointer, findDestBuffer.cFileName);
+ _tcscpy(pszDestDirPointer, findDestBuffer.cFileName);
+ if (IsExistingFile(szMoveSrc))
+ {
+ FoundFile = CopyFile(szMoveSrc, szMoveDest, FALSE);
+ if (!FoundFile) continue;
+ DeleteFile(szMoveSrc);
+ }
+ else
+ {
+ FindClose(hDestFile);
+ CreateDirectory(szMoveDest, NULL);
+ _tcscat(szMoveDest,_T("\\"));
+ _tcscat(szMoveSrc,_T("\\"));
+ nDirLevel++;
+ pszDestDirPointer = szMoveDest + _tcslen(szMoveDest);
+ pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc);
+ _tcscpy(pszSrcDirPointer,_T("*.*"));
+ hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer);
+ if (hDestFile == INVALID_HANDLE_VALUE)
+ {
+ FoundFile = FALSE;
+ continue;
+ }
+ FirstTime = TRUE;
+ }
+ }
+ }
+ }
+ }
+ if (MoveStatus)
+ LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ else
+ LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE);
+
+ ConOutPrintf(szMsg);
+ }
+ while ((!OnlyOneFile || dwMoveStatusFlags & MOVE_SRC_CURRENT_IS_DIR ) &&
+ !(dwMoveStatusFlags & MOVE_SOURCE_IS_DIR) &&
+ FindNextFile (hFile, &findBuffer));
+ FindClose (hFile);
+
+ freep (arg);
+ return 0;
+}
+
+#endif /* INCLUDE_CMD_MOVE */
--- /dev/null
+/*
+ * MSGBOX.C - msgbox internal command.
+ *
+ * clone from 4nt msgbox command
+ *
+ * 25 Aug 1999
+ * started - Paolo Pantaleo <paolopan@freemail.it>
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_MSGBOX
+
+
+#define U_TYPE_INIT 0
+
+//undefine it to allow to omit arguments
+//that will be replaced by default ones
+#define _SYNTAX_CHECK
+
+
+INT CommandMsgbox (LPTSTR cmd, LPTSTR param)
+{
+
+ //used to parse command line
+ LPTSTR tmp;
+
+ //used to find window title (used as messagebox title)
+ //and to find window handle to pass to MessageBox
+ HWND hWnd;
+ TCHAR buff[128];
+
+ //these are MessabeBox() parameters
+ LPTSTR title, prompt = "";
+ UINT uType = U_TYPE_INIT;
+
+ /* set default title to window title */
+ GetConsoleTitle(buff, 128);
+ title = buff;
+
+ if (_tcsncmp (param, _T("/?"), 2) == 0)
+ {
+ ConOutResPaging(TRUE,STRING_MSGBOX_HELP);
+ return 0;
+ }
+
+ //yes here things are quite massed up :)
+
+ //skip spaces
+ while(_istspace(*param))
+ param++;
+
+ //search for type of messagebox (ok, okcancel, ...)
+ if (_tcsnicmp(param, _T("ok "), 3) == 0)
+ {
+ uType |= MB_ICONEXCLAMATION | MB_OK;
+ param += 3;
+ }
+ else if (_tcsnicmp(param, _T("okcancel "), 9) == 0)
+ {
+ uType |= MB_ICONQUESTION | MB_OKCANCEL;
+ param += 9;
+ }
+ else if (_tcsnicmp(param, _T("yesno "), 6) == 0)
+ {
+ uType |= MB_ICONQUESTION | MB_YESNO;
+ param += 6;
+ }
+ else if (_tcsnicmp(param, _T("yesnocancel "), 12) == 0)
+ {
+ uType |= MB_ICONQUESTION | MB_YESNOCANCEL;
+ param += 12;
+ }
+ else
+ {
+#ifdef _SYNTAX_CHECK
+ error_req_param_missing ();
+ return 1;
+#else
+ uType |= MB_ICONEXCLAMATION | MB_OK;
+#endif
+ }
+
+
+ //skip spaces
+ while(_istspace(*param))
+ param++;
+
+#ifdef _SYNTAX_CHECK
+ //if reached end of string
+ //it is an error becuase we do not yet have prompt
+ if (*param == 0)
+ {
+ error_req_param_missing ();
+ return 1;
+ }
+#endif
+
+ //search for "title"
+ tmp = param;
+
+ if (*param == '"')
+ {
+ tmp = _tcschr(param + 1, '"');
+ if (tmp)
+ {
+ *tmp = 0;
+ title = param + 1;
+ tmp++;
+ param = tmp;
+ }
+ }
+
+ //skip spaces
+ while(_istspace(*param))
+ param++;
+
+#ifdef _SYNTAX_CHECK
+ //get prompt
+ if (*param == 0)
+ {
+ error_req_param_missing ();
+ return 1;
+ }
+#endif
+
+ prompt = param;
+
+ hWnd=GetConsoleWindow ();
+// DebugPrintf("FindWindow hWnd = %d\n",hWnd);
+// ConErrPrintf("FindWindow hWnd = %d\n",hWnd);
+
+ switch (MessageBox(hWnd, prompt, title, uType))
+ {
+ case IDYES:
+ case IDOK:
+ nErrorLevel = 10;
+ break;
+
+ case IDNO:
+ nErrorLevel = 11;
+ break;
+
+ case IDCANCEL:
+ nErrorLevel = 12;
+ break;
+ }
+
+ return 0;
+}
+
+#endif /* INCLUDE_CMD_MSGBOX */
+
+/* EOF */
--- /dev/null
+/*
+ * PATH.C - path internal command.
+ *
+ *
+ * History:
+ *
+ * 17 Jul 1998 (John P Price)
+ * Separated commands into individual files.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("/?").
+ *
+ * 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode ready!
+ *
+ * 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Redirection safe!
+ *
+ * 24-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed Win32 environment handling.
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_PATH
+
+/* size of environment variable buffer */
+#define ENV_BUFFER_SIZE 1024
+
+
+INT cmd_path (LPTSTR cmd, LPTSTR param)
+{
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_PATH_HELP1);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ /* if param is empty, display the PATH environment variable */
+ if (!param || !*param)
+ {
+ DWORD dwBuffer;
+ LPTSTR pszBuffer;
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+ pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
+ dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE);
+ if (dwBuffer == 0)
+ {
+ LoadString(CMD_ModuleHandle, STRING_VOL_HELP2, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, _T("PATH"));
+ return 0;
+ }
+ else if (dwBuffer > ENV_BUFFER_SIZE)
+ {
+ pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR));
+ GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE);
+ }
+
+ ConOutPrintf (_T("PATH=%s\n"), pszBuffer);
+ free (pszBuffer);
+
+ return 0;
+ }
+
+ /* skip leading '=' */
+ if (*param == _T('='))
+ param++;
+
+ /* set PATH environment variable */
+ if (!SetEnvironmentVariable (_T("PATH"), param))
+ {
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ return 0;
+}
+
+#endif
+
+/* EOF */
--- /dev/null
+/*
+ * PAUSE.C - pause internal command.
+ *
+ *
+ * History:
+ *
+ * 16 Jul 1998 (Hans B Pufal)
+ * started.
+ *
+ * 16 Jul 1998 (John P Price)
+ * Seperated commands into individual files.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode ready!
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_PAUSE
+
+/*
+ * Perform PAUSE command.
+ *
+ * FREEDOS extension : If parameter is specified use that as the pause
+ * message.
+ *
+ * ?? Extend to include functionality of CHOICE if switch chars
+ * specified.
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+INT cmd_pause (LPTSTR cmd, LPTSTR param)
+{
+
+#ifdef _DEBUG
+ DebugPrintf (_T("cmd_pause: \'%s\' : \'%s\')\n"), cmd, param);
+#endif
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_PAUSE_HELP1);
+ return 0;
+ }
+
+ if (*param)
+ ConOutPrintf (param);
+ else
+ msg_pause ();
+
+ cgetchar ();
+
+ return 0;
+}
+
+#endif
+
+/* EOF */
--- /dev/null
+#ifdef _MSC_VER
+#pragma warning ( disable : 4103 ) /* use #pragma pack to change alignment */
+#undef _CRT_SECURE_NO_DEPRECATE
+#define _CRT_SECURE_NO_DEPRECATE
+#endif//_MSC_VER
+
+#include <stdlib.h>
+#define WIN32_NO_STATUS
+#include <windows.h>
+#include <winnt.h>
+#include <shellapi.h>
+
+#include <tchar.h>
+#include <direct.h>
+
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <math.h>
+#include <time.h>
+
+#define NTOS_MODE_USER
+#include <ndk/ntndk.h>
+
+#include "cmd.h"
+#include "config.h"
+#include "batch.h"
+
--- /dev/null
+/*
+ * PROMPT.C - prompt handling.
+ *
+ *
+ * History:
+ *
+ * 14/01/95 (Tim Normal)
+ * started.
+ *
+ * 08/08/95 (Matt Rains)
+ * i have cleaned up the source code. changes now bring this source
+ * into guidelines for recommended programming practice.
+ *
+ * 01/06/96 (Tim Norman)
+ * added day of the week printing (oops, forgot about that!)
+ *
+ * 08/07/96 (Steffan Kaiser)
+ * small changes for speed
+ *
+ * 20-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * removed redundant day strings. Use ones defined in date.c.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 28-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * moved cmd_prompt from internal.c to here
+ *
+ * 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("/?").
+ *
+ * 14-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added "$+" option.
+ *
+ * 09-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added "$A", "$C" and "$F" option.
+ * Added locale support.
+ * Fixed "$V" option.
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection safe!
+ *
+ * 24-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed Win32 environment handling.
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+#include <precomp.h>
+#include "resource.h"
+
+/*
+ * print the command-line prompt
+ */
+VOID PrintPrompt(VOID)
+{
+ static TCHAR default_pr[] = _T("$P$G");
+ TCHAR szPrompt[256];
+ LPTSTR pr;
+
+ if (GetEnvironmentVariable (_T("PROMPT"), szPrompt, 256))
+ pr = szPrompt;
+ else
+ pr = default_pr;
+
+ while (*pr)
+ {
+ if (*pr != _T('$'))
+ {
+ ConOutChar (*pr);
+ }
+ else
+ {
+ pr++;
+
+ switch (_totupper (*pr))
+ {
+ case _T('A'):
+ ConOutChar (_T('&'));
+ break;
+
+ case _T('B'):
+ ConOutChar (_T('|'));
+ break;
+
+ case _T('C'):
+ ConOutChar (_T('('));
+ break;
+
+ case _T('D'):
+ PrintDate ();
+ break;
+
+ case _T('E'):
+ ConOutChar (_T('\x1B'));
+ break;
+
+ case _T('F'):
+ ConOutChar (_T(')'));
+ break;
+
+ case _T('G'):
+ ConOutChar (_T('>'));
+ break;
+
+ case _T('H'):
+ ConOutChar (_T('\x08'));
+ ConOutChar (_T(' '));
+ ConOutChar (_T('\x08'));
+ break;
+
+ case _T('L'):
+ ConOutChar (_T('<'));
+ break;
+
+ case _T('N'):
+ {
+ TCHAR szPath[MAX_PATH];
+ GetCurrentDirectory (MAX_PATH, szPath);
+ ConOutChar (szPath[0]);
+ }
+ break;
+
+ case _T('P'):
+ {
+ TCHAR szPath[MAX_PATH];
+ GetCurrentDirectory (MAX_PATH, szPath);
+ ConOutPrintf (_T("%s"), szPath);
+ }
+ break;
+
+ case _T('Q'):
+ ConOutChar (_T('='));
+ break;
+
+ case _T('S'):
+ ConOutChar (_T(' '));
+ break;
+
+ case _T('T'):
+ {
+ SYSTEMTIME t;
+ GetSystemTime(&t);
+ ConOutPrintf(_T("%02d%c%02d%c%02d%c%02d\n"),t.wHour, cTimeSeparator,t.wMinute , cTimeSeparator,
+ t.wSecond , cDecimalSeparator, t.wMilliseconds );
+ }
+ break;
+
+ case _T('V'):
+ switch (osvi.dwPlatformId)
+ {
+ case VER_PLATFORM_WIN32_WINDOWS:
+ if (osvi.dwMajorVersion == 4 &&
+ osvi.dwMinorVersion == 1)
+ ConOutPrintf (_T("Windows 98"));
+ else
+ ConOutPrintf (_T("Windows 95"));
+ break;
+
+
+ case VER_PLATFORM_WIN32_NT:
+ ConOutPrintf (_T("Windows NT Version %lu.%lu"),
+ osvi.dwMajorVersion, osvi.dwMinorVersion);
+ break;
+ }
+ break;
+
+ case _T('_'):
+ ConOutChar (_T('\n'));
+ break;
+
+ case '$':
+ ConOutChar (_T('$'));
+ break;
+
+#ifdef FEATURE_DIRECTORY_STACK
+ case '+':
+ {
+ INT i;
+ for (i = 0; i < GetDirectoryStackDepth (); i++)
+ ConOutChar (_T('+'));
+ }
+ break;
+#endif
+ }
+ }
+ pr++;
+ }
+}
+
+
+#ifdef INCLUDE_CMD_PROMPT
+
+INT cmd_prompt (LPTSTR cmd, LPTSTR param)
+{
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_PROMPT_HELP1);
+
+#ifdef FEATURE_DIRECTORY_STACK
+ ConOutResPaging(FALSE,STRING_PROMPT_HELP2);
+#endif
+ ConOutResPaging(FALSE,STRING_PROMPT_HELP3);
+ return 0;
+ }
+
+ /* if it is null, then it needs to set to default,
+ because that means the user entered "prompt" only.
+ so even if param is null you _must_ still set prompt
+ to the default. There seems to be some kinda difference
+ between winxp and 2k in this matter and this way will
+ cover both. Do not use fixed size of szParam for param the buffer are 8192bytes
+ and will later change to dymatic buffer */
+
+ /* set PROMPT environment variable */
+ if (param[0] != _T('\0'))
+ {
+ if (!SetEnvironmentVariable (_T("PROMPT"), param))
+ return 1;
+ }
+ else
+ {
+ TCHAR szParam[5];
+ _tcscpy(szParam,_T("$P$G"));
+ if (!SetEnvironmentVariable (_T("PROMPT"),szParam))
+ return 1;
+ }
+
+
+
+ return 0;
+}
+#endif
+
+/* EOF */
--- /dev/null
+ReactOS command line interpreter CMD
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The ReactOS command line interpreter CMD is derived from FreeCOM, the
+FreeDOS command line interpreter.
+
+We are shooting mainly to be just like 2000/XP cmd.exe. They are very close and only a small number(none that i can recall off the top of my head, so maybe 0) differences have been found between those two. It has been reported that ROS cmd.exe does not work on nt4 because of a missing api. I'm hoping to fix this at some point.
+
+
+Compiling
+~~~~~~~~~
+ROS cmd used to depend on __REACTOS__ to provide two different ways to build cmd. There is still code left in it for this but... The __REACTOS__ = 0 has not been develped, maintained. And therefore it does not even compile anymore. __REACTOS__ = 1 works fine on both windows(nt). and someday i plan to remove all the __REACTOS__ = 0.
+
+Using rbuild you can compile cmd seperatly by "make cmd_install". Also you can compile cmd using MSVC 6 and soon 7/8 hopefully.
+
+
+Current Features
+~~~~~~~~~~~~~~~~
+ - environment handling with prompt and path support.
+ - directory utilities.
+ - command-line history with doskey-like features.
+ - batch file processing.
+ - input/output redirection and piping.
+ - alias support.
+ - filename completion (use TAB), both unix and windows style.
+
+
+Credits
+~~~~~~~
+FreeDOS developers:
+ normat@rpi.edu (Tim Norman)
+ mrains@apanix.apana.org.au (Matt Rains)
+ ejeffrey@iastate.edu (Evan Jeffrey)
+ Steffen.Kaiser@Informatik.TU-Chemnitz.DE (Steffen Kaiser)
+ Svante Frey (sfrey@kuai.se)
+ Oliver Mueller (ogmueller@t-online.de)
+ Aaron Kaufman (morgan@remarque.berkeley.edu)
+ Marc Desrochers (bitzero@hotmail.com)
+ Rob Lake (rlake@cs.mun.ca)
+ John P. Price <linux-guru@gcfl.net>
+ Hans B Pufal <hansp@digiweb.com>
+
+ReactOS developers:
+ Eric Kohl <ekohl@rz-online.de>
+ Emanuele Aliberti <ea@iol.it>
+ Paolo Pantaleo <paolopan@freemail.it>
+ Brandon Turner <turnerb7@msu.edu>
+
+
+
+Bugs
+~~~~
+There is still many bugs ;)
+Please report bugs to ReactOS team <ros-dev@reactos.org> or to bugzilla at www.reactos.org
+
--- /dev/null
+General Overview of How THings Work
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+First it comes into _main in cmd.c(1811). The command line params are taking in and if it is unicode it uses CommandLineToArgvW. This can cause a problem on older machines and that is why we have our own custom _CommandLineToArgvW to help this along. We pull in the launch directory as the inital dir and set that in _tchdir. We make a handle to the default console out using CreateFile.
+
+Then we call Initialize(). Here we need to load ntdll.dll if it isnt loaded(windows 9x machines). We also setup some gloabl vars like default io handles and nErrorLevel and set %prompt% to $P$G. This is where all command lines switches given to cmd on startup are done.
+
+From here main calls ProcessInput(). This is where cmd loops for getting input and doing the commands. First it checks to see if there is a batch file(note: there is agolbal struct "bc" which is NULL when not processing a batch file) and if there is it will pull a new line from that file. If not, thne it will wait for input. Currently there is some stuff for set /a in there, which might stay there or see if we can find a better spot.
+
+Once there is input taken in from the command line it is sent into ParseCommandLine(). In here we fist check for aliases and convert if need be. THen we look for redirections using GetRedirection() which will remove any redirection symbols. and pass back info about where to redirect. from this info it will do some switching around with the handles for where things go and send them as need be. personally i dont like this code and i tried to chnage it before but failed. it is confusing to me and i dont understand why a lot of it is there but apparently it is needed.
+
+It sends the new string without any redirection info into DoCommand(). In this function we just look to see what should be done. There is one of 2 things that could happen. 1) we fnd the matching command and send it off to that commands little section. 2) we dont find it so we send it to Execute() and see if it is a file that we can do something.
+
+Execute will try to launch the file using createprocess and falls back on shellexecute. It calls a function called SearchForExecuteable() to find the full path name and looks in all the correct locations like PATH, curreent folder, windows folder. If it cant find it, just fails and prints out a message.
+
+Some useful functions that are used a lot:
+split() - splits a string into an array of string on spaces that arent inside quotes. which you need to call freep() on later t clean up.
+IsValidPathName(), IsExistingFile(), IsExistingDirectory() - all do what you would expect.
+PagePrompt() - ask them to hit a key to continue
+FilePromptYN[A]() - ask them a yes or no question
--- /dev/null
+/*
+ * REDIR.C - redirection handling.
+ *
+ *
+ * History:
+ *
+ * 12/15/95 (Tim Norman)
+ * started.
+ *
+ * 12 Jul 98 (Hans B Pufal)
+ * Rewrote to make more efficient and to conform to new command.c
+ * and batch.c processing.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * Added config.h include
+ *
+ * 22-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode safe!
+ * Added new error redirection "2>" and "2>>".
+ *
+ * 26-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added new error AND output redirection "&>" and "&>>".
+ *
+ * 24-Jun-2005 (Brandon Turner <turnerb7@msu.edu>)
+ * simple check to fix > and | bug with 'rem'
+ */
+
+#include <precomp.h>
+
+#ifdef FEATURE_REDIRECTION
+
+
+static BOOL
+IsRedirection (TCHAR c)
+{
+ return (c == _T('<')) || (c == _T('>')) || (c == _T('|'));
+}
+
+
+/*
+ * Gets the redirection info from the command line and copies the
+ * file names into ifn, ofn and efn removing them from the command
+ * line.
+ *
+ * Converts remaining command line into a series of null terminated
+ * strings defined by the pipe char '|'. Each string corresponds
+ * to a single executable command. A double null terminates the
+ * command strings.
+ *
+ * Return number of command strings found.
+ *
+ */
+
+INT GetRedirection (LPTSTR s, LPTSTR ifn, LPTSTR ofn, LPTSTR efn, LPINT lpnFlags)
+{
+ INT num = 1;
+ LPTSTR dp = s;
+ LPTSTR sp = s;
+
+#ifdef INCLUDE_CMD_REM
+
+ TCHAR * line = s;
+
+
+ while (_istspace (*line))
+ line++;
+
+ /*first thing first. check to see if this is "rem" and hope out*/
+ if(!_tcsncmp (line, _T("rem "), 4))
+ {
+ lpnFlags = 0;
+ *ifn=('\0');
+ *ofn=('\0');
+ *efn=_T('\0');
+ return 1;
+ }
+#endif
+ /* find and remove all the redirections first */
+ while (*sp)
+ {
+ if (*sp == _T('^'))
+ {
+ *dp++ = *sp++;
+ *dp++ = *sp++;
+ continue;
+ }
+ if ((*sp == _T('"')) || (*sp == _T('\'')))
+ {
+ /* No redirects inside quotes */
+ TCHAR qc = *sp;
+
+ do
+ *dp++ = *sp++;
+ while (*sp && *sp != qc);
+
+ *dp++ = *sp++;
+ }
+ else if ((*sp == _T('<')) || (*sp == _T('>')) ||
+ (*sp == _T('1')) || (*sp == _T('2')) || (*sp == _T('&')))
+ {
+ /* MS-DOS ignores multiple redirection symbols and uses the last */
+ /* redirection, so we'll emulate that and not check */
+
+ if (*sp == _T('<'))
+ {
+ /* input redirection */
+ *lpnFlags |= INPUT_REDIRECTION;
+ do sp++;
+ while( _istspace (*sp) );
+
+ /* copy file name */
+ while (*sp && !IsRedirection (*sp) && !_istspace (*sp))
+ *ifn++ = *sp++;
+ *ifn = _T('\0');
+ }
+ else if (*sp == _T('>'))
+ {
+ /* output redirection */
+ *lpnFlags |= OUTPUT_REDIRECTION;
+ sp++;
+
+ /* append request ? */
+ if (*sp == _T('>'))
+ {
+ *lpnFlags |= OUTPUT_APPEND;
+ sp++;
+ }
+
+ while (_istspace (*sp))
+ sp++;
+
+ /* copy file name */
+ while (*sp && !IsRedirection (*sp) && !_istspace (*sp))
+ *ofn++ = *sp++;
+ *ofn = _T('\0');
+ }
+
+ else if (*sp == _T('1'))
+ {
+ /* output redirection */
+ sp++;
+
+ if (*sp == _T('>'))
+ {
+ /* output redirection */
+ *lpnFlags |= OUTPUT_REDIRECTION;
+ sp++;
+
+ /* append request ? */
+ if (*sp == _T('>'))
+ {
+ *lpnFlags |= OUTPUT_APPEND;
+ sp++;
+ }
+ }
+ else
+ {
+ /* no redirection!! copy the '1' character! */
+ sp--;
+ *dp++ = *sp++;
+ continue;
+ }
+
+ while (_istspace (*sp))
+ sp++;
+
+ /* copy file name */
+ while (*sp && !IsRedirection (*sp) && !_istspace (*sp))
+ *ofn++ = *sp++;
+ *ofn = _T('\0');
+ }
+
+ else if (*sp == _T('2'))
+ {
+ /* error redirection */
+ sp++;
+
+ if (*sp == _T('>'))
+ {
+ *lpnFlags |= ERROR_REDIRECTION;
+ sp++;
+
+ /* append request ? */
+ if (*sp == _T('>'))
+ {
+ *lpnFlags |= ERROR_APPEND;
+ sp++;
+ }
+ }
+ else
+ {
+ /* no redirection!! copy the '2' character! */
+ sp--;
+ *dp++ = *sp++;
+ continue;
+ }
+
+ while (_istspace (*sp))
+ sp++;
+
+ /* copy file name */
+ while (*sp && !IsRedirection (*sp) && !_istspace (*sp))
+ *efn++ = *sp++;
+ *efn = _T('\0');
+ }
+ else if (*sp == _T('&'))
+ {
+ /* output AND error redirection */
+ sp++;
+
+ if (*sp == _T('>'))
+ {
+ *lpnFlags |= (ERROR_REDIRECTION | OUTPUT_REDIRECTION);
+ sp++;
+
+ /* append request ? */
+ if (*sp == _T('>'))
+ {
+ *lpnFlags |= (ERROR_APPEND | OUTPUT_APPEND);
+ sp++;
+ }
+ }
+ else
+ {
+ /* no redirection!! copy the '&' character! */
+ sp--;
+ *dp++ = *sp++;
+ continue;
+ }
+
+ while (_istspace (*sp))
+ sp++;
+
+ /* copy file name */
+ while (*sp && !IsRedirection (*sp) && !_istspace (*sp))
+ *ofn++ = *efn++ = *sp++;
+ *ofn = *efn = _T('\0');
+ }
+ }
+ else
+ *dp++ = *sp++;
+ }
+
+ *dp++ = _T('\0');
+ *dp = _T('\0');
+
+ /* now go for the pipes */
+ sp = s;
+ while (*sp)
+ {
+ if (*sp == _T('^'))
+ {
+ sp++;
+ sp++;
+ continue;
+ }
+ else if ((*sp == _T('"')) || (*sp == _T('\'')))
+ {
+ TCHAR qc = *sp;
+
+ do
+ sp++;
+ while (*sp && *sp != qc);
+
+ sp++;
+ }
+ else if (*sp == _T('|'))
+ {
+ *sp++ = _T('\0');
+ num++;
+ }
+ else
+ sp++;
+ }
+
+ return num;
+}
+
+#endif /* FEATURE_REDIRECTION */
--- /dev/null
+/*
+ * REN.C - rename internal command.
+ *
+ *
+ * History:
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 18-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>
+ * Added support for quoted long file names with spaces.
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>
+ * Unicode and redirection safe!
+ *
+ * 17-Oct-2001 (Eric Kohl <ekohl@rz.online.de>
+ * Implemented basic rename code.
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_RENAME
+
+enum
+{
+ REN_ATTRIBUTES = 0x001, /* /A : not implemented */
+ REN_ERROR = 0x002, /* /E */
+ REN_NOTHING = 0x004, /* /N */
+ REN_PROMPT = 0x008, /* /P : not implemented */
+ REN_QUIET = 0x010, /* /Q */
+ REN_SUBDIR = 0x020, /* /S */
+ REN_TOTAL = 0x040, /* /T */
+};
+
+
+/*
+ * file rename internal command.
+ *
+ */
+INT cmd_rename (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ LPTSTR *arg = NULL;
+ INT args = 0;
+ INT nEvalArgs = 0; /* nunber of evaluated arguments */
+ DWORD dwFlags = 0;
+ DWORD dwFiles = 0; /* number of renamedd files */
+ INT i;
+ LPTSTR srcPattern = NULL;
+ LPTSTR dstPattern = NULL;
+ TCHAR dstFile[MAX_PATH];
+ BOOL bDstWildcard = FALSE;
+
+ LPTSTR p,q,r;
+
+ HANDLE hFile;
+ WIN32_FIND_DATA f;
+
+ if (!_tcsncmp(param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_REN_HELP1);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ /* split the argument list */
+ arg = split(param, &args, FALSE);
+
+ if (args < 2)
+ {
+ if (!(dwFlags & REN_ERROR))
+ error_req_param_missing();
+ freep(arg);
+ return 1;
+ }
+
+ /* read options */
+ for (i = 0; i < args; i++)
+ {
+ if (*arg[i] == _T('/'))
+ {
+ if (_tcslen(arg[i]) >= 2)
+ {
+ switch (_totupper(arg[i][1]))
+ {
+ case _T('E'):
+ dwFlags |= REN_ERROR;
+ break;
+
+ case _T('N'):
+ dwFlags |= REN_NOTHING;
+ break;
+
+ case _T('P'):
+ dwFlags |= REN_PROMPT;
+ break;
+
+ case _T('Q'):
+ dwFlags |= REN_QUIET;
+ break;
+
+ case _T('S'):
+ dwFlags |= REN_SUBDIR;
+ break;
+
+ case _T('T'):
+ dwFlags |= REN_TOTAL;
+ break;
+ }
+ }
+ nEvalArgs++;
+ }
+ }
+
+ /* keep quiet within batch files */
+ if (bc != NULL)
+ dwFlags |= REN_QUIET;
+
+ /* there are only options on the command line --> error!!! */
+ if (args < nEvalArgs + 2)
+ {
+ if (!(dwFlags & REN_ERROR))
+ error_req_param_missing();
+ freep(arg);
+ return 1;
+ }
+
+ /* get destination pattern */
+ for (i = 0; i < args; i++)
+ {
+ if (*arg[i] == _T('/'))
+ continue;
+ dstPattern = arg[i];
+ }
+
+ if (_tcschr(dstPattern, _T('*')) || _tcschr(dstPattern, _T('?')))
+ bDstWildcard = TRUE;
+
+ /* enumerate source patterns */
+ for (i = 0; i < args; i++)
+ {
+ if (*arg[i] == _T('/') || arg[i] == dstPattern)
+ continue;
+
+ srcPattern = arg[i];
+
+#ifdef _DEBUG
+ ConErrPrintf(_T("\n\nSourcePattern: %s\n"), srcPattern);
+ ConErrPrintf(_T("DestinationPattern: %s\n"), dstPattern);
+#endif
+
+ hFile = FindFirstFile(srcPattern, &f);
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ if (!(dwFlags & REN_ERROR))
+ error_file_not_found();
+ continue;
+ }
+
+ do
+ {
+ /* ignore "." and ".." */
+ if (!_tcscmp (f.cFileName, _T(".")) ||
+ !_tcscmp (f.cFileName, _T("..")))
+ continue;
+
+ /* do not rename hidden or system files */
+ if (f.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM))
+ continue;
+
+ /* do not rename directories when the destination pattern contains
+ * wildcards, unless option /S is used */
+ if ((f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ && bDstWildcard
+ && !(dwFlags & REN_SUBDIR))
+ continue;
+
+#ifdef _DEBUG
+ ConErrPrintf(_T("Found source name: %s\n"), f.cFileName);
+#endif
+
+ /* build destination file name */
+ p = f.cFileName;
+ q = dstPattern;
+ r = dstFile;
+ while(*q != 0)
+ {
+ if (*q == '*')
+ {
+ q++;
+ while (*p != 0 && *p != *q)
+ {
+ *r = *p;
+ p++;
+ r++;
+ }
+ }
+ else if (*q == '?')
+ {
+ q++;
+ if (*p != 0)
+ {
+ *r = *p;
+ p++;
+ r++;
+ }
+ }
+ else
+ {
+ *r = *q;
+ if (*p != 0)
+ p++;
+ q++;
+ r++;
+ }
+ }
+ *r = 0;
+
+#ifdef _DEBUG
+ ConErrPrintf(_T("DestinationFile: %s\n"), dstFile);
+#endif
+
+ if (!(dwFlags & REN_QUIET) && !(dwFlags & REN_TOTAL))
+ ConOutPrintf(_T("%s -> %s\n"), f.cFileName, dstFile);
+
+ /* rename the file */
+ if (!(dwFlags & REN_NOTHING))
+ {
+ if (MoveFile(f.cFileName, dstFile))
+ {
+ dwFiles++;
+ }
+ else
+ {
+ if (!(dwFlags & REN_ERROR))
+ {
+ LoadString(CMD_ModuleHandle, STRING_REN_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, GetLastError());
+ }
+ }
+ }
+ }
+ while (FindNextFile(hFile, &f));
+ FindClose(hFile);
+ }
+
+ if (!(dwFlags & REN_QUIET))
+ {
+ if (dwFiles == 1)
+ LoadString( CMD_ModuleHandle, STRING_REN_HELP2, szMsg, RC_STRING_MAX_SIZE);
+ else
+ LoadString( CMD_ModuleHandle, STRING_REN_HELP3, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg,dwFiles);
+ }
+
+ freep(arg);
+
+ return 0;
+}
+
+#endif
+
+/* EOF */
--- /dev/null
+
+
+#define RC_STRING_MAX_SIZE 3072
+
+
+#define STRING_ERROR_PARAMETERF_ERROR 100
+#define STRING_ERROR_INVALID_SWITCH 101
+#define STRING_ERROR_TOO_MANY_PARAMETERS 102
+#define STRING_ERROR_PATH_NOT_FOUND 103
+#define STRING_ERROR_FILE_NOT_FOUND 104
+#define STRING_ERROR_REQ_PARAM_MISSING 105
+#define STRING_ERROR_INVALID_DRIVE 106
+#define STRING_ERROR_INVALID_PARAM_FORMAT 107
+#define STRING_ERROR_BADCOMMAND 108
+#define STRING_ERROR_OUT_OF_MEMORY 109
+#define STRING_ERROR_CANNOTPIPE 110
+#define STRING_ERROR_D_PAUSEMSG 111
+#define STRING_ERROR_DRIVER_NOT_READY 112
+
+#define STRING_CHOICE_OPTION 200
+#define STRING_COPY_OPTION 201
+
+#define STRING_ALIAS_ERROR 300
+#define STRING_BATCH_ERROR 301
+#define STRING_CHCP_ERROR1 302
+#define STRING_CHCP_ERROR4 305
+#define STRING_CHOICE_ERROR 306
+#define STRING_CHOICE_ERROR_TXT 307
+#define STRING_CHOICE_ERROR_OPTION 308
+#define STRING_CMD_ERROR1 309
+#define STRING_CMD_ERROR2 310
+#define STRING_CMD_ERROR3 311
+#define STRING_CMD_ERROR4 312
+#define STRING_CMD_ERROR5 313
+#define STRING_COLOR_ERROR1 314
+#define STRING_COLOR_ERROR2 315
+#define STRING_COLOR_ERROR3 316
+#define STRING_COLOR_ERROR4 317
+#define STRING_CONSOLE_ERROR 318
+#define STRING_COPY_ERROR1 319
+#define STRING_COPY_ERROR2 320
+#define STRING_COPY_ERROR3 321
+#define STRING_COPY_ERROR4 322
+#define STRING_DATE_ERROR 323
+#define STRING_DEL_ERROR5 328
+#define STRING_DEL_ERROR6 329
+#define STRING_DEL_ERROR7 330
+#define STRING_ERROR_ERROR1 332
+#define STRING_ERROR_ERROR2 333
+#define STRING_FOR_ERROR1 334
+#define STRING_FOR_ERROR2 335
+#define STRING_FOR_ERROR3 336
+#define STRING_FOR_ERROR4 337
+#define STRING_FREE_ERROR1 338
+#define STRING_FREE_ERROR2 339
+#define STRING_GOTO_ERROR1 340
+#define STRING_GOTO_ERROR2 341
+#define STRING_MOVE_ERROR1 342
+#define STRING_MOVE_ERROR2 343
+#define STRING_PATH_ERROR 345
+#define STRING_REN_ERROR1 346
+#define STRING_START_ERROR1 347
+#define STRING_TIME_ERROR1 348
+#define STRING_TYPE_ERROR1 349
+#define STRING_WINDOW_ERROR1 350
+
+
+
+#define STRING_ATTRIB_HELP 600
+#define STRING_ALIAS_HELP 601
+#define STRING_BEEP_HELP 602
+#define STRING_CALL_HELP 603
+#define STRING_CD_HELP 604
+#define STRING_CHCP_HELP 605
+#define STRING_CHOICE_HELP 606
+#define STRING_CLS_HELP 607
+#define STRING_CMD_HELP1 608
+#define STRING_CMD_HELP2 609
+#define STRING_CMD_HELP3 610
+#define STRING_CMD_HELP4 611
+#define STRING_CMD_HELP5 612
+#define STRING_CMD_HELP6 613
+#define STRING_CMD_HELP7 614
+#define STRING_CMD_HELP8 615
+
+#define STRING_CMD_SHELLINFO 624
+
+#define STRING_COLOR_HELP1 625
+#define STRING_COPY_HELP1 626
+#define STRING_COPY_HELP2 627
+
+#define STRING_DATE_HELP1 628
+#define STRING_DATE_HELP2 629
+#define STRING_DATE_HELP3 630
+#define STRING_DATE_HELP4 631
+#define STRING_DEL_HELP1 632
+#define STRING_DEL_HELP2 633
+#define STRING_DEL_HELP3 634
+#define STRING_DEL_HELP4 635
+#define STRING_DELAY_HELP 636
+
+#define STRING_DIR_HELP1 637
+#define STRING_DIR_HELP2 638
+#define STRING_DIR_HELP3 639
+#define STRING_DIR_HELP4 640
+#define STRING_DIR_HELP5 641
+#define STRING_DIR_HELP6 642
+#define STRING_DIR_HELP7 643
+#define STRING_DIR_HELP8 644
+
+#define STRING_DIRSTACK_HELP1 645
+#define STRING_DIRSTACK_HELP2 646
+#define STRING_DIRSTACK_HELP3 647
+#define STRING_DIRSTACK_HELP4 648
+
+#define STRING_ECHO_HELP1 649
+#define STRING_ECHO_HELP2 650
+#define STRING_ECHO_HELP3 651
+#define STRING_ECHO_HELP4 652
+#define STRING_ECHO_HELP5 653
+
+#define STRING_EXIT_HELP 654
+
+#define STRING_FOR_HELP1 655
+
+#define STRING_FREE_HELP1 656
+#define STRING_FREE_HELP2 657
+
+#define STRING_IF_HELP1 658
+
+#define STRING_GOTO_HELP1 659
+
+#define STRING_LABEL_HELP1 660
+#define STRING_LABEL_HELP2 661
+#define STRING_LABEL_HELP3 662
+#define STRING_LABEL_HELP4 663
+#define STRING_LABEL_HELP5 664
+
+#define STRING_LOCALE_HELP1 665
+
+#define STRING_MKDIR_HELP 666
+
+#define STRING_MEMMORY_HELP1 667
+#define STRING_MEMMORY_HELP2 668
+
+#define STRING_MISC_HELP1 669
+
+#define STRING_MOVE_HELP1 670
+#define STRING_MOVE_HELP2 671
+
+#define STRING_MSGBOX_HELP 672
+
+#define STRING_PATH_HELP1 673
+
+#define STRING_PAUSE_HELP1 674
+
+#define STRING_PROMPT_HELP1 675
+#define STRING_PROMPT_HELP2 676
+#define STRING_PROMPT_HELP3 677
+
+#define STRING_REM_HELP 678
+
+#define STRING_REN_HELP1 679
+#define STRING_REN_HELP2 680
+#define STRING_REN_HELP3 681
+
+#define STRING_RMDIR_HELP 682
+
+#define STRING_SCREEN_HELP 683
+
+#define STRING_SHIFT_HELP 684
+
+#define STRING_SET_HELP 685
+
+#define STRING_START_HELP1 686
+
+#define STRING_TITLE_HELP 687
+
+#define STRING_TIME_HELP1 688
+#define STRING_TIME_HELP2 689
+
+#define STRING_TIMER_HELP1 690
+#define STRING_TIMER_HELP2 691
+#define STRING_TIMER_HELP3 692
+
+#define STRING_TYPE_HELP1 693
+
+#define STRING_VERIFY_HELP1 694
+#define STRING_VERIFY_HELP2 695
+#define STRING_VERIFY_HELP3 696
+
+#define STRING_VERSION_HELP1 697
+#define STRING_VERSION_HELP2 698
+#define STRING_VERSION_HELP3 699
+#define STRING_VERSION_HELP4 700
+#define STRING_VERSION_HELP5 701
+#define STRING_VERSION_HELP6 702
+#define STRING_VERSION_HELP7 703
+#define STRING_VERSION_RUNVER 705
+
+#define STRING_VOL_HELP1 706
+#define STRING_VOL_HELP2 707
+#define STRING_VOL_HELP3 708
+#define STRING_VOL_HELP4 709
+
+#define STRING_WINDOW_HELP1 710
+#define STRING_WINDOW_HELP2 711
+
+#define STRING_COPY_FILE 712
+#define STRING_DELETE_WIPE 713
+#define STRING_FOR_ERROR 714
+#define STRING_SCREEN_COL 715
+#define STRING_SCREEN_ROW 716
+#define STRING_TIMER_TIME 717
+#define STRING_HELP1 718
+#define STRING_HELP2 719
+
+#define STRING_INVALID_OPERAND 720
+#define STRING_EXPECTED_CLOSE_PAREN 721
+#define STRING_EXPECTED_NUMBER_OR_VARIABLE 722
+#define STRING_SYNTAX_COMMAND_INCORRECT 723
+#define STRING_RMDIR_HELP2 724
+#define STRING_MD_ERROR 725
+#define STRING_MD_ERROR2 726
+
+
+/* These strings are language independent (cmd.rc) */
+#define STRING_FREEDOS_DEV 800
+#define STRING_REACTOS_DEV 801
+
+/* EOF */
--- /dev/null
+/*
+ * SCREEN.C - screen internal command.
+ *
+ * clone from 4nt msgbox command
+ *
+ * 30 Aug 1999
+ * started - Paolo Pantaleo <paolopan@freemail.it>
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ *
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_SCREEN
+
+
+INT CommandScreen (LPTSTR cmd, LPTSTR param)
+{
+ SHORT x,y;
+ BOOL bSkipText = FALSE;
+
+ if (_tcsncmp (param, _T("/?"), 2) == 0)
+ {
+ ConOutResPaging(TRUE,STRING_SCREEN_HELP);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ //get row
+ while(_istspace(*param))
+ param++;
+
+ if(!(*param))
+ {
+ error_req_param_missing ();
+ return 1;
+ }
+
+ y = _ttoi(param);
+ if (y<0 || y>(maxy-1))
+ {
+ ConOutResPuts(STRING_SCREEN_ROW);
+
+ return 1;
+ }
+
+ //get col
+ if(!(param = _tcschr(param,_T(' '))))
+ {
+ error_req_param_missing ();
+ return 1;
+ }
+
+ while(_istspace(*param))
+ param++;
+
+ if(!(*param))
+ {
+ error_req_param_missing ();
+ return 1;
+ }
+
+ x = _ttoi(param);
+ if (x<0 || x>(maxx-1))
+ {
+ ConErrResPuts(STRING_SCREEN_COL);
+ return 1;
+ }
+
+ //get text
+ if(!(param = _tcschr(param,_T(' '))))
+ {
+ bSkipText = TRUE;
+ }
+ else
+ {
+ while(_istspace(*param))
+ param++;
+
+ if(!(*param))
+ {
+ bSkipText = TRUE;
+ }
+ }
+
+ bIgnoreEcho = TRUE;
+
+ if(bSkipText)
+ x=0;
+
+
+ SetCursorXY(x,y);
+
+ if(!(bSkipText))
+ ConOutPuts(param);
+
+ return 0;
+}
+
+#endif /* INCLUDE_CMD_SCREEN */
--- /dev/null
+/*
+ * SET.C - set internal command.
+ *
+ *
+ * History:
+ *
+ * 06/14/97 (Tim Norman)
+ * changed static var in set() to a malloc'd space to pass to putenv.
+ * need to find a better way to do this, since it seems it is wasting
+ * memory when variables are redefined.
+ *
+ * 07/08/1998 (John P. Price)
+ * removed call to show_environment in set command.
+ * moved test for syntax before allocating memory in set command.
+ * misc clean up and optimization.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 28-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added set_env function to set env. variable without needing set command
+ *
+ * 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("/?").
+ *
+ * 24-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed Win32 environment handling.
+ * Unicode and redirection safe!
+ *
+ * 25-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed little bug.
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include <malloc.h>
+#include <stdio.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_SET
+
+
+/* initial size of environment variable buffer */
+#define ENV_BUFFER_SIZE 1024
+
+static BOOL
+seta_eval ( LPCTSTR expr );
+
+static LPCTSTR
+skip_ws ( LPCTSTR p )
+{
+ return p + _tcsspn ( p, _T(" \t") );
+}
+
+INT cmd_set (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ INT i;
+ LPTSTR p;
+
+ if ( !_tcsncmp (param, _T("/?"), 2) )
+ {
+ ConOutResPaging(TRUE,STRING_SET_HELP);
+ return 0;
+ }
+
+ /* remove escapes */
+ if ( param[0] ) for ( i = 0; param[i+1]; i++ )
+ {
+ if ( param[i] == _T('^') )
+ {
+ memmove ( ¶m[i], ¶m[i+1], _tcslen(¶m[i]) * sizeof(TCHAR) );
+ }
+ }
+
+ /* if no parameters, show the environment */
+ if (param[0] == _T('\0'))
+ {
+ LPTSTR lpEnv;
+ LPTSTR lpOutput;
+ INT len;
+
+ lpEnv = (LPTSTR)GetEnvironmentStrings ();
+ if (lpEnv)
+ {
+ lpOutput = lpEnv;
+ while (*lpOutput)
+ {
+ len = _tcslen(lpOutput);
+ if (len)
+ {
+ if (*lpOutput != _T('='))
+ ConOutPuts (lpOutput);
+ lpOutput += (len + 1);
+ }
+ }
+ FreeEnvironmentStrings (lpEnv);
+ }
+
+ return 0;
+ }
+
+ /* the /A does *NOT* have to be followed by a whitespace */
+ if ( !_tcsnicmp (param, _T("/A"), 2) )
+ {
+ BOOL Success = seta_eval ( skip_ws(param+2) );
+ if(!Success)
+ {
+ /*might seem random but this is what windows xp does */
+ nErrorLevel = 9165;
+ }
+ /* TODO FIXME - what are we supposed to return? */
+ return Success;
+ }
+
+ p = _tcschr (param, _T('='));
+ if (p)
+ {
+ /* set or remove environment variable */
+ *p = _T('\0');
+ p++;
+ if (*p == _T('\0'))
+ {
+ p = NULL;
+ }
+ SetEnvironmentVariable (param, p);
+ }
+ else
+ {
+ /* display environment variable */
+ LPTSTR pszBuffer;
+ DWORD dwBuffer;
+
+ pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
+ dwBuffer = GetEnvironmentVariable (param, pszBuffer, ENV_BUFFER_SIZE);
+ if (dwBuffer == 0)
+ {
+ LoadString(CMD_ModuleHandle, STRING_PATH_ERROR, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf (szMsg, param);
+ return 0;
+ }
+ else if (dwBuffer > ENV_BUFFER_SIZE)
+ {
+ pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR));
+ GetEnvironmentVariable (param, pszBuffer, dwBuffer);
+ }
+ ConOutPrintf (_T("%s\n"), pszBuffer);
+
+ free (pszBuffer);
+
+ return 0;
+ }
+
+ return 0;
+}
+
+static INT
+ident_len ( LPCTSTR p )
+{
+ LPCTSTR p2 = p;
+ if ( __iscsymf(*p) )
+ {
+ ++p2;
+ while ( __iscsym(*p2) )
+ ++p2;
+ }
+ return p2-p;
+}
+
+#define PARSE_IDENT(ident,identlen,p) \
+ identlen = ident_len(p); \
+ ident = (LPTSTR)alloca ( ( identlen + 1 ) * sizeof(TCHAR) ); \
+ memmove ( ident, p, identlen * sizeof(TCHAR) ); \
+ ident[identlen] = 0; \
+ p += identlen;
+
+static BOOL
+seta_identval ( LPCTSTR ident, INT* result )
+{
+ LPCTSTR identVal = GetEnvVarOrSpecial ( ident );
+ if ( !identVal )
+ {
+ /* TODO FIXME - what to do upon failure? */
+ *result = 0;
+ return FALSE;
+ }
+ *result = _ttoi ( identVal );
+ return TRUE;
+}
+
+static BOOL
+calc ( INT* lval, TCHAR op, INT rval )
+{
+ switch ( op )
+ {
+ case '*':
+ *lval *= rval;
+ break;
+ case '/':
+ *lval /= rval;
+ break;
+ case '%':
+ *lval %= rval;
+ break;
+ case '+':
+ *lval += rval;
+ break;
+ case '-':
+ *lval -= rval;
+ break;
+ case '&':
+ *lval &= rval;
+ break;
+ case '^':
+ *lval ^= rval;
+ break;
+ case '|':
+ *lval |= rval;
+ break;
+ default:
+ ConErrResPuts ( STRING_INVALID_OPERAND );
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static BOOL
+seta_stmt ( LPCTSTR* p_, INT* result );
+
+static BOOL
+seta_unaryTerm ( LPCTSTR* p_, INT* result )
+{
+ LPCTSTR p = *p_;
+ if ( *p == _T('(') )
+ {
+ INT rval;
+ p = skip_ws ( p + 1 );
+ if ( !seta_stmt ( &p, &rval ) )
+ return FALSE;
+ if ( *p != _T(')') )
+ {
+ ConErrResPuts ( STRING_EXPECTED_CLOSE_PAREN );
+ return FALSE;
+ }
+ *result = rval;
+ p = skip_ws ( p + 1 );
+ }
+ else if ( isdigit(*p) )
+ {
+ *result = _ttoi ( p );
+ p = skip_ws ( p + _tcsspn ( p, _T("1234567890") ) );
+ }
+ else if ( __iscsymf(*p) )
+ {
+ LPTSTR ident;
+ INT identlen;
+ PARSE_IDENT(ident,identlen,p);
+ if ( !seta_identval ( ident, result ) )
+ return FALSE;
+ }
+ else
+ {
+ ConErrResPuts ( STRING_EXPECTED_NUMBER_OR_VARIABLE );
+ return FALSE;
+ }
+ *p_ = p;
+ return TRUE;
+}
+
+static BOOL
+seta_mulTerm ( LPCTSTR* p_, INT* result )
+{
+ LPCTSTR p = *p_;
+ TCHAR op = 0;
+ INT rval;
+ if ( _tcschr(_T("!~-"),*p) )
+ {
+ op = *p;
+ p = skip_ws ( p + 1 );
+ }
+ if ( !seta_unaryTerm ( &p, &rval ) )
+ return FALSE;
+ switch ( op )
+ {
+ case '!':
+ rval = !rval;
+ break;
+ case '~':
+ rval = ~rval;
+ break;
+ case '-':
+ rval = -rval;
+ break;
+ }
+
+ *result = rval;
+ *p_ = p;
+ return TRUE;
+}
+
+static BOOL
+seta_ltorTerm ( LPCTSTR* p_, INT* result, LPCTSTR ops, BOOL (*subTerm)(LPCTSTR*,INT*) )
+{
+ LPCTSTR p = *p_;
+ INT lval;
+ if ( !subTerm ( &p, &lval ) )
+ return FALSE;
+ while ( *p && _tcschr(ops,*p) )
+ {
+ INT rval;
+ TCHAR op = *p;
+
+ p = skip_ws ( p+1 );
+
+ if ( !subTerm ( &p, &rval ) )
+ return FALSE;
+
+ if ( !calc ( &lval, op, rval ) )
+ return FALSE;
+ }
+
+ *result = lval;
+ *p_ = p;
+ return TRUE;
+}
+
+static BOOL
+seta_addTerm ( LPCTSTR* p_, INT* result )
+{
+ return seta_ltorTerm ( p_, result, _T("*/%"), seta_mulTerm );
+}
+
+static BOOL
+seta_logShiftTerm ( LPCTSTR* p_, INT* result )
+{
+ return seta_ltorTerm ( p_, result, _T("+-"), seta_addTerm );
+}
+
+static BOOL
+seta_bitAndTerm ( LPCTSTR* p_, INT* result )
+{
+ LPCTSTR p = *p_;
+ INT lval;
+ if ( !seta_logShiftTerm ( &p, &lval ) )
+ return FALSE;
+ while ( *p && _tcschr(_T("<>"),*p) && p[0] == p[1] )
+ {
+ INT rval;
+ TCHAR op = *p;
+
+ p = skip_ws ( p+2 );
+
+ if ( !seta_logShiftTerm ( &p, &rval ) )
+ return FALSE;
+
+ switch ( op )
+ {
+ case '<':
+ lval <<= rval;
+ break;
+ case '>':
+ lval >>= rval;
+ break;
+ default:
+ ConErrResPuts ( STRING_INVALID_OPERAND );
+ return FALSE;
+ }
+ }
+
+ *result = lval;
+ *p_ = p;
+ return TRUE;
+}
+
+static BOOL
+seta_bitExclOrTerm ( LPCTSTR* p_, INT* result )
+{
+ return seta_ltorTerm ( p_, result, _T("&"), seta_bitAndTerm );
+}
+
+static BOOL
+seta_bitOrTerm ( LPCTSTR* p_, INT* result )
+{
+ return seta_ltorTerm ( p_, result, _T("^"), seta_bitExclOrTerm );
+}
+
+static BOOL
+seta_expr ( LPCTSTR* p_, INT* result )
+{
+ return seta_ltorTerm ( p_, result, _T("|"), seta_bitOrTerm );
+}
+
+static BOOL
+seta_assignment ( LPCTSTR* p_, INT* result )
+{
+ LPCTSTR p = *p_;
+ LPTSTR ident;
+ TCHAR op = 0;
+ INT identlen, exprval;
+
+ PARSE_IDENT(ident,identlen,p);
+ if ( identlen )
+ {
+ if ( *p == _T('=') )
+ op = *p, p = skip_ws(p+1);
+ else if ( _tcschr ( _T("*/%+-&^|"), *p ) && p[1] == _T('=') )
+ op = *p, p = skip_ws(p+2);
+ else if ( _tcschr ( _T("<>"), *p ) && *p == p[1] && p[2] == _T('=') )
+ op = *p, p = skip_ws(p+3);
+ }
+
+ /* allow to chain multiple assignments, such as: a=b=1 */
+ if ( ident && op )
+ {
+ INT identval;
+ LPTSTR buf;
+
+ if ( !seta_assignment ( &p, &exprval ) )
+ return FALSE;
+
+ if ( !seta_identval ( ident, &identval ) )
+ identval = 0;
+ switch ( op )
+ {
+ case '=':
+ identval = exprval;
+ break;
+ case '<':
+ identval <<= exprval;
+ break;
+ case '>':
+ identval >>= exprval;
+ break;
+ default:
+ if ( !calc ( &identval, op, exprval ) )
+ return FALSE;
+ }
+ buf = (LPTSTR)alloca ( 32 * sizeof(TCHAR) );
+ _sntprintf ( buf, 32, _T("%i"), identval );
+ SetEnvironmentVariable ( ident, buf ); // TODO FIXME - check return value
+ exprval = identval;
+ }
+ else
+ {
+ /* restore p in case we found an ident but not an op */
+ p = *p_;
+ if ( !seta_expr ( &p, &exprval ) )
+ return FALSE;
+ }
+
+ *result = exprval;
+ *p_ = p;
+ return TRUE;
+}
+
+static BOOL
+seta_stmt ( LPCTSTR* p_, INT* result )
+{
+ LPCTSTR p = *p_;
+ INT rval;
+
+ if ( !seta_assignment ( &p, &rval ) )
+ return FALSE;
+ while ( *p == _T(',') )
+ {
+ p = skip_ws ( p+1 );
+
+ if ( !seta_assignment ( &p, &rval ) )
+ return FALSE;
+ }
+
+ *result = rval;
+ *p_ = p;
+ return TRUE;
+}
+
+static BOOL
+seta_eval ( LPCTSTR p )
+{
+ INT rval;
+ if ( !*p )
+ {
+ ConErrResPuts ( STRING_SYNTAX_COMMAND_INCORRECT );
+ return FALSE;
+ }
+ if ( !seta_stmt ( &p, &rval ) )
+ return FALSE;
+ ConOutPrintf ( _T("%i"), rval );
+ return TRUE;
+}
+
+#endif
--- /dev/null
+@echo off
+
+@rem the next line reexecutes the script without params if it was called with params, else we'll get false failures
+@if not "%1"=="" seta_test.cmd
+
+@rem the next two lines illustrate bug in existing if code
+if not "=="=="==" goto failure
+if "=="=="==" goto next1
+goto failure
+:next1
+if "1"=="2" goto failure
+if not "1"=="1" goto failure
+set /a a=1
+echo.
+if not "%a%"=="1" goto failure
+set /a b=a
+echo.
+if not "%b%"=="1" goto failure
+set /a a=!5
+echo.
+if not "%a%"=="0" goto failure
+set /a a=!a
+echo.
+if not "%a%"=="1" goto failure
+set /a a=~5
+echo.
+if not "%a%"=="-6" goto failure
+set /a a=5,a=-a
+echo.
+if not "%a%"=="-5" goto failure
+set /a a=5*7
+echo.
+if not "%a%"=="35" goto failure
+set /a a=2000/10
+echo.
+if not "%a%"=="200" goto failure
+set /a a=42%%9
+echo.
+if not "%a%"=="6" goto failure
+set /a a=5%2
+echo.
+if not "%a%"=="5" goto failure
+set /a a=42^%13
+echo.
+if not "%a%"=="423" goto failure
+set /a a=7+9
+echo.
+if not "%a%"=="16" goto failure
+set /a a=9-7
+echo.
+if not "%a%"=="2" goto failure
+set /a a=9^<^<2
+echo.
+if not "%a%"=="36" goto failure
+set /a a=36^>^>2
+echo.
+if not "%a%"=="9" goto failure
+set /a a=42^&9
+echo.
+if not "%a%"=="8" goto failure
+set /a a=32^9
+echo.
+if not "%a%"=="329" goto failure
+set /a a=32^^9
+echo.
+if not "%a%"=="41" goto failure
+set /a a=10^|22
+echo.
+if not "%a%"=="30" goto failure
+set /a a=2,a*=3
+echo.
+if not "%a%"=="6" goto failure
+set /a a=11,a/=2
+echo.
+if not "%a%"=="5" goto failure
+set /a a=42,a%%=9
+echo.
+if not "%a%"=="6" goto failure
+set /a a=7,a+=9
+echo.
+if not "%a%"=="16" goto failure
+set /a a=9,a-=7
+echo.
+if not "%a%"=="2" goto failure
+set /a a=42,a^&=9
+echo.
+if not "%a%"=="8" goto failure
+set /a a=32,a^^=9
+echo.
+if not "%a%"=="41" goto failure
+set /a a=10,a^|=22
+echo.
+if not "%a%"=="30" goto failure
+set /a a=9,a^<^<=2
+echo.
+if not "%a%"=="36" goto failure
+set /a a=36,a^>^>=2
+echo.
+if not "%a%"=="9" goto failure
+set /a a=1,2
+echo.
+if not "%a%"=="1" goto failure
+set /a a=(a=1,a+2)
+echo.
+if "%a%"=="3" goto success
+goto failure
+
+:success
+echo SUCCESS!
+echo.
+goto done
+
+:failure
+echo FAILURE! remove the echo off and see the last formula that executed before this line
+echo.
+:done
--- /dev/null
+/*
+ * SHIFT.C - shift internal batch command
+ *
+ *
+ * History:
+ *
+ * 16 Jul 1998 (Hans B Pufal)
+ * started.
+ *
+ * 16 Jul 1998 (John P Price)
+ * Separated commands into individual files.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("shift /?") and cleaned up.
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection safe!
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+
+/*
+ * Perform the SHIFT command.
+ *
+ * Only valid inside batch files.
+ *
+ * FREEDOS extension : optional parameter DOWN to allow shifting
+ * parameters backwards.
+ *
+ */
+
+INT cmd_shift (LPTSTR cmd, LPTSTR param)
+{
+
+#ifdef _DEBUG
+ DebugPrintf (_T("cmd_shift: (\'%s\', \'%s\')\n"), cmd, param);
+#endif
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_SHIFT_HELP);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ if (bc == NULL)
+ {
+ /* not in batch - error!! */
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ if (!_tcsicmp (param, _T("down")))
+ {
+ if (bc->shiftlevel)
+ bc->shiftlevel--;
+ }
+ else /* shift up */
+ bc->shiftlevel++;
+
+ return 0;
+}
+
+/* EOF */
--- /dev/null
+/*
+ * START.C - start internal command.
+ *
+ *
+ * History:
+ *
+ * 24-Jul-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Started.
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_START
+
+
+INT cmd_start (LPTSTR First, LPTSTR Rest)
+{
+ TCHAR szFullName[CMDLINE_LENGTH];
+ TCHAR first[CMDLINE_LENGTH];
+ TCHAR *rest = NULL;
+ TCHAR *param = NULL;
+ INT size;
+ LPTSTR comspec;
+ BOOL bWait = FALSE;
+ BOOL bBat = FALSE;
+ BOOL bCreate = FALSE;
+ TCHAR szFullCmdLine [CMDLINE_LENGTH];
+ PROCESS_INFORMATION prci;
+ STARTUPINFO stui;
+
+
+
+ if (_tcsncmp (Rest, _T("/?"), 2) == 0)
+ {
+ ConOutResPaging(TRUE,STRING_START_HELP1);
+ return 0;
+ }
+
+ /* get comspec */
+ comspec = malloc ( MAX_PATH * sizeof(TCHAR));
+ if (comspec == NULL)
+ {
+ error_out_of_memory();
+ return 1;
+ }
+ SetLastError(0);
+ size = GetEnvironmentVariable (_T("COMSPEC"), comspec, 512);
+ if(GetLastError() == ERROR_ENVVAR_NOT_FOUND)
+ {
+ Rest = _T("cmd");
+ }
+ else
+ {
+ if (size > MAX_PATH)
+ {
+ comspec = realloc(comspec,size * sizeof(TCHAR) );
+ if (comspec==NULL)
+ {
+ return 1;
+ }
+ size = GetEnvironmentVariable (_T("COMSPEC"), comspec, size);
+ }
+ }
+
+ nErrorLevel = 0;
+
+ if( !*Rest )
+ {
+ _tcscpy(Rest,_T("\""));
+ _tcscat(Rest,comspec);
+ _tcscat(Rest,_T("\""));
+ }
+
+ rest = malloc ( _tcslen(Rest) + 1 * sizeof(TCHAR));
+ if (rest == NULL)
+ {
+ if(comspec != NULL)
+ free(comspec);
+ error_out_of_memory();
+ return 1;
+ }
+
+ param =malloc ( _tcslen(Rest) + 1 * sizeof(TCHAR));
+ if (rest == NULL)
+ {
+ if(comspec != NULL)
+ free(comspec);
+ free(rest);
+ error_out_of_memory();
+ return 1;
+ }
+
+ param[0] = _T('\0');
+
+
+ _tcscpy(rest,Rest);
+
+ /* Parsing the command that gets called by start, and it's parameters */
+ if(!_tcschr(rest,_T('\"')))
+ {
+ INT i = 0;
+ INT count = _tcslen(rest);
+
+ /* find the end of the command and start of the args */
+ for(i = 0; i < count; i++)
+ {
+ if(rest[i] == _T(' '))
+ {
+
+ _tcscpy(param,&rest[i]);
+ rest[i] = _T('\0');
+ break;
+ }
+ }
+ }
+ else
+ {
+ INT i = 0;
+ INT count = _tcslen(rest);
+ BOOL bInside = FALSE;
+
+ /* find the end of the command and put the arguments in param */
+ for(i = 0; i < count; i++)
+ {
+ if(rest[i] == _T('\"'))
+ bInside = !bInside;
+ if((rest[i] == _T(' ')) && !bInside)
+ {
+ _tcscpy(param,&rest[i]);
+ rest[i] = _T('\0');
+ break;
+ }
+ }
+ i = 0;
+ /* remove any slashes */
+ while(i < count)
+ {
+ if(rest[i] == _T('\"'))
+ memmove(&rest[i],&rest[i + 1], _tcslen(&rest[i]) * sizeof(TCHAR));
+ else
+ i++;
+ }
+ }
+
+ /* check for a drive change */
+
+ if (!_tcscmp (first + 1, _T(":")) && _istalpha (*first))
+ {
+ TCHAR szPath[CMDLINE_LENGTH];
+
+ _tcscpy (szPath, _T("A:"));
+ szPath[0] = _totupper (*first);
+ SetCurrentDirectory (szPath);
+ GetCurrentDirectory (CMDLINE_LENGTH, szPath);
+ if (szPath[0] != (TCHAR)_totupper (*first))
+ ConErrResPuts (STRING_FREE_ERROR1);
+
+ if (rest != NULL)
+ free(rest);
+
+ if (param != NULL)
+ free(param);
+ if (comspec != NULL)
+ free(comspec);
+ return 0;
+ }
+
+ /* get the PATH environment variable and parse it */
+ /* search the PATH environment variable for the binary */
+ if (!SearchForExecutable (rest, szFullName))
+ {
+ error_bad_command ();
+
+ if (rest != NULL)
+ free(rest);
+
+ if (param != NULL)
+ free(param);
+
+ if (comspec != NULL)
+ free(comspec);
+ return 1;
+ }
+
+
+ /* check if this is a .BAT or .CMD file */
+ if (!_tcsicmp (_tcsrchr (szFullName, _T('.')), _T(".bat")) ||
+ !_tcsicmp (_tcsrchr (szFullName, _T('.')), _T(".cmd")))
+ {
+ bBat = TRUE;
+ memset(szFullCmdLine,0,CMDLINE_LENGTH * sizeof(TCHAR));
+
+
+ _tcscpy(szFullCmdLine,comspec);
+
+ memcpy(&szFullCmdLine[_tcslen(szFullCmdLine)],_T("\" /K \""), 6 * sizeof(TCHAR));
+ memcpy(&szFullCmdLine[_tcslen(szFullCmdLine)], szFullName, _tcslen(szFullName) * sizeof(TCHAR));
+ memcpy(&szFullCmdLine[1], &szFullCmdLine[0], _tcslen(szFullCmdLine) * sizeof(TCHAR));
+ szFullCmdLine[0] = _T('\"');
+ szFullCmdLine[_tcslen(szFullCmdLine)] = _T('\"');
+ }
+
+#ifdef _DEBUG
+ DebugPrintf (_T("[BATCH: %s %s]\n"), szFullName, rest);
+#endif
+
+
+#ifdef _DEBUG
+ DebugPrintf (_T("[EXEC: %s %s]\n"), szFullName, rest);
+#endif
+ /* build command line for CreateProcess() */
+ if (bBat == FALSE)
+ {
+ _tcscpy (szFullCmdLine, first);
+ if( param != NULL )
+ {
+
+ _tcscat(szFullCmdLine, _T(" ") );
+ _tcscat (szFullCmdLine, param);
+ }
+ }
+
+ /* fill startup info */
+ memset (&stui, 0, sizeof (STARTUPINFO));
+ stui.cb = sizeof (STARTUPINFO);
+ stui.dwFlags = STARTF_USESHOWWINDOW;
+ stui.wShowWindow = SW_SHOWDEFAULT;
+
+ if (bBat == TRUE)
+ {
+ bCreate = CreateProcess (NULL, szFullCmdLine, NULL, NULL, FALSE,
+ CREATE_NEW_CONSOLE, NULL, NULL, &stui, &prci);
+ }
+ else
+ {
+ bCreate = CreateProcess (szFullName, szFullCmdLine, NULL, NULL, FALSE,
+ CREATE_NEW_CONSOLE, NULL, NULL, &stui, &prci);
+ }
+
+ if (bCreate)
+ {
+ if (bWait)
+ {
+ DWORD dwExitCode;
+ WaitForSingleObject (prci.hProcess, INFINITE);
+ GetExitCodeProcess (prci.hProcess, &dwExitCode);
+ nErrorLevel = (INT)dwExitCode;
+ }
+ CloseHandle (prci.hThread);
+ CloseHandle (prci.hProcess);
+ /* Get New code page if it has change */
+ InputCodePage= GetConsoleCP();
+ OutputCodePage = GetConsoleOutputCP();
+ }
+ else
+ {
+ ErrorMessage(GetLastError (),
+ _T("Error executing CreateProcess()!!\n"));
+ }
+
+
+ if (rest != NULL)
+ free(rest);
+
+ if (param != NULL)
+ free(param);
+
+ if (comspec != NULL)
+ free(comspec);
+ return 0;
+}
+
+#endif
+
+/* EOF */
--- /dev/null
+/*
+ * STRTOCLR.C - read color (for color command and other)
+ *
+ *
+ * History:
+ *
+ * 07-Oct-1999 (Paolo Pantaleo)
+ * Started.
+ *
+ *
+ */
+
+/*only
+BOOL StringToColor(LPWORD lpColor, LPTSTR*str)
+is to be called
+other are internal service functions*/
+
+
+#include <precomp.h>
+
+#define _B FOREGROUND_BLUE
+#define _G FOREGROUND_GREEN
+#define _R FOREGROUND_RED
+#define _I FOREGROUND_INTENSITY
+
+
+/*return values for chop_blank*/
+#define CP_OK 0
+#define CP_BLANK_NOT_FOUND 1
+#define CP_END_OF_STRING 2
+
+#define SC_HEX 0x0100
+#define SC_TXT 0x0200
+
+
+
+typedef struct _CLRTABLE
+{
+ LPTSTR name;
+ WORD val;
+} CLRTABLE;
+
+
+CLRTABLE clrtable[] =
+{
+ {_T("bla") ,0 },
+ {_T("blu") ,_B },
+ {_T("gre") ,_G },
+ {_T("cya") ,_B|_G },
+ {_T("red") ,_R },
+ {_T("mag") ,_B|_R },
+ {_T("yel") ,_R|_G },
+ {_T("whi") ,_R|_G|_B },
+ {_T("gra") ,_I },
+
+
+ {_T("0") ,0 },
+ {_T("2") ,_G },
+ {_T("3") ,_B|_G },
+ {_T("4") ,_R },
+ {_T("5") ,_B|_R },
+ {_T("6") ,_R|_G },
+ {_T("7") ,_R|_G|_B },
+
+ {_T("8") ,_I },
+ {_T("9") ,_I|_B },
+ {_T("10") ,_I|_G },
+ {_T("11") ,_I|_B|_G },
+ {_T("12") ,_I|_R },
+ {_T("13") ,_I|_B|_R },
+ {_T("14") ,_I|_R|_G },
+ {_T("15") ,_I|_R|_G|_B },
+
+
+ /* note that 1 is at the end of list
+ to avoid to confuse it with 10-15*/
+ {_T("1") ,_B },
+
+ /*cyan synonimous*/
+ {_T("aqu") ,_B|_G },
+ /*magenta synonimous*/
+ {_T("pur") ,_B|_R },
+
+
+ {_T("") ,0},
+};
+
+
+
+/*
+move string pointer to next word (skip all spaces)
+on erro retunr nonzero value
+*/
+static
+INT chop_blank(LPTSTR *arg_str)
+{
+
+ LPTSTR str;
+ str = _tcschr(*arg_str,_T(' '));
+ if(!str)
+ {
+ str = _tcschr (*arg_str, _T('\0'));
+ if(str != NULL)
+ *arg_str=str;
+ return CP_BLANK_NOT_FOUND;
+ }
+
+
+
+ while(_istspace(*str))
+ str++;
+
+ if (*str == _T('\0'))
+ {
+ *arg_str=str;
+ return CP_END_OF_STRING;
+ }
+
+ *arg_str = str;
+
+ return CP_OK;
+}
+
+
+
+/*
+read a color value in hex (like win nt's cmd syntax)
+if an error occurs return -1
+*/
+static
+WORD hex_clr(LPTSTR str)
+{
+ WORD ret= (WORD)-1;
+ TCHAR ch;
+
+ ch = str[1];
+
+ if(_istdigit(ch))
+ ret = ch-_T('0');
+ else
+ {
+ ch=_totupper(ch);
+
+ if( ch >= _T('A') && ch <= _T('F') )
+ ret = ch-_T('A')+10;
+ else
+ return (WORD)-1;
+ }
+
+
+ ch = str[0];
+
+ if(_istdigit(ch))
+ ret |= (ch-_T('0')) << 4;
+ else
+ {
+ ch=_totupper(ch);
+
+ if( ch >= _T('A') && ch <= _T('F') )
+ ret |= (ch-_T('A')+10) <<4;
+ else
+ return (WORD)-1;
+ }
+
+ return ret;
+}
+
+
+/*
+read a color value from a string (like 4nt's syntax)
+if an error occurs return -1
+*/
+static
+WORD txt_clr(LPTSTR str)
+{
+ INT i;
+
+ for(i = 0; *(clrtable[i].name); i++)
+ if (_tcsnicmp(str, clrtable[i].name, _tcslen(clrtable[i].name)) == 0)
+ return clrtable[i].val;
+
+ return (WORD)-1;
+}
+
+
+
+/*search for x on y*/
+static
+WORD str_to_color(LPTSTR* arg_str)
+{
+ LPTSTR str;
+ BOOL bBri;
+
+ WORD tmp_clr,ret_clr;
+
+ str = *arg_str;
+
+ if (!(*str))
+ return (WORD)-1;
+
+
+ /*foreground*/
+ bBri = FALSE;
+
+ if (_tcsnicmp(str,_T("bri"),3) == 0)
+ {
+ bBri = TRUE;
+
+ if (chop_blank(&str))
+ return (WORD)-1;
+ }
+
+ if ((tmp_clr = txt_clr(str)) == (WORD)-1)
+ {
+ return (WORD)-1;
+ }
+
+ /*skip spaces and "on"*/
+ if (chop_blank(&str) || chop_blank(&str))
+ return (WORD)-1;
+
+ ret_clr = tmp_clr | (bBri << 3);
+
+ /*background*/
+ bBri = FALSE;
+
+ if(_tcsnicmp(str,_T("bri"),3) == 0 )
+ {
+ bBri = TRUE;
+
+ if(chop_blank(&str))
+ return (WORD)-1;
+ }
+
+
+ if( (tmp_clr = txt_clr(str)) == (WORD)-1 )
+ return (WORD)-1;
+
+ chop_blank(&str);
+
+ *arg_str = str;
+
+ return SC_HEX | ret_clr | tmp_clr << 4 | bBri << 7;
+}
+
+
+
+/****main function****/
+/*
+the only parameter is arg_str, a pointer to a string.
+the string is modified so it will begin to first word after
+color specification
+(only the char* is moved, no chars in the string are modfied)
+
+
+it returns the color in the l.o. byte, plus two flags in the
+h.o. byte, they are:
+SC_HEX win nt's cmd syntax (for exampl a0)
+SC_TXT 4nt's syntax ( "bri gre on bla" or "10 on 0")
+
+if succedes also move the LPTSTR to end of
+string that specify color
+*/
+
+
+BOOL StringToColor(LPWORD lpColor, LPTSTR*str)
+{
+ WORD wRet;
+
+ wRet = str_to_color (str);
+ if (wRet == (WORD)-1)
+ {
+ wRet=hex_clr (*str);
+ chop_blank (str);
+ if (wRet == (WORD)-1)
+ return FALSE;
+ }
+
+ *lpColor = wRet;
+
+ return TRUE;
+}
+
+/* EOF */
--- /dev/null
+<module name="cmd_test" type="test">
+ <include base="rtshared">.</include>
+ <include base="ReactOS">include/wine</include>
+ <include base="cmd">.</include>
+ <define name="__USE_W32API" />
+ <define name="ANONYMOUSUNIONS" />
+ <define name="_WIN32_WINNT">0x0501</define>
+ <library>rtshared</library>
+ <library>regtests</library>
+ <library>cmd_base</library>
+ <library>pseh</library>
+ <library>ntdll</library>
+ <file>setup.c</file>
+ <xi:include href="stubs.xml" />
+</module>
--- /dev/null
+/*
+ * Copyright (C) 2005 Casper S. Hornstrup
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include <windows.h>
+#include "regtests.h"
+
+_SetupOnce()
+{
+}
--- /dev/null
+<component name="kernel32.dll">
+ <symbol>FindFirstFileA@8</symbol>
+ <symbol>GetLastError@0</symbol>
+ <symbol>FindNextFileA@8</symbol>
+ <symbol>FindClose@4</symbol>
+ <symbol>GetFileAttributesA@4</symbol>
+ <symbol>GetCurrentDirectoryA@8</symbol>
+ <symbol>GetFullPathNameA@16</symbol>
+ <symbol>CloseHandle@4</symbol>
+ <symbol>CreateFileA@28</symbol>
+ <symbol>Beep@8</symbol>
+ <symbol>LoadStringA@16</symbol>
+ <symbol>SetConsoleCP@4</symbol>
+ <symbol>SetConsoleOutputCP@4</symbol>
+ <symbol>WaitForSingleObject@8</symbol>
+ <symbol>ReadConsoleInputA@16</symbol>
+ <symbol>GetTickCount@0</symbol>
+ <symbol>GetConsoleScreenBufferInfo@8</symbol>
+ <symbol>FillConsoleOutputAttribute@20</symbol>
+ <symbol>FillConsoleOutputCharacterA@20</symbol>
+ <symbol>SetConsoleCursorPosition@8</symbol>
+ <symbol>LoadLibraryA@4</symbol>
+ <symbol>GetProcAddress@8</symbol>
+ <symbol>SetCurrentDirectoryA@4</symbol>
+ <symbol>SetConsoleMode@8</symbol>
+ <symbol>CreateProcessA@40</symbol>
+ <symbol>GetExitCodeProcess@8</symbol>
+ <symbol>GetConsoleOutputCP@0</symbol>
+ <symbol>GetTempPathA@8</symbol>
+ <symbol>GetTempFileNameA@16</symbol>
+ <symbol>GetCurrentProcess@0</symbol>
+ <symbol>DuplicateHandle@28</symbol>
+ <symbol>GetFileType@4</symbol>
+ <symbol>SetFilePointer@16</symbol>
+ <symbol>GetTimeFormatA@24</symbol>
+ <symbol>GetDateFormatA@24</symbol>
+ <symbol>GetEnvironmentVariableA@12</symbol>
+ <symbol>GenerateConsoleCtrlEvent@8</symbol>
+ <symbol>SetConsoleCtrlHandler@8</symbol>
+ <symbol>GetVersionExA@4</symbol>
+ <symbol>ExitProcess@4</symbol>
+ <symbol>GetModuleFileNameA@12</symbol>
+ <symbol>SetEnvironmentVariableA@8</symbol>
+ <symbol>SetConsoleTextAttribute@8</symbol>
+ <symbol>FlushConsoleInputBuffer@4</symbol>
+ <symbol>WriteFile@20</symbol>
+ <symbol>FormatMessageA@28</symbol>
+ <symbol>LocalFree@4</symbol>
+ <symbol>GetConsoleCP@0</symbol>
+ <symbol>GetStdHandle@4</symbol>
+ <symbol>FreeLibrary@4</symbol>
+ <symbol>SetLastError@4</symbol>
+ <symbol>SetStdHandle@8</symbol>
+ <symbol>DeleteFileA@4</symbol>
+ <symbol>FileTimeToLocalFileTime@8</symbol>
+ <symbol>GetVolumeInformationA@32</symbol>
+ <symbol>RemoveDirectoryA@4</symbol>
+ <symbol>CreateDirectoryA@8</symbol>
+ <symbol>GetLocaleInfoA@16</symbol>
+ <symbol>GlobalMemoryStatus@4</symbol>
+ <symbol>GetEnvironmentStrings@0</symbol>
+ <symbol>FreeEnvironmentStringsA@4</symbol>
+ <symbol>LocalFree</symbol>
+ <symbol>SetLocalTime@4</symbol>
+ <symbol>GetLocalTime@4</symbol>
+ <symbol>SetFileAttributesA@8</symbol>
+ <symbol>SetFileApisToOEM@0</symbol>
+ <symbol>GetConsoleMode@8</symbol>
+ <symbol>SetConsoleCursorInfo@8</symbol>
+ <symbol>ReadFile@20</symbol>
+ <symbol>SetFileTime@16</symbol>
+ <symbol>FileTimeToSystemTime@8</symbol>
+ <symbol>GetDiskFreeSpaceA@20</symbol>
+ <symbol>SetVolumeLabelA@8</symbol>
+ <symbol>SetConsoleTitleA@4</symbol>
+ <symbol>MoveFileExA@12</symbol>
+ <symbol>GetFileTime@16</symbol>
+ <symbol>Sleep@4</symbol>
+ <symbol>MoveFileA@8</symbol>
+ <symbol>CreateSemaphoreA@16</symbol>
+ <symbol>InterlockedIncrement@4</symbol>
+ <symbol>InterlockedDecrement@4</symbol>
+ <symbol>ReleaseSemaphore@12</symbol>
+</component>
--- /dev/null
+/*
+ * TIME.C - time internal command.
+ *
+ *
+ * History:
+ *
+ * 07/08/1998 (John P. Price)
+ * started.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 09-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added locale support.
+ *
+ * 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection safe!
+ * Added "/t" option.
+ *
+ * 04-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Fixed time input bug.
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc.
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_TIME
+
+
+static BOOL ParseTime (LPTSTR s)
+{
+ SYSTEMTIME t;
+ LPTSTR p = s;
+
+ if (!*s)
+ return TRUE;
+
+ GetLocalTime (&t);
+ t.wHour = 0;
+ t.wMinute = 0;
+ t.wSecond = 0;
+ t.wMilliseconds = 0;
+
+ // first get hour
+ if (_istdigit(*p))
+ {
+ while (_istdigit(*p))
+ {
+ t.wHour = t.wHour * 10 + *p - _T('0');
+ p++;
+ }
+ }
+ else
+ return FALSE;
+
+ // get time separator
+ if (*p != cTimeSeparator)
+ return FALSE;
+ p++;
+
+ // now get minutes
+ if (_istdigit(*p))
+ {
+ while (_istdigit(*p))
+ {
+ t.wMinute = t.wMinute * 10 + *p - _T('0');
+ p++;
+ }
+ }
+ else
+ return FALSE;
+
+ // get time separator
+ if (*p != cTimeSeparator)
+ return FALSE;
+ p++;
+
+ // now get seconds
+ if (_istdigit(*p))
+ {
+ while (_istdigit(*p))
+ {
+ t.wSecond = t.wSecond * 10 + *p - _T('0');
+ p++;
+ }
+ }
+ else
+ return FALSE;
+
+ // get decimal separator
+ if (*p == cDecimalSeparator)
+ {
+ p++;
+
+ // now get hundreths
+ if (_istdigit(*p))
+ {
+ while (_istdigit(*p))
+ {
+// t.wMilliseconds = t.wMilliseconds * 10 + *p - _T('0');
+ p++;
+ }
+// t.wMilliseconds *= 10;
+ }
+ }
+
+ /* special case: 12 hour format */
+ if (nTimeFormat == 0)
+ {
+ if (_totupper(*s) == _T('P'))
+ {
+ t.wHour += 12;
+ }
+
+ if ((_totupper(*s) == _T('A')) && (t.wHour == 12))
+ {
+ t.wHour = 0;
+ }
+ }
+
+ if (t.wHour > 23 || t.wMinute > 60 || t.wSecond > 60 || t.wMilliseconds > 999)
+ return FALSE;
+
+ SetLocalTime (&t);
+
+ return TRUE;
+}
+
+
+INT cmd_time (LPTSTR cmd, LPTSTR param)
+{
+ LPTSTR *arg;
+ INT argc;
+ INT i;
+ BOOL bPrompt = TRUE;
+ INT nTimeString = -1;
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_TIME_HELP1);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ /* build parameter array */
+ arg = split (param, &argc, FALSE);
+
+ /* check for options */
+ for (i = 0; i < argc; i++)
+ {
+ if (_tcsicmp (arg[i], _T("/t")) == 0)
+ bPrompt = FALSE;
+
+ if ((*arg[i] != _T('/')) && (nTimeString == -1))
+ nTimeString = i;
+ }
+
+ if (nTimeString == -1)
+ PrintTime ();
+
+ if (!bPrompt)
+ {
+ freep (arg);
+ return 0;
+ }
+
+ while (1)
+ {
+ if (nTimeString == -1)
+ {
+ TCHAR s[40];
+
+ ConOutResPuts(STRING_TIME_HELP2);
+
+ ConInString (s, 40);
+
+#ifdef _DEBUG
+ DebugPrintf (_T("\'%s\'\n"), s);
+#endif
+
+ while (*s && s[_tcslen (s) - 1] < _T(' '))
+ s[_tcslen(s) - 1] = _T('\0');
+
+ if (ParseTime (s))
+ {
+ freep (arg);
+ return 0;
+ }
+ }
+ else
+ {
+ if (ParseTime (arg[nTimeString]))
+ {
+ freep (arg);
+ return 0;
+ }
+
+ /* force input the next time around. */
+ nTimeString = -1;
+ }
+
+ ConErrResPuts(STRING_TIME_ERROR1);
+ nErrorLevel = 1;
+ }
+
+ freep (arg);
+
+ return 0;
+}
+
+#endif
--- /dev/null
+/*
+ * TIMER.C - timer internal command.
+ *
+ * clone from 4nt timer command
+ *
+ * 20 Aug 1999
+ * started - Paolo Pantaleo <paolopan@freemail.it>
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_TIMER
+
+
+#define NCS_NOT_SPECIFIED -1
+#define NCS_ON 1
+#define NCS_OFF 0
+
+
+
+
+
+//print timer value
+#define PT(format) PrintElapsedTime(GetTickCount()-cT,format)
+
+
+//current timer Time (at wich started to count)
+#define cT clksT[clk_n]
+
+//current timer status
+#define cS clksS[clk_n]
+
+
+static VOID
+PrintElapsedTime (DWORD time,INT format)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ DWORD h,m,s,ms;
+
+#ifdef _DEBUG
+ DebugPrintf(_T("PrintTime(%d,%d)"),time,format);
+#endif
+
+ switch (format)
+ {
+ case 0:
+ LoadString(CMD_ModuleHandle, STRING_TIMER_HELP1, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, time);
+ break;
+
+ case 1:
+ ms = time % 1000;
+ time /= 1000;
+ s = time % 60;
+ time /=60;
+ m = time % 60;
+ h = time / 60;
+ LoadString( CMD_ModuleHandle, STRING_TIMER_HELP2, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg,
+ h, cTimeSeparator,
+ m, cTimeSeparator,
+ s, cDecimalSeparator, ms/10);
+ break;
+ }
+}
+
+
+INT CommandTimer (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+ // all timers are kept
+ static DWORD clksT[10];
+
+ // timers status
+ // set all the clocks off by default
+ static BOOL clksS[10]={FALSE,FALSE,FALSE,FALSE,
+ FALSE,FALSE,FALSE,FALSE,FALSE,FALSE};
+
+ // TRUE if /S in command line
+ BOOL bS = FALSE;
+
+ // avoid to set clk_n more than once
+ BOOL bCanNSet = TRUE;
+
+ INT NewClkStatus = NCS_NOT_SPECIFIED;
+
+ // the clock number specified on the command line
+ // 1 by default
+ INT clk_n=1;
+
+ // output format
+ INT iFormat=1;
+
+
+ // command line parsing variables
+ INT argc;
+ LPTSTR *p;
+
+ INT i;
+
+ if (_tcsncmp (param, _T("/?"), 2) == 0)
+ {
+ LoadString(CMD_ModuleHandle, STRING_TIMER_HELP3, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, cTimeSeparator, cTimeSeparator, cDecimalSeparator);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ LoadString( CMD_ModuleHandle, STRING_TIMER_TIME, szMsg, RC_STRING_MAX_SIZE);
+
+ p = split (param, &argc, FALSE);
+
+ //read options
+ for (i = 0; i < argc; i++)
+ {
+ //set timer on
+ if (!(_tcsicmp(&p[i][0],_T("on"))) && NewClkStatus == NCS_NOT_SPECIFIED)
+ {
+ NewClkStatus = NCS_ON;
+ continue;
+ }
+
+ //set timer off
+ if (!(_tcsicmp(&p[i][0],_T("off"))) && NewClkStatus == NCS_NOT_SPECIFIED)
+ {
+ NewClkStatus = NCS_OFF;
+ continue;
+ }
+
+ // other options
+ if (p[i][0] == _T('/'))
+ {
+ // set timer number
+ if (_istdigit(p[i][1]) && bCanNSet)
+ {
+ clk_n = p[i][1] - _T('0');
+ bCanNSet = FALSE;
+ continue;
+ }
+
+ // set s(plit) option
+ if (_totupper(p[i][1]) == _T('S'))
+ {
+ bS = TRUE;
+ continue;
+ }
+
+ // specify format
+ if (_totupper(p[i][1]) == _T('F'))
+ {
+ iFormat = p[i][2] - _T('0');
+ continue;
+ }
+ }
+ }
+
+ // do stuff (start/stop/read timer)
+ if(NewClkStatus == NCS_ON)
+ {
+ cT=GetTickCount();
+ cS=TRUE;
+
+ ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
+ PrintTime();
+ freep(p);
+ return 0;
+ }
+
+ if(bS)
+ {
+ if(cS)
+ {
+ ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
+ PrintTime();
+ PrintElapsedTime(GetTickCount()-cT, iFormat);
+ freep(p);
+ return 0;
+ }
+
+ cT=GetTickCount();
+ cS=TRUE;
+ ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
+ PrintTime();
+ freep(p);
+ return 0;
+ }
+
+ if (NewClkStatus == NCS_NOT_SPECIFIED)
+ {
+ if (cS)
+ {
+ cS=FALSE;
+ ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
+ PrintTime();
+ PrintElapsedTime(GetTickCount()-cT, iFormat);
+ freep(p);
+ return 0;
+ }
+
+ cT=GetTickCount();
+ cS=TRUE;
+ ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
+ PrintTime();
+ freep(p);
+ return 0;
+ }
+
+
+ if (NewClkStatus == NCS_OFF)
+ {
+ if (cS)
+ {
+ cS=FALSE;
+ ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
+ PrintTime();
+ PrintElapsedTime(GetTickCount()-cT, iFormat);
+ freep(p);
+ return 0;
+ }
+ ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
+ PrintTime();
+ freep(p);
+ return 0;
+ }
+
+ freep(p);
+ return 0;
+}
+
+#endif /* INCLUDE_CMD_TIMER */
--- /dev/null
+/*
+ * title.c - title internal command.
+ *
+ *
+ * History:
+ * 1999-02-11 Emanuele Aliberti
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_TITLE
+
+
+INT cmd_title (LPTSTR cmd, LPTSTR param)
+{
+
+ /* Do nothing if no args */
+ if (*param == _T('\0'))
+ return 0;
+
+ /* Asking help? */
+ if (!_tcsncmp(param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_TITLE_HELP);
+ return 0;
+ }
+
+ return SetConsoleTitle (param);
+}
+
+#endif /* def INCLUDE_CMD_TITLE */
+
+/* EOF */
--- /dev/null
+Things to do
+~~~~~~~~~~~~
+*Implmenet Set /P
+This is pretty straight forward. When doing this make sure to take into account the way MS handles "set /A /P foo=5" compared to "set /P /A foo=5".
+
+*Compile as unicode
+Not sure what is wrong with it, put probably more then just one thing blocking this. For sure pipes break when it is compiled as unicode.
+
+*Move.c code clean up
+It works, but it needs to be cleaned up, the code is long and overly complex for what it needs to do. Also, we can remove the hack to cover for MoveFileEx bug as it isnt a bug anymore.
+
+*If rewrite
+It works decent but looks _awful_. Very hard to maintain and/or understand what the hell is going on.
+
+*Remove Hardcoded buffers
+This is mostly done thanks to Greatlord(cmd.c is the hardest spot that is left). ANytime when you are handling a string that is taken from the commandline there should be no limit to the size.
+
+*Implment & and &&
+& runs two commands no matter what.
+&& runs the 2nd command only if the first was a success
+Not sure where to put this code even
+
+*Reg Testing
+We need more batch files like the one Royce made for "set /a". What out for if bugs when doing this... could lead to in the wrong direction when looking for a regression.
\ No newline at end of file
--- /dev/null
+/*
+ * TYPE.C - type internal command.
+ *
+ * History:
+ *
+ * 07/08/1998 (John P. Price)
+ * started.
+ *
+ * 07/12/98 (Rob Lake)
+ * Changed error messages
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added support for quoted arguments (type "test file.dat").
+ * Cleaned up.
+ *
+ * 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection ready!
+ *
+ * 19-Jan-1999 (Paolo Pantaleo <paolopan@freemail.it>)
+ * Added multiple file support (copied from y.c)
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_TYPE
+
+
+INT cmd_type (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR buff[256];
+ HANDLE hFile, hConsoleOut;
+ BOOL bRet;
+ INT argc,i;
+ LPTSTR *argv;
+ LPTSTR errmsg;
+ BOOL bPaging = FALSE;
+ BOOL bFirstTime = TRUE;
+
+ hConsoleOut=GetStdHandle (STD_OUTPUT_HANDLE);
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_TYPE_HELP1);
+ return 0;
+ }
+
+ if (!*param)
+ {
+ error_req_param_missing ();
+ return 1;
+ }
+
+ argv = split (param, &argc, TRUE);
+
+ for(i = 0; i < argc; i++)
+ {
+ if(*argv[i] == _T('/') && _tcslen(argv[i]) >= 2 && _totupper(argv[i][1]) == _T('P'))
+ {
+ bPaging = TRUE;
+ }
+ }
+
+ for (i = 0; i < argc; i++)
+ {
+ if (_T('/') == argv[i][0] && _totupper(argv[i][1]) != _T('P'))
+ {
+ LoadString(CMD_ModuleHandle, STRING_TYPE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
+ ConErrPrintf(szMsg, argv[i] + 1);
+ continue;
+ }
+
+ nErrorLevel = 0;
+
+ hFile = CreateFile(argv[i],
+ GENERIC_READ,
+ FILE_SHARE_READ,NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,NULL);
+
+ if(hFile == INVALID_HANDLE_VALUE)
+ {
+ FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_IGNORE_INSERTS |
+ FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &errmsg,
+ 0,
+ NULL);
+ ConErrPrintf (_T("%s - %s"), argv[i], errmsg);
+ LocalFree (errmsg);
+ nErrorLevel = 1;
+ continue;
+ }
+
+ do
+ {
+ bRet = FileGetString (hFile, buff, sizeof(buff) / sizeof(TCHAR));
+ if(bPaging)
+ {
+ if(bRet)
+ {
+ if (ConOutPrintfPaging(bFirstTime, buff) == 1)
+ {
+ bCtrlBreak = FALSE;
+ return 0;
+ }
+ }
+ }
+ else
+ {
+ if(bRet)
+ ConOutPrintf(buff);
+ }
+ bFirstTime = FALSE;
+
+ } while(bRet);
+
+ CloseHandle(hFile);
+ }
+
+ freep (argv);
+
+ return 0;
+}
+
+#endif
--- /dev/null
+/*
+ * VER.C - ver internal command.
+ *
+ *
+ * History:
+ *
+ * 06/30/98 (Rob Lake)
+ * rewrote ver command to accept switches, now ver alone prints
+ * copyright notice only.
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added text about where to send bug reports and get updates.
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection safe!
+ *
+ * 26-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * New version info and some output changes.
+ */
+
+#include <precomp.h>
+#include "resource.h"
+#include <reactos/resource.h>
+
+
+VOID ShortVersion (VOID)
+{
+ OSVERSIONINFO VersionInfo;
+ unsigned RosVersionLen;
+ LPTSTR RosVersion;
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+ ConOutResPuts (STRING_CMD_SHELLINFO );
+ VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+
+ ConOutPrintf(_T("Version %s %s"), _T(KERNEL_RELEASE_STR), _T(KERNEL_VERSION_BUILD_STR));
+
+ memset(VersionInfo.szCSDVersion, 0, sizeof(VersionInfo.szCSDVersion));
+ if (GetVersionEx(&VersionInfo))
+ {
+ RosVersion = VersionInfo.szCSDVersion + _tcslen(VersionInfo.szCSDVersion) + 1;
+ RosVersionLen = sizeof(VersionInfo.szCSDVersion) / sizeof(VersionInfo.szCSDVersion[0]) -
+ (RosVersion - VersionInfo.szCSDVersion);
+ if (7 <= RosVersionLen && 0 == _tcsnicmp(RosVersion, _T("ReactOS"), 7))
+ {
+ LoadString( CMD_ModuleHandle, STRING_VERSION_RUNVER, (LPTSTR) szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf (szMsg, RosVersion);
+ }
+ }
+ ConOutPuts (_T("\n"));
+}
+
+
+#ifdef INCLUDE_CMD_VER
+
+/*
+ * display shell version info internal command.
+ *
+ *
+ */
+INT cmd_ver (LPTSTR cmd, LPTSTR param)
+{
+ INT i;
+
+ nErrorLevel = 0;
+
+ if (_tcsstr (param, _T("/?")) != NULL)
+ {
+ ConOutResPaging(TRUE,STRING_VERSION_HELP1);
+ return 0;
+ }
+
+ ShortVersion();
+ ConOutPuts (_T("Copyright (C) 1994-1998 Tim Norman and others."));
+ ConOutPuts (_T(RES_STR_LEGAL_COPYRIGHT));
+
+ /* Basic copyright notice */
+ if (param[0] == _T('\0'))
+ {
+ ConOutResPuts (STRING_CMD_SHELLINFO );
+ ConOutResPuts(STRING_VERSION_HELP2);
+ }
+ else
+ {
+ for (i = 0; param[i]; i++)
+ {
+ /* skip spaces */
+ if (param[i] == _T(' '))
+ continue;
+
+ if (param[i] == _T('/'))
+ {
+ /* is this a lone '/' ? */
+ if (param[i + 1] == 0)
+ {
+ error_invalid_switch (_T(' '));
+ return 1;
+ }
+ continue;
+ }
+
+ if (_totupper (param[i]) == _T('W'))
+ {
+ /* Warranty notice */
+ ConOutResPuts(STRING_VERSION_HELP3);
+ }
+ else if (_totupper (param[i]) == _T('R'))
+ {
+ /* Redistribution notice */
+ ConOutResPuts(STRING_VERSION_HELP4);
+ }
+ else if (_totupper (param[i]) == _T('C'))
+ {
+ /* Developer listing */
+ ConOutResPuts(STRING_VERSION_HELP6);
+ ConOutResPuts(STRING_FREEDOS_DEV);
+ ConOutResPuts(STRING_VERSION_HELP7);
+ ConOutResPuts(STRING_REACTOS_DEV);
+ }
+ else
+ {
+ error_invalid_switch ((TCHAR)_totupper (param[i]));
+ return 1;
+ }
+ }
+ }
+
+ ConOutResPuts(STRING_VERSION_HELP5);
+ return 0;
+}
+
+#endif
--- /dev/null
+/*
+ * VERIFY.C - verify internal command.
+ *
+ *
+ * History:
+ *
+ * 31 Jul 1998 (John P Price)
+ * started.
+ *
+ * 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * VERIFY is just a dummy under Win32; it only exists
+ * for compatibility!!!
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode and redirection ready!
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_VERIFY
+
+
+/* global verify flag */
+static BOOL bVerify = FALSE;
+
+
+INT cmd_verify (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_VERIFY_HELP1);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ if (!*param)
+ {
+ LoadString(CMD_ModuleHandle, STRING_VERIFY_HELP2, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, bVerify ? D_ON : D_OFF);
+ }
+ else if (_tcsicmp (param, D_OFF) == 0)
+ bVerify = FALSE;
+ else if (_tcsicmp (param, D_ON) == 0)
+ bVerify = TRUE;
+ else
+ {
+ ConOutResPuts(STRING_VERIFY_HELP3);
+ }
+
+ return 0;
+}
+
+#endif
--- /dev/null
+/*
+ * VOL.C - vol internal command.
+ *
+ *
+ * History:
+ *
+ * 03-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Replaced DOS calls by Win32 calls.
+ *
+ * 08-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added help text ("/?").
+ *
+ * 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Cleanup.
+ *
+ * 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Unicode ready!
+ *
+ * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Redirection ready!
+ */
+
+#include <precomp.h>
+#include "resource.h"
+
+#ifdef INCLUDE_CMD_VOL
+
+
+static INT
+PrintVolumeHeader (LPTSTR pszRootPath)
+{
+ TCHAR szMsg[RC_STRING_MAX_SIZE];
+ TCHAR szVolName[80];
+ DWORD dwSerialNr;
+
+ /* get the volume information of the drive */
+ if(!GetVolumeInformation (pszRootPath,
+ szVolName,
+ 80,
+ &dwSerialNr,
+ NULL,
+ NULL,
+ NULL,
+ 0))
+ {
+ ErrorMessage (GetLastError (), _T(""));
+ return 1;
+ }
+
+ /* print drive info */
+ if (szVolName[0] != '\0')
+ {
+ LoadString(CMD_ModuleHandle, STRING_VOL_HELP1, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, pszRootPath[0],szVolName);
+ }
+ else
+ {
+ LoadString(CMD_ModuleHandle, STRING_VOL_HELP2, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, pszRootPath[0]);
+ }
+
+ /* print the volume serial number */
+ LoadString(CMD_ModuleHandle, STRING_VOL_HELP3, szMsg, RC_STRING_MAX_SIZE);
+ ConOutPrintf(szMsg, HIWORD(dwSerialNr), LOWORD(dwSerialNr));
+ return 0;
+}
+
+
+INT cmd_vol (LPTSTR cmd, LPTSTR param)
+{
+ TCHAR szRootPath[] = _T("A:\\");
+ TCHAR szPath[MAX_PATH];
+
+ if (!_tcsncmp (param, _T("/?"), 2))
+ {
+ ConOutResPaging(TRUE,STRING_VOL_HELP4);
+ return 0;
+ }
+
+ nErrorLevel = 0;
+
+ if (param[0] == _T('\0'))
+ {
+ GetCurrentDirectory (MAX_PATH, szPath);
+ szRootPath[0] = szPath[0];
+ }
+ else
+ {
+ _tcsupr (param);
+ if (param[1] == _T(':'))
+ szRootPath[0] = param[0];
+ else
+ {
+ error_invalid_drive ();
+ nErrorLevel = 1;
+ return 1;
+ }
+ }
+
+ if (!IsValidPathName (szRootPath))
+ {
+ error_invalid_drive ();
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ /* print the header */
+ if (!PrintVolumeHeader (szRootPath))
+ {
+ nErrorLevel = 1;
+ return 1;
+ }
+
+ return 0;
+}
+
+#endif
--- /dev/null
+/*
+ * WHERE.C - file search functions.
+ *
+ *
+ * History:
+ *
+ * 07/15/95 (Tim Norman)
+ * started.
+ *
+ * 08/08/95 (Matt Rains)
+ * i have cleaned up the source code. changes now bring this source
+ * into guidelines for recommended programming practice.
+ *
+ * 12/12/95 (Steffan Kaiser & Tim Norman)
+ * added some patches to fix some things and make more efficient
+ *
+ * 1/6/96 (Tim Norman)
+ * fixed a stupid pointer mistake...
+ * Thanks to everyone who noticed it!
+ *
+ * 8/1/96 (Tim Norman)
+ * fixed a bug when getenv returns NULL
+ *
+ * 8/7/96 (Steffan Kaiser and Tim Norman)
+ * speed improvements and bug fixes
+ *
+ * 8/27/96 (Tim Norman)
+ * changed code to use pointers directly into PATH environment
+ * variable rather than making our own copy. This saves some memory,
+ * but requires we write our own function to copy pathnames out of
+ * the variable.
+ *
+ * 12/23/96 (Aaron Kaufman)
+ * Fixed a bug in get_paths() that did not point to the first PATH
+ * in the environment variable.
+ *
+ * 7/12/97 (Tim Norman)
+ * Apparently, Aaron's bugfix got lost, so I fixed it again.
+ *
+ * 16 July 1998 (John P. Price)
+ * Added stand alone code.
+ *
+ * 17 July 1998 (John P. Price)
+ * Rewrote find_which to use searchpath function
+ *
+ * 24-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * fixed bug where didn't check all extensions when path was specified
+ *
+ * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * added config.h include
+ *
+ * 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
+ * fixed so that it find_which returns NULL if filename is not
+ * executable (does not have .bat, .com, or .exe extention).
+ * Before command would to execute any file with any extension (opps!)
+ *
+ * 03-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Changed find_which().
+ *
+ * 07-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Added ".CMD" extension.
+ * Replaced numeric constant by _NR_OF_EXTENSIONS.
+ *
+ * 26-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Replaced find_which() by SearchForExecutable().
+ * Now files are searched using the right extension order.
+ *
+ * 20-Apr-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ * Some minor changes and improvements.
+ *
+
+ * 10-Jul-2004 (Jens Collin <jens.collin@lakhei.com>)
+ * Fixed searxhing for files with specific extensions in PATHEXT order..
+ *
+ */
+
+#include <precomp.h>
+
+
+/* initial size of environment variable buffer */
+#define ENV_BUFFER_SIZE 1024
+
+
+/* searches for file using path info. */
+
+BOOL
+SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtension)
+{
+ TCHAR szPathBuffer[CMDLINE_LENGTH];
+ LPTSTR pszBuffer = NULL;
+ DWORD dwBuffer, len;
+ LPTSTR s,f;
+ /* initialize full name buffer */
+ *pFullName = _T('\0');
+
+#ifdef _DEBUG
+ DebugPrintf (_T("SearchForExecutableSingle: \'%s\' with ext: \'%s\'\n"), pFileName, pExtension);
+#endif
+
+ /* Check if valid directly on specified path */
+ if (_tcschr (pFileName, _T('\\')) != NULL)
+ {
+ LPTSTR pFilePart;
+#ifdef _DEBUG
+ DebugPrintf (_T("Absolute or relative path is given.\n"));
+#endif
+
+ if (GetFullPathName (pFileName,
+ CMDLINE_LENGTH,
+ szPathBuffer,
+ &pFilePart) ==0)
+ return FALSE;
+
+ if(pFilePart == 0)
+ return FALSE;
+ /* Add extension and test file: */
+ if (pExtension)
+ _tcscat(szPathBuffer, pExtension);
+
+ if (IsExistingFile (szPathBuffer))
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
+#endif
+ _tcscpy (pFullName, szPathBuffer);
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ /* search in current directory */
+ len = GetCurrentDirectory (CMDLINE_LENGTH, szPathBuffer);
+ if (szPathBuffer[len - 1] != _T('\\'))
+ {
+ szPathBuffer[len] = _T('\\');
+ szPathBuffer[len + 1] = _T('\0');
+ }
+ _tcscat (szPathBuffer, pFileName);
+
+ if (pExtension)
+ _tcscat (szPathBuffer, pExtension);
+
+ if (IsExistingFile (szPathBuffer))
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
+#endif
+ _tcscpy (pFullName, szPathBuffer);
+ return TRUE;
+ }
+
+
+
+ /* load environment varable PATH into buffer */
+ pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
+ dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE);
+ if (dwBuffer > ENV_BUFFER_SIZE)
+ {
+ pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR));
+ GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer);
+ }
+
+
+ /* search in PATH */
+ s = pszBuffer;
+ while (s && *s)
+ {
+ f = _tcschr (s, _T(';'));
+
+ if (f)
+ {
+ _tcsncpy (szPathBuffer, s, (size_t)(f-s));
+ szPathBuffer[f-s] = _T('\0');
+ s = f + 1;
+ }
+ else
+ {
+ _tcscpy (szPathBuffer, s);
+ s = NULL;
+ }
+
+ len = _tcslen(szPathBuffer);
+ if (szPathBuffer[len - 1] != _T('\\'))
+ {
+ szPathBuffer[len] = _T('\\');
+ szPathBuffer[len + 1] = _T('\0');
+ }
+ _tcscat (szPathBuffer, pFileName);
+
+ if (pExtension)
+ _tcscat (szPathBuffer, pExtension);
+
+ if (IsExistingFile (szPathBuffer))
+ {
+#ifdef _DEBUG
+ DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
+#endif
+ free (pszBuffer);
+ _tcscpy (pFullName, szPathBuffer);
+ return TRUE;
+ }
+ }
+ free (pszBuffer);
+ return FALSE;
+}
+
+
+BOOL
+SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
+{
+ static TCHAR pszDefaultPathExt[] = _T(".COM;.EXE;.BAT;.CMD");
+ LPTSTR pszBuffer = NULL;
+ LPTSTR pCh;
+ LPTSTR pExt;
+ DWORD dwBuffer;
+#ifdef _DEBUG
+ DebugPrintf (_T("SearchForExecutable: \'%s\'\n"), pFileName);
+#endif
+ /* load environment varable PATHEXT */
+ pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
+ dwBuffer = GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, ENV_BUFFER_SIZE);
+ if (dwBuffer > ENV_BUFFER_SIZE)
+ {
+ pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR));
+ GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, dwBuffer);
+ }
+ else if (0 == dwBuffer)
+ {
+ _tcscpy(pszBuffer, pszDefaultPathExt);
+ }
+
+#ifdef _DEBUG
+ DebugPrintf (_T("SearchForExecutable(): Loaded PATHEXT: %s\n"), pszBuffer);
+#endif
+
+ pExt = _tcsrchr(pFileName, _T('.'));
+ if (pExt != NULL)
+ {
+ LPTSTR pszBuffer2;
+ pszBuffer2 = _tcsdup(pszBuffer);
+ if (pszBuffer2)
+ {
+ pCh = _tcstok(pszBuffer2, _T(";"));
+ while (pCh)
+ {
+ if (0 == _tcsicmp(pCh, pExt))
+ {
+ free(pszBuffer);
+ free(pszBuffer2);
+ return SearchForExecutableSingle(pFileName, pFullName, NULL);
+ }
+ pCh = _tcstok(NULL, _T(";"));
+ }
+ free(pszBuffer2);
+ }
+ }
+
+ pCh = _tcstok(pszBuffer, _T(";"));
+ while (pCh)
+ {
+ if (SearchForExecutableSingle(pFileName, pFullName, pCh))
+ {
+ free(pszBuffer);
+ return TRUE;
+ }
+ pCh = _tcstok(NULL, _T(";"));
+ }
+
+ free(pszBuffer);
+ return FALSE;
+}
+
+/* EOF */
--- /dev/null
+/* $Id$
+ *
+ * WINDOW.C - activate & window internal commands.
+ *
+ * clone from 4nt activate command
+ *
+ * 10 Sep 1999 (Paolo Pantaleo)
+ * started (window command in WINDOW.c)
+ *
+ * 29 Sep 1999 (Paolo Pantaleo)
+ * activate and window in a single file using mainly the same code
+ * (nice size optimization :)
+ *
+ * 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
+ * Remove all hardcode string to En.rc
+ */
+
+
+#include <precomp.h>
+#include "resource.h"
+
+#if ( defined(INCLUDE_CMD_WINDOW) || defined(INCLUDE_CMD_ACTIVATE) )
+
+
+#define A_MIN 0x01
+#define A_MAX 0x02
+#define A_RESTORE 0x04
+#define A_POS 0x08
+#define A_SIZE 0x10
+#define A_CLOSE 0x20
+
+
+/*service funciton to perform actions on windows
+
+ param is a string to parse for options/actions
+ hWnd is the handle of window on wich perform actions
+
+*/
+
+static INT ServiceActivate (LPTSTR param, HWND hWnd)
+{
+ LPTSTR *p = 0, p_tmp;
+ INT argc = 0, i;
+ INT iAction = 0;
+ LPTSTR title = 0;
+ WINDOWPLACEMENT wp;
+ RECT pos;
+ LPTSTR tmp;
+
+
+ if (*param)
+ p = split(param, &argc, FALSE);
+
+ for (i = 0; i < argc; i++)
+ {
+ p_tmp = p[i];
+ if (*p_tmp == _T('/'))
+ p_tmp++;
+
+ if (_tcsicmp(p_tmp, _T("min")) == 0)
+ {
+ iAction |= A_MIN;
+ continue;
+ }
+
+ if (_tcsicmp(p_tmp, _T("max")) == 0)
+ {
+ iAction |= A_MAX;
+ continue;
+ }
+
+ if (_tcsicmp(p_tmp, _T("restore")) == 0)
+ {
+ iAction |= A_RESTORE;
+ continue;
+ }
+
+ if (_tcsicmp(p_tmp, _T("close")) == 0)
+ {
+ iAction |= A_CLOSE;
+ continue;
+ }
+
+ if (_tcsnicmp(p_tmp, _T("pos"), 3) == 0)
+ {
+ iAction |= A_POS;
+ tmp = p_tmp+3;
+ if (*tmp == _T('='))
+ tmp++;
+
+ pos.left= _ttoi(tmp);
+ if(!(tmp=_tcschr(tmp, _T(','))))
+ {
+ error_invalid_parameter_format(p[i]);
+ freep(p);
+ return 1;
+ }
+
+ pos.top = _ttoi (++tmp);
+ if(!(tmp=_tcschr(tmp, _T(','))))
+ {
+ error_invalid_parameter_format(p[i]);
+ freep(p);
+ return 1;
+ }
+
+ pos.right = _ttoi(++tmp) + pos.left;
+ if (!(tmp = _tcschr(tmp, _T(','))))
+ {
+ error_invalid_parameter_format(p[i]);
+ freep(p);
+ return 1;
+ }
+ pos.bottom = _ttoi(++tmp) + pos.top;
+ continue;
+ }
+
+ if (_tcsnicmp(p_tmp, _T("size"), 4)==0)
+ {
+ iAction |=A_SIZE;
+ continue;
+ }
+
+ /* none of them=window title */
+ if (title)
+ {
+ error_invalid_parameter_format(p[i]);
+ freep(p);
+ return 1;
+ }
+
+ if (p_tmp[0] == _T('"'))
+ {
+ title = (p_tmp + 1);
+ *_tcschr(p_tmp + 1, _T('"')) = 0;
+ continue;
+ }
+ title = p_tmp;
+ }
+
+ if (title)
+ SetWindowText(hWnd, title);
+
+ wp.length = sizeof(WINDOWPLACEMENT);
+ GetWindowPlacement(hWnd, &wp);
+
+ if (iAction & A_POS)
+ wp.rcNormalPosition = pos;
+
+ if (iAction & A_MIN)
+ wp.showCmd = SW_MINIMIZE;
+
+ if (iAction & A_MAX)
+ wp.showCmd = SW_SHOWMAXIMIZED;
+
+ /*if no actions are specified default is SW_RESTORE*/
+ if ((iAction & A_RESTORE) || (!iAction))
+ wp.showCmd = SW_RESTORE;
+
+ if (iAction & A_CLOSE)
+ {
+#ifdef _DEBUG
+ ConErrPrintf(_T("!!!FIXME: CLOSE Not implemented!!!\n"));
+#endif
+ }
+
+ wp.length = sizeof(WINDOWPLACEMENT);
+ SetWindowPlacement(hWnd, &wp);
+
+ if (p)
+ freep(p);
+
+ return 0;
+}
+
+
+
+
+INT CommandWindow (LPTSTR cmd, LPTSTR param)
+{
+ HWND hwnd;
+
+ if (_tcsncmp (param, _T("/?"), 2) == 0)
+ {
+ ConOutResPaging(TRUE,STRING_WINDOW_HELP1);
+ return 0;
+ }
+
+ hwnd = GetConsoleWindow();
+ Sleep(0);
+ return ServiceActivate(param, hwnd);
+}
+
+
+INT CommandActivate (LPTSTR cmd, LPTSTR param)
+{
+ HWND hwnd;
+ LPTSTR *arg;
+ INT argc;
+
+ if (_tcsncmp (param, _T("/?"), 2) == 0)
+ {
+ ConOutResPaging(TRUE,STRING_WINDOW_HELP2);
+ return 0;
+ }
+
+ if(!(*param))
+ return 1;
+
+ /*Split the user input into array*/
+ arg = split (param, &argc, FALSE);
+ if(argc < 2)
+ {
+ if(arg != NULL)
+ freep(arg);
+ }
+ hwnd = FindWindow(NULL, arg[0]);
+ if (hwnd == NULL)
+ {
+ if(arg != NULL)
+ freep(arg);
+ ConErrResPuts(STRING_WINDOW_ERROR1);
+ return 1;
+ }
+ if(arg != NULL)
+ freep(arg);
+
+ return ServiceActivate(param, hwnd);
+}
+
+#endif /* ( defined(INCLUDE_CMD_WINDOW) || defined(INCLUDE_CMD_ACTIVATE) ) */
--- /dev/null
+# Doxyfile 1.3.9.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = "ROS Explorer"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = doxy-doc
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of source
+# files, where putting all generated files in the same directory would otherwise
+# cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = YES
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is used
+# as the annotated text. Otherwise, the brief description is used as-is. If left
+# blank, the following values are used ("$name" is automatically replaced with the
+# name of the entity): "The $name class" "The $name widget" "The $name file"
+# "is" "provides" "specifies" "contains" "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
+# members of a class in the documentation of that class as if those members were
+# ordinary class members. Constructors, destructors and assignment operators of
+# the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = YES
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources
+# only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation.
+
+SHOW_DIRECTORIES = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = NO
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = . \
+ desktop \
+ dialogs \
+ shell \
+ taskbar \
+ utility
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
+# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
+
+FILE_PATTERNS = *.cpp \
+ *.c \
+ *.hpp \
+ *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
+# that are symbolic links (a Unix filesystem feature) are excluded from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER = doxy-footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 240
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = YES
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = __cplusplus
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse the
+# parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or
+# super classes. Setting the tag to NO turns the diagrams off. Note that this
+# option is superseded by the HAVE_DOT option below. This is only a fallback. It is
+# recommended to install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = NO
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = YES
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found on the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes that
+# lay further from the root node will be omitted. Note that setting this option to
+# 1 or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that a graph may be further truncated if the graph's image dimensions are
+# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT).
+# If 0 is used for the depth value (the default), the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = YES
--- /dev/null
+# Doxyfile 1.3.9.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = "ROS Explorer"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = doxy-doc
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of source
+# files, where putting all generated files in the same directory would otherwise
+# cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = YES
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is used
+# as the annotated text. Otherwise, the brief description is used as-is. If left
+# blank, the following values are used ("$name" is automatically replaced with the
+# name of the entity): "The $name class" "The $name widget" "The $name file"
+# "is" "provides" "specifies" "contains" "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
+# members of a class in the documentation of that class as if those members were
+# ordinary class members. Constructors, destructors and assignment operators of
+# the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = YES
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources
+# only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation.
+
+SHOW_DIRECTORIES = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = NO
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = . \
+ desktop \
+ dialogs \
+ shell \
+ taskbar \
+ utility
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
+# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
+
+FILE_PATTERNS = *.cpp \
+ *.c \
+ *.hpp \
+ *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
+# that are symbolic links (a Unix filesystem feature) are excluded from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER = doxy-footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 240
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = YES
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = __cplusplus
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse the
+# parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or
+# super classes. Setting the tag to NO turns the diagrams off. Note that this
+# option is superseded by the HAVE_DOT option below. This is only a fallback. It is
+# recommended to install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = NO
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = YES
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found on the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes that
+# lay further from the root node will be omitted. Note that setting this option to
+# 1 or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that a graph may be further truncated if the graph's image dimensions are
+# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT).
+# If 0 is used for the depth value (the default), the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = YES
--- /dev/null
+#
+# Jamfile for Explorer to be used with Boost Build V2
+#
+
+
+# import rc ;
+import rc-mingw ;
+
+
+EXPAT_INC = [ modules.peek : EXPAT_INC ] ;
+
+exe explorer :
+ explorer.cpp
+ explorer_intres.rc
+ shell/entries.cpp
+ shell/filechild.cpp
+ shell/mainframe.cpp
+ shell/pane.cpp
+ shell/shellbrowser.cpp
+ shell/shellfs.cpp
+ shell/unixfs.cpp
+ shell/winfs.cpp
+ shell/ntobjfs.cpp
+ shell/regfs.cpp
+ shell/fatfs.cpp
+ shell/webchild.cpp
+ services/startup.c
+ services/shellservices.cpp
+ taskbar/desktopbar.cpp
+ taskbar/quicklaunch.cpp
+ taskbar/startmenu.cpp
+ taskbar/taskbar.cpp
+ taskbar/traynotify.cpp
+ taskbar/favorites.cpp
+ desktop/desktop.cpp
+# utility/splitpath.c
+ utility/dragdropimpl.cpp
+ utility/shellbrowserimpl.cpp
+ utility/shellclasses.cpp
+ utility/utility.cpp
+ utility/window.cpp
+ utility/xmlstorage.cpp
+ dialogs/searchprogram.cpp
+ dialogs/settings.cpp
+ i386-stub-win32.c
+ : <define>WIN32 <define>_WIN32_IE=0x0600 <define>_WIN32_WINNT=0x0501 <define>WINVER=0x0500
+ <include>. <include>$(EXPAT_INC)
+# only for GCC: <cxxflags>-fexceptions <cxxflags>-Wall <cxxflags>-Wno-unused-value
+ <find-shared-library>gdi32
+ <find-shared-library>ole32
+ <find-shared-library>comctl32
+ <find-shared-library>uuid
+ <find-shared-library>wsock32
+ <find-shared-library>oleaut32
+ <find-shared-library>msimg32
+# <find-shared-library>expat
+ <linkflags>notifyhook.dll
+ <linkflags>libexpat.dll
+ ;
+
--- /dev/null
+#\r
+# ReactOS shell\r
+#\r
+# Makefile.PCH\r
+#\r
+# MinGW Makefile with precompiled header support\r
+#\r
+\r
+CC = gcc\r
+CXX = g++\r
+LINK = g++\r
+\r
+CFLAGS = -DWIN32 -DROSSHELL -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I. -I$(EXPAT_INC)\r
+RCFLAGS = -DWIN32 -DROSSHELL -D__WINDRES__\r
+LFLAGS = -Wl,--subsystem,windows\r
+\r
+ifdef DEBUG\r
+CFLAGS += -D_DEBUG -g\r
+RCFLAGS += -D_DEBUG\r
+LFLAGS += -g\r
+else\r
+CFLAGS += -DNDEBUG -Os #-march=pentium4\r
+RCFLAGS += -DNDEBUG\r
+LFLAGS += -s\r
+endif\r
+\r
+ifndef UNICODE\r
+UNICODE = 1\r
+endif\r
+\r
+ifeq ($(UNICODE),1)\r
+CFLAGS += -DUNICODE\r
+# LFLAGS+= -Wl,--entry,_wWinMain@16\r
+RCFLAGS += -DUNICODE\r
+endif\r
+\r
+CXXFLAGS = $(CFLAGS)\r
+\r
+EXEC_SUFFIX = .exe\r
+RES_SUFFIX = .coff\r
+\r
+VPATH = shell utility taskbar desktop dialogs services\r
+\r
+PROGRAM = rosshell\r
+\r
+TARGET = $(PROGRAM)$(EXEC_SUFFIX)\r
+\r
+OBJECTS = \\r
+ startup.o \\r
+ shellclasses.o \\r
+ utility.o \\r
+ window.o \\r
+ dragdropimpl.o \\r
+ shellbrowserimpl.o \\r
+ explorer.o \\r
+ entries.o \\r
+ winfs.o \\r
+ shellfs.o \\r
+ pane.o \\r
+ desktop.o \\r
+ desktopbar.o \\r
+ taskbar.o \\r
+ startmenu.o \\r
+ shellservices.o \\r
+ traynotify.o \\r
+ quicklaunch.o \\r
+ favorites.o \\r
+ searchprogram.o \\r
+ settings.o \\r
+ i386-stub-win32.o \\r
+ xmlstorage.o\r
+\r
+LIBS = gdi32 comctl32 msimg32 ole32 uuid\r
+DELAYIMPORTS = oleaut32 wsock32\r
+\r
+all: precomp.h.gch $(TARGET)\r
+\r
+precomp.h.gch: *.h utility/*.h shell/*.h desktop/*.h\r
+ $(CXX) $(CFLAGS) precomp.h\r
+\r
+$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll\r
+ $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS))\r
+\r
+$(PROGRAM)$(RES_SUFFIX): explorer_intres.rc res/*.bmp res/*.ico\r
+ windres $(RCFLAGS) -o $@ explorer_intres.rc\r
+\r
+notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h\r
+ $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@\r
+\r
+clean:\r
+ rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) precomp.h.gch \\r
+ desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o\r
--- /dev/null
+#\r
+# ReactOS shell\r
+#\r
+# Makefile\r
+#\r
+\r
+PATH_TO_TOP := ../../..\r
+\r
+TARGET_TYPE := program\r
+\r
+TARGET_APPTYPE := windows\r
+\r
+TARGET_NAME := rosshell\r
+\r
+TARGET_INSTALLDIR := .\r
+\r
+TARGET_CFLAGS := \\r
+ -D__USE_W32API -DWIN32 -D_ROS_ \\r
+ -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 \\r
+ -DUNICODE -fexceptions -Wall -g \\r
+ -I../../../include/expat\r
+\r
+TARGET_CPPFLAGS := $(TARGET_CFLAGS)\r
+\r
+TARGET_RCFLAGS := -D__USE_W32API -DWIN32 -D_ROS_ -D__WINDRES__\r
+\r
+TARGET_SDKLIBS := \\r
+ gdi32.a user32.a comctl32.a ole32.a oleaut32.a shell32.a expat.a \\r
+ notifyhook.a ws2_32.a msimg32.a\r
+\r
+TARGET_GCCLIBS := stdc++ uuid\r
+\r
+TARGET_OBJECTS := \\r
+ explorer.o \\r
+ i386-stub-win32.o \\r
+ desktop/desktop.o \\r
+ dialogs/searchprogram.o \\r
+ dialogs/settings.o \\r
+ shell/entries.o \\r
+ shell/shellfs.o \\r
+ shell/pane.o \\r
+ shell/winfs.o \\r
+ services/startup.o \\r
+ services/shellservices.o \\r
+ taskbar/desktopbar.o \\r
+ taskbar/taskbar.o \\r
+ taskbar/startmenu.o \\r
+ taskbar/traynotify.o \\r
+ taskbar/quicklaunch.o \\r
+ taskbar/favorites.o \\r
+ utility/shellclasses.o \\r
+ utility/utility.o \\r
+ utility/window.o \\r
+ utility/dragdropimpl.o \\r
+ utility/shellbrowserimpl.o \\r
+ utility/xmlstorage.o\r
+\r
+TARGET_CPPAPP := yes\r
+\r
+TARGET_PCH := precomp.h\r
+\r
+SUBDIRS := notifyhook\r
+\r
+DEP_OBJECTS := $(TARGET_OBJECTS)\r
+\r
+include $(PATH_TO_TOP)/rules.mak\r
+include $(TOOLS_PATH)/helper.mk\r
+include $(TOOLS_PATH)/depend.mk\r
--- /dev/null
+#
+# ReactOS explorer
+#
+# Makefile.MinGW
+#
+
+CC = gcc
+CXX = g++
+LINK = g++
+
+# -D_NO_ALPHABLEND for builds without msimg32.dll dependency
+CFLAGS = -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I. -I$(EXPAT_INC)
+RCFLAGS = -DWIN32 -D__WINDRES__
+LFLAGS = -Wl,--subsystem,windows
+
+ifdef DEBUG
+CFLAGS += -D_DEBUG -g
+RCFLAGS += -D_DEBUG
+LFLAGS += -g
+else
+CFLAGS += -DNDEBUG -Os
+RCFLAGS += -DNDEBUG
+LFLAGS += -s
+endif
+
+ifndef UNICODE
+UNICODE = 1
+endif
+
+ifeq ($(UNICODE),1)
+CFLAGS += -DUNICODE
+# LFLAGS+= -Wl,--entry,_wWinMain@16
+RCFLAGS += -DUNICODE
+endif
+
+CXXFLAGS = $(CFLAGS)
+
+EXEC_SUFFIX = .exe
+RES_SUFFIX = .coff
+
+VPATH = shell utility taskbar desktop dialogs services
+
+PROGRAM = explorer
+
+TARGET = $(PROGRAM)$(EXEC_SUFFIX)
+
+OBJECTS = \
+ startup.o \
+ shellclasses.o \
+ utility.o \
+ window.o \
+ dragdropimpl.o \
+ shellbrowserimpl.o \
+ shellservices.o \
+ explorer.o \
+ entries.o \
+ winfs.o \
+ unixfs.o \
+ shellfs.o \
+ ntobjfs.o \
+ regfs.o \
+ fatfs.o \
+ webchild.o \
+ mainframe.o \
+ filechild.o \
+ pane.o \
+ shellbrowser.o \
+ desktop.o \
+ desktopbar.o \
+ taskbar.o \
+ startmenu.o \
+ traynotify.o \
+ quicklaunch.o \
+ favorites.o \
+ searchprogram.o \
+ settings.o \
+ i386-stub-win32.o \
+ xmlstorage.o
+
+LIBS = gdi32 comctl32 msimg32 ole32 uuid
+DELAYIMPORTS = oleaut32 wsock32
+
+all: $(TARGET)
+
+$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll
+ $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS))
+
+$(PROGRAM)$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico
+ windres $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc
+
+notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h
+ $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@
+
+clean:
+ rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) \
+ desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o
--- /dev/null
+#
+# ReactOS explorer
+#
+# Makefile.PCH
+#
+# MinGW Makefile with precompiled header support
+#
+
+CC = gcc
+CXX = g++
+LINK = g++
+
+CFLAGS = -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I. -I$(EXPAT_INC)
+RCFLAGS = -DWIN32 -D__WINDRES__
+LFLAGS = -Wl,--subsystem,windows
+
+ifdef DEBUG
+CFLAGS += -D_DEBUG -g
+RCFLAGS += -D_DEBUG
+LFLAGS += -g
+else
+CFLAGS += -DNDEBUG -Os #-march=pentium4
+RCFLAGS += -DNDEBUG
+LFLAGS += -s
+endif
+
+ifndef UNICODE
+UNICODE = 1
+endif
+
+ifeq ($(UNICODE),1)
+CFLAGS += -DUNICODE
+# LFLAGS+= -Wl,--entry,_wWinMain@16
+RCFLAGS += -DUNICODE
+endif
+
+CXXFLAGS = $(CFLAGS)
+
+EXEC_SUFFIX = .exe
+RES_SUFFIX = .coff
+
+VPATH = shell utility taskbar desktop dialogs services
+
+PROGRAM = explorer
+
+TARGET = $(PROGRAM)$(EXEC_SUFFIX)
+
+OBJECTS = \
+ startup.o \
+ shellclasses.o \
+ utility.o \
+ window.o \
+ dragdropimpl.o \
+ shellbrowserimpl.o \
+ shellservices.o \
+ explorer.o \
+ entries.o \
+ winfs.o \
+ unixfs.o \
+ shellfs.o \
+ ntobjfs.o \
+ regfs.o \
+ fatfs.o \
+ webchild.o \
+ mainframe.o \
+ filechild.o \
+ pane.o \
+ shellbrowser.o \
+ desktop.o \
+ desktopbar.o \
+ taskbar.o \
+ startmenu.o \
+ traynotify.o \
+ quicklaunch.o \
+ favorites.o \
+ searchprogram.o \
+ settings.o \
+ i386-stub-win32.o \
+ xmlstorage.o
+
+LIBS = gdi32 comctl32 msimg32 ole32 uuid
+DELAYIMPORTS = oleaut32 wsock32
+
+all: precomp.h.gch $(TARGET)
+
+precomp.h.gch: *.h utility/*.h shell/*.h desktop/*.h
+ $(CXX) $(CFLAGS) precomp.h
+
+$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll
+ $(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS))
+
+$(PROGRAM)$(RES_SUFFIX): explorer_intres.rc res/*.bmp res/*.ico
+ windres $(RCFLAGS) -o $@ explorer_intres.rc
+
+notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h
+ $(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@
+
+clean:
+ rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) precomp.h.gch \
+ desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o
--- /dev/null
+TOPSRCDIR = ../..
+TOPOBJDIR = ../..
+SRCDIR = .
+
+MODULE = explorer.exe
+APPMODE = gui
+IMPORTS = shell32 comctl32 msimg32 ole32 user32 gdi32 kernel32 advapi32 oleaut32
+EXTRADEFS = -D__WINE__ -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -D__MINGW32__ -DCINTERFACE
+EXTRA_OBJS = notifyhook.dll libexpat.dll
+EXTRALIBS = $(LIBUUID)
+
+C_SRCS = \
+ services/startup.c \
+ utility/splitpath.c
+
+CPP_SRCS = \
+ explorer.cpp \
+ desktop/desktop.cpp \
+ utility/shellclasses.cpp \
+ utility/utility.cpp \
+ utility/window.cpp \
+ utility/dragdropimpl.cpp \
+ utility/shellbrowserimpl.cpp \
+ utility/xmlstorage.cpp \
+ shell/entries.cpp \
+ shell/winfs.cpp \
+ shell/unixfs.cpp \
+ shell/shellfs.cpp \
+ shell/mainframe.cpp \
+ shell/filechild.cpp \
+ shell/pane.cpp \
+ shell/shellbrowser.cpp \
+ shell/ntobjfs.cpp \
+ shell/regfs.cpp \
+ shell/fatfs.cpp \
+ shell/webchild.cpp \
+ services/shellservices.cpp \
+ taskbar/desktopbar.cpp \
+ taskbar/taskbar.cpp \
+ taskbar/startmenu.cpp \
+ taskbar/traynotify.cpp \
+ taskbar/quicklaunch.cpp \
+ taskbar/favorites.cpp \
+ dialogs/searchprogram.cpp \
+ dialogs/settings.cpp
+
+RC_SRCS = explorer_intres.rc
+EXTRARCFLAGS = -D__WRC__ -D_WIN32
+
+
+# Global rules for building a Winelib program -*-Makefile-*-
+#
+# Each individual makefile should define the following variables:
+# MODULE : name of the main module being built
+# APPMODE : program mode (cui,gui,cuiw,guiw)
+# EXTRALIBS : extra libraries to link in (optional)
+# EXTRADEFS : extra symbol definitions, like -DWINELIB (optional)
+#
+# plus all variables required by the global Make.rules.in
+#
+
+DEFS = -D_REENTRANT -fPIC $(EXTRADEFS)
+LDDLLFLAGS = -Wl,-Bsymbolic,-z,defs
+ALL_OBJS = $(OBJS) $(MODULE).dbg.o
+ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LDFLAGS) $(LIBS)
+BASEMODULE = $(MODULE:.exe=)
+TESTIMPORTS = $(DELAYIMPORTS) $(IMPORTS)
+RUNTESTFLAGS= -q -P wine -T $(TOPOBJDIR) $(PLTESTPROGRAM:%=-p %)
+
+
+# Global rules shared by all makefiles -*-Makefile-*-
+#
+# Each individual makefile must define the following variables:
+# TOPSRCDIR : top-level source directory
+# TOPOBJDIR : top-level object directory
+# SRCDIR : source directory for this module
+# MODULE : name of the module being built
+#
+# Each individual makefile may define the following additional variables:
+# C_SRCS : C sources for the module
+# CPP_SRCS : C++ sources for the module
+# C_SRCS16 : 16-bit C sources for the module
+# RC_SRCS : resource source files
+# EXTRA_SRCS : extra source files for make depend
+# EXTRA_OBJS : extra object files
+# IMPORTS : dlls to import
+# DELAYIMPORTS : dlls to import in delayed mode
+# SUBDIRS : subdirectories that contain a Makefile
+# EXTRASUBDIRS : subdirectories that do not contain a Makefile
+# INSTALLSUBDIRS : subdirectories to run make install/uninstall into
+
+# First some useful definitions
+
+SHELL = /bin/sh
+CC = gcc
+CXX = g++
+CPP = gcc -E
+#CFLAGS = -g -O2
+CFLAGS = -g
+CPPFLAGS =
+LIBS = -lm -lstdc++
+YACC = bison -y
+LEX = flex
+LEXLIB = -lfl
+EXEEXT =
+OBJEXT = o
+LIBEXT = so
+DLLEXT = .so
+IMPLIBEXT = def
+LDSHARED = $(CC) -shared $(SONAME:%=-Wl,-soname,%)
+DLLTOOL = false
+DLLWRAP =
+AR = ar rc
+RANLIB = ranlib
+STRIP = strip
+WINDRES = mingw32-windres
+LN = ln
+LN_S = ln -s
+TOOLSDIR = $(TOPOBJDIR)
+AS = as
+LD = ld
+LDFLAGS =
+LDCOMBINE = $(LD) -r
+RM = rm -f
+MV = mv
+LINT =
+LINTFLAGS =
+INCLUDES = -I$(SRCDIR) -I. -I$(TOPSRCDIR)/include -I$(TOPOBJDIR)/include $(EXTRAINCL)
+EXTRACFLAGS = -mpreferred-stack-boundary=2 -fno-strict-aliasing -gstabs+ -Wpointer-arith
+ALLCFLAGS = $(INCLUDES) $(DEFS) $(EXTRACFLAGS) $(CPPFLAGS) $(CFLAGS)
+ALLLINTFLAGS = $(INCLUDES) $(DEFS) $(LINTFLAGS)
+MKINSTALLDIRS= $(TOPSRCDIR)/tools/mkinstalldirs -m 755
+WINAPI_CHECK = $(TOPSRCDIR)/tools/winapi_check/winapi_check
+WINEWRAPPER = $(TOPSRCDIR)/tools/winewrapper
+C2MAN = $(TOPSRCDIR)/tools/c2man.pl
+RUNTEST = $(TOPSRCDIR)/tools/runtest
+WINEBUILD = $(TOOLSDIR)/tools/winebuild/winebuild
+MAKEDEP = $(TOOLSDIR)/tools/makedep
+WRC = $(TOOLSDIR)/tools/wrc/wrc
+WMC = $(TOOLSDIR)/tools/wmc/wmc
+WIDL = $(TOOLSDIR)/tools/widl/widl
+RC = $(WRC)
+RC16 = $(WRC)
+RCFLAGS = --nostdinc $(INCLUDES) $(EXTRARCFLAGS)
+RC16FLAGS = -O res16 $(RCFLAGS)
+LDPATH = LD_LIBRARY_PATH="$(TOOLSDIR)/libs/unicode:$$LD_LIBRARY_PATH"
+DLLDIR = $(TOPOBJDIR)/dlls
+LIBDIR = $(TOPOBJDIR)/libs
+LIBPORT = -L$(TOPOBJDIR)/libs/port -lwine_port
+LIBUNICODE = -L$(TOPOBJDIR)/libs/unicode -lwine_unicode
+LIBUUID = -L$(TOPOBJDIR)/libs/uuid -lwine_uuid
+LIBWINE = -L$(TOPOBJDIR)/libs/wine -lwine
+
+
+
+# Installation infos
+
+INSTALL = /usr/bin/install -c $(INSTALL_FLAGS)
+INSTALL_PROGRAM = ${INSTALL} $(INSTALL_PROGRAM_FLAGS)
+INSTALL_SCRIPT = ${INSTALL} $(INSTALL_SCRIPT_FLAGS)
+INSTALL_DATA = ${INSTALL} -m 644 $(INSTALL_DATA_FLAGS)
+prefix = /usr/local
+exec_prefix = ${prefix}
+bindir = ${exec_prefix}/bin
+libdir = ${exec_prefix}/lib
+datadir = ${prefix}/share
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+sysconfdir = ${prefix}/etc
+includedir = ${prefix}/include/wine
+dlldir = ${exec_prefix}/lib/wine
+prog_manext = 1
+api_manext = 3w
+conf_manext = 5
+CLEAN_FILES = *.o *.a *.so *.ln *.$(LIBEXT) \\\#*\\\# *~ *% .\\\#* *.bak *.orig *.rej \
+ *.flc *.spec.c *.spec.def *.dbg.c y.tab.c y.tab.h lex.yy.c core */*.o
+
+OBJS = $(C_SRCS:.c=.o) $(CPP_SRCS:.cpp=.o) $(EXTRA_OBJS)
+
+RCOBJS = $(RC_SRCS:.rc=.res.o)
+LINTS = $(C_SRCS:.c=.ln) $(CPP_SRCS:.cpp=.ln)
+
+# Implicit rules
+
+.SUFFIXES: .mc .rc .mc.rc .res .res.o .coff .spec .spec.c .spec.def .ok
+
+.c.o:
+ $(CC) -c $(ALLCFLAGS) -o $@ $<
+
+.cpp.o:
+ $(CXX) -c $(ALLCFLAGS) -o $@ $<
+
+.s.o:
+ $(AS) -o $@ $<
+
+.mc.mc.rc:
+ $(LDPATH) $(WMC) -i -U -H /dev/null -o $@ $<
+
+.rc.res:
+ $(LDPATH) $(RC) $(RCFLAGS) -fo$@ $<
+
+.res.res.o:
+ $(WINDRES) -i $< -o $@
+
+.rc.coff:
+ $(WINDRES) -i $< -o $@
+
+.spec.spec.c:
+ $(WINEBUILD) $(DEFS) -o $@ --main-module $(MODULE) --spec $<
+
+.spec.spec.def:
+ $(WINEBUILD) $(DEFS) -o $@ --def $<
+
+.c.ln:
+ $(LINT) -c $(ALLLINTFLAGS) $< || ( $(RM) $@ && exit 1 )
+
+.c.ok:
+ $(RUNTEST) $(RUNTESTFLAGS) $< && touch $@
+
+# 'all' target first in case the enclosing Makefile didn't define any target
+
+all: Makefile
+
+filter:
+ @$(TOPSRCDIR)/tools/winapi/make_filter --make $(MAKE) all
+
+.PHONY: all filter
+
+# Rule for main module debug channels
+
+$(MODULE).dbg.c: $(C_SRCS) $(CPP_SRCS) $(C_SRCS16) $(WINEBUILD)
+ $(WINEBUILD) $(DEFS) -o $@ --debug -C$(SRCDIR) $(C_SRCS) $(CPP_SRCS) $(C_SRCS16)
+
+# Rule to rebuild the tools
+
+$(MAKEDEP):
+ cd $(TOOLSDIR)/tools && $(MAKE) `basename $@`
+
+# Rules for makefile
+
+Makefile: Makefile.in $(TOPSRCDIR)/configure
+ @echo Makefile is older than $?, please rerun $(TOPSRCDIR)/configure
+ @exit 1
+
+# Rule for linting
+
+$(MODULE).ln : $(LINTS)
+ if test "$(LINTS)" ; \
+ then \
+ $(LINT) $(ALLLINTFLAGS) -o$(MODULE) $(LINTS) ; \
+ $(MV) llib-l$(MODULE).ln $(MODULE).ln ; \
+ else \
+ $(LINT) $(ALLLINTFLAGS) -C$(MODULE) /dev/null ; \
+ fi
+
+lint:: $(MODULE).ln
+
+# Rules for Windows API checking
+
+winapi_check:: dummy
+ $(WINAPI_CHECK) $(WINAPI_CHECK_FLAGS) $(WINAPI_CHECK_EXTRA_FLAGS) .
+
+.PHONY: winapi_check
+
+# Rules for dependencies
+
+$(SUBDIRS:%=%/__depend__): $(MAKEDEP) dummy
+ cd `dirname $@` && $(MAKE) depend
+
+depend: $(MAKEDEP) $(SUBDIRS:%=%/__depend__)
+ $(MAKEDEP) $(INCLUDES) -C$(SRCDIR) $(C_SRCS) $(CPP_SRCS) $(C_SRCS16) $(RC_SRCS) $(RC_SRCS16) $(MC_SRCS) $(IDL_SRCS) $(EXTRA_SRCS)
+
+.PHONY: depend $(SUBDIRS:%=%/__depend__)
+
+# Rules for cleaning
+
+$(SUBDIRS:%=%/__clean__): dummy
+ cd `dirname $@` && $(MAKE) clean
+
+$(SUBDIRS:%=%/__testclean__): dummy
+ cd `dirname $@` && $(MAKE) testclean
+
+$(EXTRASUBDIRS:%=%/__clean__): dummy
+ -cd `dirname $@` && $(RM) $(CLEAN_FILES)
+
+testclean:: $(SUBDIRS:%=%/__testclean__)
+
+clean:: $(SUBDIRS:%=%/__clean__) $(EXTRASUBDIRS:%=%/__clean__)
+ $(RM) $(CLEAN_FILES) $(RC_SRCS:.rc=.res) $(RC_SRCS16:.rc=.res) $(MC_SRCS:.mc=.mc.rc) $(PROGRAMS)
+
+.PHONY: clean testclean $(SUBDIRS:%=%/__clean__) $(SUBDIRS:%=%/__testclean__) $(EXTRASUBDIRS:%=%/__clean__)
+
+# Rules for installing
+
+$(SUBDIRS:%=%/__install__): dummy
+ cd `dirname $@` && $(MAKE) install
+
+$(SUBDIRS:%=%/__install-lib__): dummy
+ cd `dirname $@` && $(MAKE) install-lib
+
+$(SUBDIRS:%=%/__install-dev__): dummy
+ cd `dirname $@` && $(MAKE) install-dev
+
+$(SUBDIRS:%=%/__uninstall__): dummy
+ cd `dirname $@` && $(MAKE) uninstall
+
+install:: $(INSTALLSUBDIRS:%=%/__install__)
+
+uninstall:: $(INSTALLSUBDIRS:%=%/__uninstall__)
+
+.PHONY: install install-lib install-dev uninstall \
+ $(SUBDIRS:%=%/__install__) $(SUBDIRS:%=%/__uninstall__) \
+ $(SUBDIRS:%=%/__install-lib__) $(SUBDIRS:%=%/__install-dev__)
+
+# Rules for checking that no imports are missing
+
+$(SUBDIRS:%=%/__checklink__): dummy
+ @cd `dirname $@` && $(MAKE) checklink
+
+.PHONY: checklink $(SUBDIRS:%=%/__checklink__)
+
+# Rules for testing
+
+$(SUBDIRS:%=%/__test__): dummy
+ @cd `dirname $@` && $(MAKE) test
+
+$(SUBDIRS:%=%/__crosstest__): dummy
+ @cd `dirname $@` && $(MAKE) crosstest
+
+.PHONY: check test crosstest $(SUBDIRS:%=%/__test__) $(SUBDIRS:%=%/__crosstest__)
+
+# Misc. rules
+
+$(RC_SRCS:.rc=.res) $(RC_SRCS16:.rc=.res): $(WRC)
+
+$(MC_SRCS:.mc=.mc.rc): $(WMC)
+
+$(IDL_SRCS:.idl=.h): $(WIDL)
+
+$(SUBDIRS): dummy
+ @cd $@ && $(MAKE)
+
+dummy:
+
+.PHONY: dummy $(SUBDIRS)
+
+# End of global rules
+
+all: $(MODULE)$(DLLEXT) $(BASEMODULE)$(EXEEXT)
+
+# Rule for main module spec file
+
+$(MODULE).spec.c: $(RC_SRCS:.rc=.res) $(ALL_OBJS) $(WINEBUILD)
+ $(WINEBUILD) $(DEFS) -o $@ --exe $(MODULE) $(APPMODE:%=--exe-mode %) $(RC_SRCS:.rc=.res) $(ALL_OBJS) -L$(DLLDIR) $(DELAYIMPORTS:%=-d%) $(IMPORTS:%=-l%)
+
+# Rules for .so main module
+
+$(MODULE).so: $(MODULE).spec.o $(ALL_OBJS) Makefile.in
+ $(LDSHARED) $(LDDLLFLAGS) $(MODULE).spec.o $(ALL_OBJS) -o $@ $(ALL_LIBS) -lc
+
+$(BASEMODULE): $(WINEWRAPPER)
+ $(RM) $@ && $(LN_S) $(WINEWRAPPER) $@
+
+# Rules for .exe main module
+
+$(MODULE): $(ALL_OBJS) $(RCOBJS) Makefile.in
+ $(CC) $(ALL_OBJS) $(RCOBJS) -o $@ $(DELAYIMPORTS:%=-l%) $(IMPORTS:%=-l%) $(ALL_LIBS)
+
+# Rules for testing
+
+check test:: $(SUBDIRS:%=%/__test__)
+
+$(TESTRESULTS): $(MODULE)$(DLLEXT)
+
+# Rules for installation
+
+.PHONY: install_prog install_prog.so uninstall_prog uninstall_prog.so
+
+install_prog.so: $(MODULE).so dummy
+ $(MKINSTALLDIRS) $(dlldir)
+ $(INSTALL_PROGRAM) $(MODULE).so $(dlldir)/$(MODULE).so
+
+install_prog: $(MODULE) dummy
+ $(MKINSTALLDIRS) $(bindir)
+ $(INSTALL_PROGRAM) $(MODULE) $(bindir)/$(MODULE)
+
+uninstall_prog.so: dummy
+ $(RM) $(dlldir)/$(MODULE).so
+
+uninstall_prog: dummy
+ $(RM) $(bindir)/$(MODULE)
+
+install:: install_prog$(DLLEXT)
+
+uninstall:: uninstall_prog$(DLLEXT)
+
+clean::
+ $(RM) $(BASEMODULE) $(MODULE)
+
+### Dependencies:
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // desktop.cpp
+ //
+ // Martin Fuchs, 09.08.2003
+ //
+
+
+#include <precomp.h>
+
+#include "../resource.h"
+
+#include "../taskbar/desktopbar.h"
+#include "../taskbar/taskbar.h" // for PM_GET_LAST_ACTIVE
+
+
+static BOOL (WINAPI*SetShellWindow)(HWND);
+static BOOL (WINAPI*SetShellWindowEx)(HWND, HWND);
+
+
+#ifdef _USE_HDESK
+
+Desktop::Desktop(HDESK hdesktop/*, HWINSTA hwinsta*/)
+ : _hdesktop(hdesktop)
+// _hwinsta(hwinsta)
+{
+}
+
+Desktop::~Desktop()
+{
+ if (_hdesktop)
+ CloseDesktop(_hdesktop);
+
+// if (_hwinsta)
+// CloseWindowStation(_hwinsta);
+
+ if (_pThread.get()) {
+ _pThread->Stop();
+ _pThread.release();
+ }
+}
+
+#endif
+
+
+Desktops::Desktops()
+ : _current_desktop(0)
+{
+}
+
+Desktops::~Desktops()
+{
+ // show all hidden windows
+ for(iterator it_dsk=begin(); it_dsk!=end(); ++it_dsk)
+ for(WindowSet::iterator it=it_dsk->_windows.begin(); it!=it_dsk->_windows.end(); ++it)
+ ShowWindowAsync(*it, SW_SHOW);
+}
+
+void Desktops::init()
+{
+ resize(DESKTOP_COUNT);
+
+#ifdef _USE_HDESK
+ DesktopPtr& desktop = (*this)[0];
+
+ desktop = DesktopPtr(new Desktop(OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP)));
+#endif
+}
+
+#ifdef _USE_HDESK
+
+void Desktops::SwitchToDesktop(int idx)
+{
+ if (_current_desktop == idx)
+ return;
+
+ DesktopPtr& desktop = (*this)[idx];
+
+ DesktopThread* pThread = NULL;
+
+ if (desktop.get()) {
+ if (desktop->_hdesktop)
+ if (!SwitchDesktop(desktop->_hdesktop))
+ return;
+ } else {
+ FmtString desktop_name(TEXT("Desktop %d"), idx);
+
+ SECURITY_ATTRIBUTES saAttr = {sizeof(SECURITY_ATTRIBUTES), 0, TRUE};
+/*
+ HWINSTA hwinsta = CreateWindowStation(TEXT("ExplorerWinStation"), 0, GENERIC_ALL, &saAttr);
+
+ if (!SetProcessWindowStation(hwinsta))
+ return;
+*/
+ HDESK hdesktop = CreateDesktop(desktop_name, NULL, NULL, 0, GENERIC_ALL, &saAttr);
+ if (!hdesktop)
+ return;
+
+ desktop = DesktopPtr(new Desktop(hdesktop/*, hwinsta*/));
+
+ pThread = new DesktopThread(*desktop);
+ }
+
+ _current_desktop = idx;
+
+ if (pThread) {
+ desktop->_pThread = DesktopThreadPtr(pThread);
+ pThread->Start();
+ }
+}
+
+int DesktopThread::Run()
+{
+ if (!SetThreadDesktop(_desktop._hdesktop))
+ return -1;
+
+ HDESK hDesk_old = OpenInputDesktop(0, FALSE, DESKTOP_SWITCHDESKTOP);
+
+ if (!SwitchDesktop(_desktop._hdesktop))
+ return -1;
+
+ if (!_desktop._hwndDesktop)
+ _desktop._hwndDesktop = DesktopWindow::Create();
+
+ int ret = Window::MessageLoop();
+
+ SwitchDesktop(hDesk_old);
+
+ return ret;
+}
+
+#else // _USE_HDESK
+
+static BOOL CALLBACK SwitchDesktopEnumFct(HWND hwnd, LPARAM lparam)
+{
+ WindowSet& windows = *(WindowSet*)lparam;
+
+ if (hwnd!=g_Globals._hwndDesktopBar && hwnd!=g_Globals._hwndDesktop)
+ if (IsWindowVisible(hwnd))
+ windows.insert(hwnd);
+
+ return TRUE;
+}
+
+void Desktops::SwitchToDesktop(int idx)
+{
+ if (_current_desktop == idx)
+ return;
+
+ Desktop& old_desktop = (*this)[_current_desktop];
+ WindowSet& windows = old_desktop._windows;
+ Desktop& desktop = (*this)[idx];
+
+ windows.clear();
+
+ // collect window handles of all other desktops
+ WindowSet other_wnds;
+ for(const_iterator it1=begin(); it1!=end(); ++it1)
+ for(WindowSet::const_iterator it2=it1->_windows.begin(); it2!=it1->_windows.end(); ++it2)
+ other_wnds.insert(*it2);
+
+ // save currently visible application windows
+ EnumWindows(SwitchDesktopEnumFct, (LPARAM)&windows);
+
+ old_desktop._hwndForeground = (HWND)SendMessage(g_Globals._hwndDesktopBar, PM_GET_LAST_ACTIVE, 0, 0);
+
+ // hide all windows of the previous desktop
+ for(WindowSet::iterator it=windows.begin(); it!=windows.end(); ++it)
+ ShowWindowAsync(*it, SW_HIDE);
+
+ // show all windows of the new desktop
+ for(WindowSet::iterator it=desktop._windows.begin(); it!=desktop._windows.end(); ++it)
+ ShowWindowAsync(*it, SW_SHOW);
+
+ if (desktop._hwndForeground)
+ SetForegroundWindow(desktop._hwndForeground);
+
+ // remove the window handles of the other desktops from what we found on the previous desktop
+ for(WindowSet::const_iterator it=other_wnds.begin(); it!=other_wnds.end(); ++it)
+ windows.erase(*it);
+
+ // We don't need to store the window handles of what's now visible the now current desktop.
+ desktop._windows.clear();
+
+ _current_desktop = idx;
+}
+
+#endif // _USE_HDESK
+
+
+static BOOL CALLBACK MinimizeDesktopEnumFct(HWND hwnd, LPARAM lparam)
+{
+ list<MinimizeStruct>& minimized = *(list<MinimizeStruct>*)lparam;
+
+ if (hwnd!=g_Globals._hwndDesktopBar && hwnd!=g_Globals._hwndDesktop)
+ if (IsWindowVisible(hwnd) && !IsIconic(hwnd)) {
+ RECT rect;
+
+ if (GetWindowRect(hwnd,&rect))
+ if (rect.right>0 && rect.bottom>0 &&
+ rect.right>rect.left && rect.bottom>rect.top) {
+ minimized.push_back(MinimizeStruct(hwnd, GetWindowStyle(hwnd)));
+ ShowWindowAsync(hwnd, SW_MINIMIZE);
+ }
+ }
+
+ return TRUE;
+}
+
+ /// minimize/restore all windows on the desktop
+void Desktops::ToggleMinimize()
+{
+ list<MinimizeStruct>& minimized = (*this)[_current_desktop]._minimized;
+
+ if (minimized.empty()) {
+ EnumWindows(MinimizeDesktopEnumFct, (LPARAM)&minimized);
+ } else {
+ for(list<MinimizeStruct>::const_iterator it=minimized.begin(); it!=minimized.end(); ++it)
+ ShowWindowAsync(it->first, it->second&WS_MAXIMIZE? SW_MAXIMIZE: SW_RESTORE);
+
+ minimized.clear();
+ }
+}
+
+
+BOOL IsAnyDesktopRunning()
+{
+ HINSTANCE hUser32 = GetModuleHandle(TEXT("user32"));
+
+ SetShellWindow = (BOOL(WINAPI*)(HWND)) GetProcAddress(hUser32, "SetShellWindow");
+ SetShellWindowEx = (BOOL(WINAPI*)(HWND,HWND)) GetProcAddress(hUser32, "SetShellWindowEx");
+
+ return GetShellWindow() != 0;
+}
+
+
+BackgroundWindow::BackgroundWindow(HWND hwnd)
+ : super(hwnd)
+{
+ // set background brush for the short moment of displaying the
+ // background color while moving foreground windows
+ SetClassLong(hwnd, GCL_HBRBACKGROUND, COLOR_BACKGROUND+1);
+
+ _display_version = RegGetDWORDValue(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), TEXT("PaintDesktopVersion"), 1);
+}
+
+LRESULT BackgroundWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_ERASEBKGND:
+ DrawDesktopBkgnd((HDC)wparam);
+ return TRUE;
+
+ case WM_MBUTTONDBLCLK:
+ /* Imagelist icons are missing if MainFrame::Create() is called directly from here!
+ explorer_show_frame(SW_SHOWNORMAL); */
+ PostMessage(g_Globals._hwndDesktop, nmsg, wparam, lparam);
+ break;
+
+ case PM_DISPLAY_VERSION:
+ if (lparam || wparam) {
+ DWORD or_mask = wparam;
+ DWORD reset_mask = LOWORD(lparam);
+ DWORD xor_mask = HIWORD(lparam);
+ _display_version = ((_display_version&~reset_mask) | or_mask) ^ xor_mask;
+ RegSetDWORDValue(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), TEXT("PaintDesktopVersion"), _display_version);
+ ///@todo Changing the PaintDesktopVersion-Flag needs a restart of the shell -> display a message box
+ InvalidateRect(_hwnd, NULL, TRUE);
+ }
+ return _display_version;
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+void BackgroundWindow::DrawDesktopBkgnd(HDC hdc)
+{
+ PaintDesktop(hdc);
+
+/* special solid background
+ HBRUSH bkgndBrush = CreateSolidBrush(RGB(0,32,160)); // dark blue
+ FillRect(hdc, &rect, bkgndBrush);
+ DeleteBrush(bkgndBrush);
+*/
+}
+
+
+DesktopWindow::DesktopWindow(HWND hwnd)
+ : super(hwnd)
+{
+ _pShellView = NULL;
+}
+
+DesktopWindow::~DesktopWindow()
+{
+ if (_pShellView)
+ _pShellView->Release();
+}
+
+
+HWND DesktopWindow::Create()
+{
+ static IconWindowClass wcDesktop(TEXT("Progman"), IDI_REACTOS, CS_DBLCLKS);
+ /* (disabled because of small ugly temporary artefacts when hiding start menu)
+ wcDesktop.hbrBackground = (HBRUSH)(COLOR_BACKGROUND+1); */
+
+ int width = GetSystemMetrics(SM_CXSCREEN);
+ int height = GetSystemMetrics(SM_CYSCREEN);
+
+ HWND hwndDesktop = Window::Create(WINDOW_CREATOR(DesktopWindow),
+ WS_EX_TOOLWINDOW, wcDesktop, TEXT("Program Manager"), WS_POPUP|WS_VISIBLE, //|WS_CLIPCHILDREN for SDI frames
+ 0, 0, width, height, 0);
+
+ // work around to display desktop bar in Wine
+ ShowWindow(GET_WINDOW(DesktopWindow, hwndDesktop)->_desktopBar, SW_SHOW);
+
+ // work around for Windows NT, Win 98, ...
+ // Without this the desktop has mysteriously only a size of 800x600 pixels.
+ MoveWindow(hwndDesktop, 0, 0, width, height, TRUE);
+
+ return hwndDesktop;
+}
+
+
+LRESULT DesktopWindow::Init(LPCREATESTRUCT pcs)
+{
+ if (super::Init(pcs))
+ return 1;
+
+ HRESULT hr = GetDesktopFolder()->CreateViewObject(_hwnd, IID_IShellView, (void**)&_pShellView);
+/* also possible:
+ SFV_CREATE sfv_create;
+
+ sfv_create.cbSize = sizeof(SFV_CREATE);
+ sfv_create.pshf = GetDesktopFolder();
+ sfv_create.psvOuter = NULL;
+ sfv_create.psfvcb = NULL;
+
+ HRESULT hr = SHCreateShellFolderView(&sfv_create, &_pShellView);
+*/
+ HWND hWndView = 0;
+
+ if (SUCCEEDED(hr)) {
+ FOLDERSETTINGS fs;
+
+ fs.ViewMode = FVM_ICON;
+ fs.fFlags = FWF_DESKTOP|FWF_NOCLIENTEDGE|FWF_NOSCROLL|FWF_BESTFITWINDOW|FWF_SNAPTOGRID; //|FWF_AUTOARRANGE;
+
+ ClientRect rect(_hwnd);
+
+ hr = _pShellView->CreateViewWindow(NULL, &fs, this, &rect, &hWndView);
+
+ ///@todo use IShellBrowser::GetViewStateStream() to restore previous view state -> see SHOpenRegStream()
+
+ if (SUCCEEDED(hr)) {
+ g_Globals._hwndShellView = hWndView;
+
+ // subclass shellview window
+ new DesktopShellView(hWndView, _pShellView);
+
+ _pShellView->UIActivate(SVUIA_ACTIVATE_FOCUS);
+
+ /*
+ IShellView2* pShellView2;
+
+ hr = _pShellView->QueryInterface(IID_IShellView2, (void**)&pShellView2);
+
+ SV2CVW2_PARAMS params;
+ params.cbSize = sizeof(SV2CVW2_PARAMS);
+ params.psvPrev = _pShellView;
+ params.pfs = &fs;
+ params.psbOwner = this;
+ params.prcView = ▭
+ params.pvid = params.pvid;//@@
+
+ hr = pShellView2->CreateViewWindow2(¶ms);
+ params.pvid;
+ */
+
+ /*
+ IFolderView* pFolderView;
+
+ hr = _pShellView->QueryInterface(IID_IFolderView, (void**)&pFolderView);
+
+ if (SUCCEEDED(hr)) {
+ hr = pFolderView->GetAutoArrange();
+ hr = pFolderView->SetCurrentViewMode(FVM_DETAILS);
+ }
+ */
+ }
+ }
+
+ if (hWndView && SetShellWindowEx)
+ SetShellWindowEx(_hwnd, hWndView);
+ else if (SetShellWindow)
+ SetShellWindow(_hwnd);
+
+ // create the explorer bar
+ _desktopBar = DesktopBar::Create();
+ g_Globals._hwndDesktopBar = _desktopBar;
+
+ return 0;
+}
+
+
+LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_LBUTTONDBLCLK:
+ case WM_RBUTTONDBLCLK:
+ case WM_MBUTTONDBLCLK:
+ explorer_show_frame(SW_SHOWNORMAL);
+ break;
+
+ case WM_GETISHELLBROWSER:
+ return (LRESULT)static_cast<IShellBrowser*>(this);
+
+ case WM_DESTROY:
+
+ ///@todo use IShellBrowser::GetViewStateStream() and _pShellView->SaveViewState() to store view state
+
+ if (SetShellWindow)
+ SetShellWindow(0);
+ break;
+
+ case WM_CLOSE:
+ ShowExitWindowsDialog(_hwnd);
+ break;
+
+ case WM_SYSCOMMAND:
+ if (wparam == SC_TASKLIST) {
+ if (_desktopBar)
+ SendMessage(_desktopBar, nmsg, wparam, lparam);
+ }
+ goto def;
+
+ default: def:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+
+HRESULT DesktopWindow::OnDefaultCommand(LPIDA pida)
+{
+#ifndef ROSSHELL // in shell-only-mode fall through and let shell32 handle the command
+ if (MainFrameBase::OpenShellFolders(pida, 0))
+ return S_OK;
+#endif
+
+ return E_NOTIMPL;
+}
+
+
+DesktopShellView::DesktopShellView(HWND hwnd, IShellView* pShellView)
+ : super(hwnd),
+ _pShellView(pShellView)
+{
+ _hwndListView = ::GetNextWindow(hwnd, GW_CHILD);
+
+ SetWindowStyle(_hwndListView, GetWindowStyle(_hwndListView)&~LVS_ALIGNMASK);//|LVS_ALIGNTOP|LVS_AUTOARRANGE);
+
+ // work around for Windows NT, Win 98, ...
+ // Without this the desktop has mysteriously only a size of 800x600 pixels.
+ ClientRect rect(hwnd);
+ MoveWindow(_hwndListView, 0, 0, rect.right, rect.bottom, TRUE);
+
+ // subclass background window
+ new BackgroundWindow(_hwndListView);
+
+ _icon_algo = 1; // default icon arrangement
+
+ PositionIcons();
+ InitDragDrop();
+}
+
+bool DesktopShellView::InitDragDrop()
+{
+ CONTEXT("DesktopShellView::InitDragDrop()");
+
+ _pDropTarget = new DesktopDropTarget(_hwnd);
+
+ if (!_pDropTarget)
+ return false;
+
+ _pDropTarget->AddRef();
+
+ if (FAILED(RegisterDragDrop(_hwnd, _pDropTarget))) {
+ _pDropTarget->Release();
+ _pDropTarget = NULL;
+ return false;
+ }
+ else
+ _pDropTarget->Release();
+
+ FORMATETC ftetc;
+
+ ftetc.dwAspect = DVASPECT_CONTENT;
+ ftetc.lindex = -1;
+ ftetc.tymed = TYMED_HGLOBAL;
+ ftetc.cfFormat = CF_HDROP;
+
+ _pDropTarget->AddSuportedFormat(ftetc);
+
+ return true;
+}
+
+LRESULT DesktopShellView::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_CONTEXTMENU:
+ if (!DoContextMenu(GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)))
+ DoDesktopContextMenu(GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam));
+ break;
+
+ case PM_SET_ICON_ALGORITHM:
+ _icon_algo = wparam;
+ PositionIcons();
+ break;
+
+ case PM_GET_ICON_ALGORITHM:
+ return _icon_algo;
+
+ case PM_DISPLAY_VERSION:
+ return SendMessage(_hwndListView, nmsg, wparam, lparam);
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+int DesktopShellView::Command(int id, int code)
+{
+ return super::Command(id, code);
+}
+
+int DesktopShellView::Notify(int id, NMHDR* pnmh)
+{
+ return super::Notify(id, pnmh);
+}
+
+bool DesktopShellView::DoContextMenu(int x, int y)
+{
+ IDataObject* selection;
+
+ HRESULT hr = _pShellView->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (void**)&selection);
+ if (FAILED(hr))
+ return false;
+
+ PIDList pidList;
+
+ hr = pidList.GetData(selection);
+ if (FAILED(hr)) {
+ selection->Release();
+ //CHECKERROR(hr);
+ return false;
+ }
+
+ LPIDA pida = pidList;
+ if (!pida->cidl) {
+ selection->Release();
+ return false;
+ }
+
+ LPCITEMIDLIST parent_pidl = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]);
+
+ LPCITEMIDLIST* apidl = (LPCITEMIDLIST*) alloca(pida->cidl*sizeof(LPCITEMIDLIST));
+
+ for(int i=pida->cidl; i>0; --i)
+ apidl[i-1] = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[i]);
+
+ hr = ShellFolderContextMenu(ShellFolder(parent_pidl), _hwnd, pida->cidl, apidl, x, y, _cm_ifs);
+
+ selection->Release();
+
+ CHECKERROR(hr);
+
+ return true;
+}
+
+HRESULT DesktopShellView::DoDesktopContextMenu(int x, int y)
+{
+ IContextMenu* pcm;
+
+ HRESULT hr = DesktopFolder()->GetUIObjectOf(_hwnd, 0, NULL, IID_IContextMenu, NULL, (LPVOID*)&pcm);
+
+ if (SUCCEEDED(hr)) {
+ pcm = _cm_ifs.query_interfaces(pcm);
+
+ HMENU hmenu = CreatePopupMenu();
+
+ if (hmenu) {
+ hr = pcm->QueryContextMenu(hmenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST-1, CMF_NORMAL|CMF_EXPLORE);
+
+ if (SUCCEEDED(hr)) {
+ AppendMenu(hmenu, MF_SEPARATOR, 0, NULL);
+ AppendMenu(hmenu, 0, FCIDM_SHVIEWLAST-1, ResString(IDS_ABOUT_EXPLORER));
+
+ UINT idCmd = TrackPopupMenu(hmenu, TPM_LEFTALIGN|TPM_RETURNCMD|TPM_RIGHTBUTTON, x, y, 0, _hwnd, NULL);
+
+ _cm_ifs.reset();
+
+ if (idCmd == FCIDM_SHVIEWLAST-1) {
+ explorer_about(_hwnd);
+ } else if (idCmd) {
+ CMINVOKECOMMANDINFO cmi;
+
+ cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
+ cmi.fMask = 0;
+ cmi.hwnd = _hwnd;
+ cmi.lpVerb = (LPCSTR)(INT_PTR)(idCmd - FCIDM_SHVIEWFIRST);
+ cmi.lpParameters = NULL;
+ cmi.lpDirectory = NULL;
+ cmi.nShow = SW_SHOWNORMAL;
+ cmi.dwHotKey = 0;
+ cmi.hIcon = 0;
+
+ hr = pcm->InvokeCommand(&cmi);
+ }
+ } else
+ _cm_ifs.reset();
+ }
+
+ pcm->Release();
+ }
+
+ return hr;
+}
+
+
+#define ARRANGE_BORDER_DOWN 8
+#define ARRANGE_BORDER_HV 9
+#define ARRANGE_ROUNDABOUT 10
+
+static const POINTS s_align_start[] = {
+ {0, 0}, // left/top
+ {0, 0},
+ {1, 0}, // right/top
+ {1, 0},
+ {0, 1}, // left/bottom
+ {0, 1},
+ {1, 1}, // right/bottom
+ {1, 1},
+
+ {0, 0}, // left/top
+ {0, 0},
+ {0, 0}
+};
+
+static const POINTS s_align_dir1[] = {
+ { 0, +1}, // down
+ {+1, 0}, // right
+ {-1, 0}, // left
+ { 0, +1}, // down
+ { 0, -1}, // up
+ {+1, 0}, // right
+ {-1, 0}, // left
+ { 0, -1}, // up
+
+ { 0, +1}, // down
+ {+1, 0}, // right
+ {+1, 0} // right
+};
+
+static const POINTS s_align_dir2[] = {
+ {+1, 0}, // right
+ { 0, +1}, // down
+ { 0, +1}, // down
+ {-1, 0}, // left
+ {+1, 0}, // right
+ { 0, -1}, // up
+ { 0, -1}, // up
+ {-1, 0}, // left
+
+ {+1, 0}, // right
+ { 0, +1}, // down
+ { 0, +1} // down
+};
+
+typedef pair<int,int> IconPos;
+typedef map<IconPos, int> IconMap;
+
+void DesktopShellView::PositionIcons(int dir)
+{
+ DWORD spacing = ListView_GetItemSpacing(_hwndListView, FALSE);
+
+ RECT work_area;
+ SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0);
+
+ const POINTS& dir1 = s_align_dir1[_icon_algo];
+ const POINTS& dir2 = s_align_dir2[_icon_algo];
+ const POINTS& start_pos = s_align_start[_icon_algo];
+
+ int dir_x1 = dir1.x;
+ int dir_y1 = dir1.y;
+ int dir_x2 = dir2.x;
+ int dir_y2 = dir2.y;
+
+ int cx = LOWORD(spacing);
+ int cy = HIWORD(spacing);
+
+ int dx1 = dir_x1 * cx;
+ int dy1 = dir_y1 * cy;
+ int dx2 = dir_x2 * cx;
+ int dy2 = dir_y2 * cy;
+
+ int xoffset = (cx-32)/2;
+ int yoffset = 4/*(cy-32)/2*/;
+
+ int start_x = start_pos.x * (work_area.right - cx) + xoffset;
+ int start_y = start_pos.y * (work_area.bottom - cy) + yoffset;
+
+ int x = start_x;
+ int y = start_y;
+
+ int all = ListView_GetItemCount(_hwndListView);
+ int i1, i2;
+
+ if (dir > 0) {
+ i1 = 0;
+ i2 = all;
+ } else {
+ i1 = all-1;
+ i2 = -1;
+ }
+
+ IconMap pos_idx;
+ int cnt = 0;
+ int xhv = start_x;
+ int yhv = start_y;
+
+ for(int idx=i1; idx!=i2; idx+=dir) {
+ pos_idx[IconPos(y, x)] = idx;
+
+ if (_icon_algo == ARRANGE_BORDER_DOWN) {
+ if (++cnt & 1)
+ x = work_area.right - x - cx + 2*xoffset;
+ else {
+ y += dy1;
+
+ if (y + cy - 2 * yoffset > work_area.bottom) {
+ y = start_y;
+ start_x += dx2;
+ x = start_x;
+ }
+ }
+
+ continue;
+ }
+ else if (_icon_algo == ARRANGE_BORDER_HV) {
+ if (++cnt & 1)
+ x = work_area.right - x - cx + 2*xoffset;
+ else if (cnt & 2) {
+ yhv += cy;
+ y = yhv;
+ x = start_x;
+
+ if (y + cy - 2 * yoffset > work_area.bottom) {
+ start_x += cx;
+ xhv = start_x;
+ x = xhv;
+ start_y += cy;
+ yhv = start_y;
+ y = yhv;
+ }
+ } else {
+ xhv += cx;
+ x = xhv;
+ y = start_y;
+
+ if (x + cx - 2 * xoffset > work_area.right) {
+ start_x += cx;
+ xhv = start_x;
+ x = xhv;
+ start_y += cy;
+ yhv = start_y;
+ y = yhv;
+ }
+ }
+
+ continue;
+ }
+ else if (_icon_algo == ARRANGE_ROUNDABOUT) {
+
+ ///@todo
+
+ }
+
+ x += dx1;
+ y += dy1;
+
+ if (x<0 || x+cx-2*xoffset>work_area.right) {
+ x = start_x;
+ y += dy2;
+ } else if (y<0 || y+cy-2*yoffset>work_area.bottom) {
+ y = start_y;
+ x += dx2;
+ }
+ }
+
+ // use a little trick to get the icons where we want them to be...
+
+ for(IconMap::const_iterator it=pos_idx.end(); --it!=pos_idx.begin(); ) {
+ const IconPos& pos = it->first;
+
+ ListView_SetItemPosition32(_hwndListView, it->second, pos.second, pos.first);
+ }
+
+ for(IconMap::const_iterator it=pos_idx.begin(); it!=pos_idx.end(); ++it) {
+ const IconPos& pos = it->first;
+
+ ListView_SetItemPosition32(_hwndListView, it->second, pos.second, pos.first);
+ }
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // desktop.h
+ //
+ // Martin Fuchs, 09.08.2003
+ //
+
+
+#define PM_SET_ICON_ALGORITHM (WM_APP+0x19)
+#define PM_GET_ICON_ALGORITHM (WM_APP+0x1A)
+#define PM_DISPLAY_VERSION (WM_APP+0x24)
+
+
+ /// subclassed Background window behind the visible desktop window
+struct BackgroundWindow : public SubclassedWindow
+{
+ typedef SubclassedWindow super;
+
+ BackgroundWindow(HWND hwnd);
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ void DrawDesktopBkgnd(HDC hdc);
+
+ int _display_version;
+};
+
+
+ /// Implementation of the Explorer desktop window
+struct DesktopWindow : public Window, public IShellBrowserImpl
+{
+ typedef Window super;
+
+ DesktopWindow(HWND hwnd);
+ ~DesktopWindow();
+
+ static HWND Create();
+
+ virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND* lphwnd)
+ {
+ *lphwnd = _hwnd;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(IShellView** ppshv)
+ {
+ _pShellView->AddRef();
+ *ppshv = _pShellView;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetControlWindow(UINT id, HWND* lphwnd)
+ {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pret)
+ {
+ return E_NOTIMPL;
+ }
+
+protected:
+ LRESULT Init(LPCREATESTRUCT pcs);
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ IShellView* _pShellView;
+ WindowHandle _desktopBar;
+
+ virtual HRESULT OnDefaultCommand(LPIDA pida);
+};
+
+
+ /// OLE drop target for the desktop window
+class DesktopDropTarget : public IDropTargetImpl
+{
+ typedef IDropTargetImpl super;
+
+public:
+ DesktopDropTarget(HWND hTargetWnd) : super(hTargetWnd) {}
+
+ virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect)
+ {
+ if (pFmtEtc->cfFormat==CF_HDROP && medium.tymed==TYMED_HGLOBAL) {
+ HDROP hDrop = (HDROP)GlobalLock(medium.hGlobal);
+
+ if (hDrop) {
+ TCHAR szFileName[MAX_PATH];
+
+ UINT cFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
+
+ for(UINT i=0; i<cFiles; ++i) {
+ DragQueryFile(hDrop, i, szFileName, sizeof(szFileName));
+
+ if (DROPEFFECT_COPY & *pdwEffect) {
+ // copy the file or dir
+
+ ///@todo Add the code to handle Copy
+
+ } else if (DROPEFFECT_MOVE & *pdwEffect) {
+ // move the file or dir
+
+ ///@todo Add the code to handle Move
+
+ }
+ }
+ //DragFinish(hDrop); // base class calls ReleaseStgMedium
+ }
+
+ GlobalUnlock(medium.hGlobal);
+ }
+
+ //@@TreeView_SelectDropTarget(m_hTargetWnd, NULL);
+
+ return true; //let base free the medium
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE DragOver(
+ /* [in] */ DWORD grfKeyState,
+ /* [in] */ POINTL pt,
+ /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+ {
+ TVHITTESTINFO hit;
+ hit.pt = (POINT&)pt;
+ ScreenToClient(m_hTargetWnd, &hit.pt);
+ hit.flags = TVHT_ONITEM;
+
+ /*@@
+ HTREEITEM hItem = TreeView_HitTest(m_hTargetWnd,&hit);
+
+ if (hItem != NULL)
+ TreeView_SelectDropTarget(m_hTargetWnd, hItem);
+ */
+
+ return super::DragOver(grfKeyState, pt, pdwEffect);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE DragLeave(void)
+ {
+ //@@ TreeView_SelectDropTarget(m_hTargetWnd, NULL);
+
+ return super::DragLeave();
+ }
+};
+
+
+ /// subclassed ShellView window
+struct DesktopShellView : public ExtContextMenuHandlerT<SubclassedWindow>
+{
+ typedef ExtContextMenuHandlerT<SubclassedWindow> super;
+
+ DesktopShellView(HWND hwnd, IShellView* pShellView);
+
+ bool InitDragDrop();
+
+protected:
+ IShellView* _pShellView;
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Command(int id, int code);
+ int Notify(int id, NMHDR* pnmh);
+
+ bool DoContextMenu(int x, int y);
+ HRESULT DoDesktopContextMenu(int x, int y);
+ void PositionIcons(int dir=1);
+
+ DesktopDropTarget* _pDropTarget;
+ HWND _hwndListView;
+ int _icon_algo;
+};
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // dialogs/searchprogram.cpp
+ //
+ // Explorer dialogs
+ //
+ // Martin Fuchs, 02.10.2003
+ //
+
+
+#include <precomp.h>
+
+#include "../resource.h"
+
+#include "searchprogram.h"
+
+
+int CollectProgramsThread::Run()
+{
+ try {
+ collect_programs(SpecialFolderPath(CSIDL_COMMON_PROGRAMS, _hwnd));
+ } catch(COMException&) {
+ }
+
+ if (_alive)
+ try {
+ collect_programs(SpecialFolderPath(CSIDL_PROGRAMS, _hwnd));
+ } catch(COMException&) {
+ }
+
+ if (_alive)
+ _cache_valid = true;
+
+ return 0;
+}
+
+void CollectProgramsThread::collect_programs(const ShellPath& path)
+{
+ ShellDirectory* dir = new ShellDirectory(GetDesktopFolder(), path, 0);
+ _dirs.push(dir);
+
+ dir->smart_scan(SORT_NONE);
+
+ for(Entry*entry=dir->_down; _alive && entry; entry=entry->_next) {
+ if (entry->_shell_attribs & SFGAO_HIDDEN)
+ continue;
+
+ if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ collect_programs(entry->create_absolute_pidl());
+ else if (entry->_shell_attribs & SFGAO_LINK)
+ if (_alive)
+ _callback(entry, _para);
+ }
+}
+
+void CollectProgramsThread::free_dirs()
+{
+ while(!_dirs.empty()) {
+ ShellDirectory* dir = _dirs.top();
+ dir->free_subentries();
+ _dirs.pop();
+ }
+}
+
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4355)
+#endif
+
+FindProgramDlg::FindProgramDlg(HWND hwnd)
+ : super(hwnd),
+ _list_ctrl(GetDlgItem(hwnd, IDC_PROGRAMS_FOUND)),
+ _thread(collect_programs_callback, hwnd, this),
+ _sort(_list_ctrl, CompareFunc/*, (LPARAM)this*/)
+{
+ SetWindowIcon(hwnd, IDI_SEARCH);
+
+ _resize_mgr.Add(IDC_FILTER, RESIZE_X);
+ _resize_mgr.Add(IDC_CHECK_ENTRIES, MOVE_X);
+ _resize_mgr.Add(IDC_PROGRAMS_FOUND, RESIZE);
+
+ _resize_mgr.Resize(+520, +300);
+
+ _haccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_SEARCH_PROGRAM));
+
+ (void)ListView_SetImageList(_list_ctrl, g_Globals._icon_cache.get_sys_imagelist(), LVSIL_SMALL);
+
+ LV_COLUMN column = {LVCF_FMT|LVCF_WIDTH|LVCF_TEXT, LVCFMT_LEFT, 250};
+
+ column.pszText = _T("Name");
+ ListView_InsertColumn(_list_ctrl, 0, &column);
+
+ column.cx = 300;
+ column.pszText = _T("Path");
+ ListView_InsertColumn(_list_ctrl, 1, &column);
+
+ column.cx = 400;
+ column.pszText = _T("Menu Path");
+ ListView_InsertColumn(_list_ctrl, 2, &column);
+
+ ListView_SetExtendedListViewStyleEx(_list_ctrl, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
+
+ _common_programs = SpecialFolderFSPath(CSIDL_COMMON_PROGRAMS, hwnd);
+ if (!_common_programs.empty())
+ _common_programs.append(_T("\\"));
+
+ _user_programs = SpecialFolderFSPath(CSIDL_PROGRAMS, hwnd);
+ if (!_user_programs.empty())
+ _user_programs.append(_T("\\"));
+
+ CenterWindow(hwnd);
+
+ Refresh();
+
+ register_pretranslate(hwnd);
+}
+
+FindProgramDlg::~FindProgramDlg()
+{
+ _thread.Stop();
+
+ unregister_pretranslate(_hwnd);
+}
+
+
+void FindProgramDlg::Refresh(bool delete_cache)
+{
+ WaitCursor wait;
+
+ _thread.Stop();
+
+ TCHAR buffer[1024];
+ GetWindowText(GetDlgItem(_hwnd, IDC_FILTER), buffer, COUNTOF(buffer));
+ CharLower(buffer);
+ _lwr_filter = buffer;
+
+ HiddenWindow hide_listctrl(_list_ctrl);
+
+ ListView_DeleteAllItems(_list_ctrl);
+
+ if (delete_cache || !_thread._cache_valid) {
+ _thread.free_dirs();
+ _thread.Start();
+ } else {
+ for(FPDCache::const_iterator it=_cache.begin(); it!=_cache.end(); ++it)
+ add_entry(*it);
+ }
+}
+
+void FindProgramDlg::collect_programs_callback(Entry* entry, void* param)
+{
+ FindProgramDlg* pThis = (FindProgramDlg*) param;
+
+ IShellLink* pShellLink;
+ HRESULT hr = entry->GetUIObjectOf(pThis->_hwnd, IID_IShellLink, (LPVOID*)&pShellLink);
+
+ if (SUCCEEDED(hr)) {
+ ShellLinkPtr shell_link(pShellLink);
+
+ shell_link->Release();
+
+ /*hr = pShellLink->Resolve(pThis->_hwnd, SLR_NO_UI);
+ if (SUCCEEDED(hr))*/ {
+ WIN32_FIND_DATA wfd;
+ TCHAR path[MAX_PATH];
+
+ hr = pShellLink->GetPath(path, COUNTOF(path)-1, &wfd, SLGP_UNCPRIORITY);
+
+ if (SUCCEEDED(hr)) {
+ TCHAR entry_path[MAX_PATH];
+
+ entry->get_path(entry_path, COUNTOF(entry_path));
+
+ String menu_path;
+
+ int len = pThis->_common_programs.size();
+
+ if (len && !_tcsnicmp(entry_path, pThis->_common_programs, len))
+ menu_path = ResString(IDS_ALL_USERS) + (String(entry_path)+len);
+ else if ((len=pThis->_user_programs.size()) && !_tcsnicmp(entry_path, pThis->_user_programs, len))
+ menu_path = String(entry_path)+len;
+
+ // store info in cache
+ FPDEntry new_entry;
+
+ new_entry._entry = entry;
+ new_entry._menu_path = menu_path;
+ new_entry._path = path;
+ new_entry._idxIcon = I_IMAGECALLBACK;
+
+ pThis->_cache.push_front(new_entry);
+ FPDEntry& cache_entry = pThis->_cache.front();
+
+ Lock lock(pThis->_thread._crit_sect);
+
+ // resolve deadlocks while executing Thread::Stop()
+ if (!pThis->_thread.is_alive())
+ return;
+
+ pThis->add_entry(cache_entry);
+ }
+ }
+ }
+}
+
+void FindProgramDlg::add_entry(const FPDEntry& cache_entry)
+{
+ String lwr_path = cache_entry._path;
+ String lwr_name = cache_entry._entry->_display_name;
+
+ lwr_path.toLower();
+ lwr_name.toLower();
+
+ if (_lwr_filter.empty())
+ if (_tcsstr(lwr_name, _T("uninstal")) || _tcsstr(lwr_name, _T("deinstal"))) // filter out deinstallation links
+ return;
+
+ if (!_tcsstr(lwr_path, _lwr_filter) && !_tcsstr(lwr_name, _lwr_filter))
+ return;
+
+ LV_ITEM item = {LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM, INT_MAX};
+
+ item.pszText = cache_entry._entry->_display_name;
+ item.iImage = cache_entry._idxIcon;
+ item.lParam = (LPARAM) &cache_entry;
+ item.iItem = ListView_InsertItem(_list_ctrl, &item); // We could use the information in _sort to enable manual sorting while populating the list.
+
+ item.mask = LVIF_TEXT;
+
+ item.iSubItem = 1;
+ item.pszText = (LPTSTR)(LPCTSTR)cache_entry._path;
+ ListView_SetItem(_list_ctrl, &item);
+
+ item.iSubItem = 2;
+ item.pszText = (LPTSTR)(LPCTSTR)cache_entry._menu_path;
+ ListView_SetItem(_list_ctrl, &item);
+}
+
+LRESULT FindProgramDlg::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_CLOSE:
+ (void)ListView_SetImageList(_list_ctrl, 0, LVSIL_SMALL); // detach system image list
+ goto def;
+
+ case PM_TRANSLATE_MSG: {
+ MSG* pmsg = (MSG*) lparam;
+
+ if (TranslateAccelerator(_hwnd, _haccel, pmsg))
+ return TRUE;
+
+ return FALSE;}
+
+ default: def:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+int FindProgramDlg::Command(int id, int code)
+{
+ if (code == BN_CLICKED) {
+ switch(id) {
+ case ID_REFRESH:
+ Refresh(true);
+ break;
+
+ case IDOK:
+ LaunchSelected();
+ break;
+
+ case IDC_CHECK_ENTRIES:
+ CheckEntries();
+ break;
+
+ default:
+ return super::Command(id, code);
+ }
+
+ return 0;
+ }
+ else if (code == EN_CHANGE) {
+ switch(id) {
+ case IDC_FILTER:
+ Refresh();
+ break;
+ }
+
+ return 0;
+ }
+
+ return 1;
+}
+
+void FindProgramDlg::LaunchSelected()
+{
+ Lock lock(_thread._crit_sect);
+
+ int count = ListView_GetSelectedCount(_list_ctrl);
+
+ if (count > 1)
+ if (MessageBox(_hwnd, ResString(IDS_LAUNCH_MANY_PROGRAMS), ResString(IDS_TITLE), MB_OKCANCEL) != IDOK)
+ return;
+
+ for(int idx=-1; (idx=ListView_GetNextItem(_list_ctrl, idx, LVNI_SELECTED))!=-1; ) {
+ LPARAM lparam = ListView_GetItemData(_list_ctrl, idx);
+
+ if (lparam) {
+ FPDEntry& cache_entry = *(FPDEntry*)lparam;
+ cache_entry._entry->launch_entry(_hwnd);
+ }
+ }
+}
+
+int FindProgramDlg::Notify(int id, NMHDR* pnmh)
+{
+ switch(pnmh->code) {
+ case LVN_GETDISPINFO: {
+ LV_DISPINFO* pDispInfo = (LV_DISPINFO*) pnmh;
+
+ if (pnmh->hwndFrom == _list_ctrl) {
+ if (pDispInfo->item.mask & LVIF_IMAGE) {
+ FPDEntry& cache_entry = *(FPDEntry*)pDispInfo->item.lParam;
+ Entry* entry = cache_entry._entry;
+
+ if (entry->_icon_id == ICID_UNKNOWN)
+ entry->_icon_id = entry->extract_icon(ICF_SYSCACHE);
+
+ pDispInfo->item.iImage = g_Globals._icon_cache.get_icon(entry->_icon_id).get_sysiml_idx();
+ pDispInfo->item.mask |= LVIF_DI_SETITEM;
+
+ return 1;
+ }
+ }}
+ break;
+
+ case NM_DBLCLK:
+ if (pnmh->hwndFrom == _list_ctrl)
+ LaunchSelected();
+ /*{
+ Lock lock(_thread._crit_sect);
+
+ LPNMLISTVIEW pnmv = (LPNMLISTVIEW) pnmh;
+ LPARAM lparam = ListView_GetItemData(pnmh->hwndFrom, pnmv->iItem);
+
+ if (lparam) {
+ FPDEntry& cache_entry = *(FPDEntry*)lparam;
+ cache_entry._entry->launch_entry(_hwnd);
+ }
+ }*/
+ break;
+
+ case HDN_ITEMCLICK: {
+ WaitCursor wait;
+ NMHEADER* phdr = (NMHEADER*)pnmh;
+
+ if (GetParent(pnmh->hwndFrom) == _list_ctrl) {
+ if (_thread._cache_valid) { // disable manual sorting while populating the list
+ _sort.toggle_sort(phdr->iItem);
+ _sort.sort();
+ }
+ }
+ break;}
+ }
+
+ return 0;
+}
+
+int CALLBACK FindProgramDlg::CompareFunc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort)
+{
+ ListSort* sort = (ListSort*)lparamSort;
+
+ FPDEntry& a = *(FPDEntry*)lparam1;
+ FPDEntry& b = *(FPDEntry*)lparam2;
+
+ int cmp = 0;
+
+ switch(sort->_sort_crit) {
+ case 0:
+ cmp = _tcsicoll(a._entry->_display_name, b._entry->_display_name);
+ break;
+
+ case 1:
+ cmp = _tcsicoll(a._path, b._path);
+ break;
+
+ case 2:
+ cmp = _tcsicoll(a._menu_path, b._menu_path);
+ }
+
+ return sort->_direction? -cmp: cmp;
+}
+
+void FindProgramDlg::CheckEntries()
+{
+ ///@todo check all entries for existing targets, display a list of not working entries and ask the user for permission to delete them
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // dialogs/searchprogram.h
+ //
+ // Explorer dialogs
+ //
+ // Martin Fuchs, 02.10.2003
+ //
+
+
+typedef void (*COLLECT_CALLBACK)(Entry* entry, void* param);
+typedef stack<ShellDirectory*> ShellDirectoryStack;
+
+ /// Thread for collecting start menu entries
+struct CollectProgramsThread : public Thread
+{
+ CollectProgramsThread(COLLECT_CALLBACK callback, HWND hwnd, void* para)
+ : _cache_valid(false),
+ _callback(callback),
+ _hwnd(hwnd),
+ _para(para)
+ {
+ }
+
+ ~CollectProgramsThread()
+ {
+ free_dirs();
+ }
+
+ int Run();
+ void free_dirs();
+
+ bool _cache_valid;
+
+protected:
+ COLLECT_CALLBACK _callback;
+ HWND _hwnd;
+ void* _para;
+ ShellDirectoryStack _dirs;
+
+ void collect_programs(const ShellPath& path);
+};
+
+
+ /// entry for the list in "find program" dialogs
+struct FPDEntry
+{
+ Entry* _entry;
+ int _idxIcon;
+ String _menu_path;
+ String _path;
+};
+
+typedef list<FPDEntry> FPDCache;
+
+
+ /// Dialog to work with the complete list of start menu entries
+struct FindProgramDlg : public ResizeController<Dialog>
+{
+ typedef ResizeController<Dialog> super;
+
+ FindProgramDlg(HWND hwnd);
+ ~FindProgramDlg();
+
+protected:
+ HWND _list_ctrl;
+ HACCEL _haccel;
+ String _lwr_filter;
+
+ CollectProgramsThread _thread;
+ FPDCache _cache;
+
+ String _common_programs, _user_programs;
+
+ ListSort _sort;
+
+ virtual LRESULT WndProc(UINT, WPARAM, LPARAM);
+ virtual int Command(int id, int code);
+ virtual int Notify(int id, NMHDR* pnmh);
+
+ void Refresh(bool delete_cache=false);
+ void add_entry(const FPDEntry& cache_entry);
+ void LaunchSelected();
+ void CheckEntries();
+
+ static void collect_programs_callback(Entry* entry, void* param);
+ static int CALLBACK CompareFunc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort);
+};
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // dialogs/settings.cpp
+ //
+ // Explorer dialogs
+ //
+ // Martin Fuchs, 18.01.2004
+ //
+
+
+#include <precomp.h>
+
+#include "../resource.h"
+
+#include "../taskbar/traynotify.h"
+#include "settings.h"
+
+
+void ExplorerPropertySheet(HWND hparent)
+{
+ PropertySheetDialog ps(hparent);
+
+ ps.dwFlags |= PSH_USEICONID | PSH_PROPTITLE;
+ ps.pszIcon = MAKEINTRESOURCE(IDI_REACTOS);
+ ps.pszCaption = TEXT("Explorer");
+
+ PropSheetPage psp1(IDD_DESKBAR_DESKTOP, WINDOW_CREATOR(DesktopSettingsDlg));
+ psp1.dwFlags |= PSP_USETITLE;
+ psp1.pszTitle = MAKEINTRESOURCE(IDS_DESKTOP);
+ ps.add(psp1);
+
+ PropSheetPage psp2(IDD_DESKBAR_TASKBAR, WINDOW_CREATOR(TaskbarSettingsDlg));
+ psp2.dwFlags |= PSP_USETITLE;
+ psp2.pszTitle = MAKEINTRESOURCE(IDS_TASKBAR);
+ ps.add(psp2);
+
+ PropSheetPage psp3(IDD_DESKBAR_STARTMENU, WINDOW_CREATOR(StartmenuSettingsDlg));
+ psp3.dwFlags |= PSP_USETITLE;
+ psp3.pszTitle = MAKEINTRESOURCE(IDS_STARTMENU);
+ ps.add(psp3);
+
+ ps.DoModal();
+}
+
+
+DesktopSettingsDlg::DesktopSettingsDlg(HWND hwnd)
+ : super(hwnd),
+ _bmp0(IDB_ICON_ALIGN_0),
+ _bmp1(IDB_ICON_ALIGN_1),
+ _bmp2(IDB_ICON_ALIGN_2),
+ _bmp3(IDB_ICON_ALIGN_3),
+ _bmp4(IDB_ICON_ALIGN_4),
+ _bmp5(IDB_ICON_ALIGN_5),
+ _bmp6(IDB_ICON_ALIGN_6),
+ _bmp7(IDB_ICON_ALIGN_7),
+ _bmp8(IDB_ICON_ALIGN_8),
+ _bmp9(IDB_ICON_ALIGN_9),
+ _bmp10(IDB_ICON_ALIGN_10)
+{
+ new PictureButton(_hwnd, IDC_ICON_ALIGN_0, _bmp0);
+ new PictureButton(_hwnd, IDC_ICON_ALIGN_1, _bmp1);
+ new PictureButton(_hwnd, IDC_ICON_ALIGN_2, _bmp2);
+ new PictureButton(_hwnd, IDC_ICON_ALIGN_3, _bmp3);
+ new PictureButton(_hwnd, IDC_ICON_ALIGN_4, _bmp4);
+ new PictureButton(_hwnd, IDC_ICON_ALIGN_5, _bmp5);
+ new PictureButton(_hwnd, IDC_ICON_ALIGN_6, _bmp6);
+ new PictureButton(_hwnd, IDC_ICON_ALIGN_7, _bmp7);
+ new PictureButton(_hwnd, IDC_ICON_ALIGN_8, _bmp8);
+ new PictureButton(_hwnd, IDC_ICON_ALIGN_9, _bmp9);
+ new PictureButton(_hwnd, IDC_ICON_ALIGN_10, _bmp10);
+
+ _alignment_cur = SendMessage(g_Globals._hwndShellView, PM_GET_ICON_ALGORITHM, 0, 0);
+ _alignment_tmp = _alignment_cur;
+
+ _display_version_org = SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,0));
+ CheckDlgButton(hwnd, ID_DESKTOP_VERSION, _display_version_org? BST_CHECKED: BST_UNCHECKED);
+}
+
+#ifndef PSN_QUERYINITIALFOCUS // currently (as of 18.01.2004) missing in MinGW headers
+#define PSN_QUERYINITIALFOCUS (-213)
+#endif
+
+int DesktopSettingsDlg::Notify(int id, NMHDR* pnmh)
+{
+ switch(pnmh->code) {
+ case PSN_QUERYINITIALFOCUS:
+ SetWindowLong(_hwnd, DWL_MSGRESULT, (LPARAM)GetDlgItem(_hwnd, IDC_ICON_ALIGN_0+_alignment_cur));
+ break;
+
+ case PSN_APPLY:
+ _alignment_cur = _alignment_tmp;
+ _display_version_org = SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,0));
+ break;
+
+ case PSN_RESET:
+ if (_alignment_tmp != _alignment_cur)
+ SendMessage(g_Globals._hwndShellView, PM_SET_ICON_ALGORITHM, _alignment_cur, 0);
+ SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, _display_version_org, MAKELONG(1,0));
+ break;
+
+ default:
+ return super::Notify(id, pnmh);
+ }
+
+ return 0;
+}
+
+int DesktopSettingsDlg::Command(int id, int code)
+{
+ if (id>=IDC_ICON_ALIGN_0 && id<=IDC_ICON_ALIGN_10) {
+ int alignment = id - IDC_ICON_ALIGN_0;
+
+ if (alignment != _alignment_tmp) {
+ _alignment_tmp = alignment;
+
+ PropSheet_Changed(GetParent(_hwnd), _hwnd);
+
+ SendMessage(g_Globals._hwndShellView, PM_SET_ICON_ALGORITHM, alignment, 0);
+ }
+
+ return 0;
+ }
+
+ switch(id) {
+ case ID_DESKTOP_VERSION:
+ SendMessage(g_Globals._hwndShellView, PM_DISPLAY_VERSION, 0, MAKELONG(0,1)); // toggle version display flag
+ PropSheet_Changed(GetParent(_hwnd), _hwnd);
+ break;
+
+ default:
+ return 1;
+ }
+
+ return 0;
+}
+
+
+TaskbarSettingsDlg::TaskbarSettingsDlg(HWND hwnd)
+ : super(hwnd),
+ _cfg_org(g_Globals._cfg)
+{
+ XMLPos options = g_Globals.get_cfg("desktopbar/options");
+
+ CheckDlgButton(hwnd, ID_SHOW_CLOCK, XMLBool(options, "show-clock", true)? BST_CHECKED: BST_UNCHECKED);
+ CheckDlgButton(hwnd, ID_HIDE_INACTIVE_ICONS, XMLBool(options, "hide-inactive", true)? BST_CHECKED: BST_UNCHECKED);
+}
+
+int TaskbarSettingsDlg::Notify(int id, NMHDR* pnmh)
+{
+ switch(pnmh->code) {
+ case PSN_APPLY:
+ _cfg_org = g_Globals._cfg;
+ break;
+
+ case PSN_RESET:
+ g_Globals._cfg = _cfg_org;
+ SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0);
+ break;
+
+ default:
+ return super::Notify(id, pnmh);
+ }
+
+ return 0;
+}
+
+int TaskbarSettingsDlg::Command(int id, int code)
+{
+ switch(id) {
+ case ID_CONFIG_NOTIFYAREA:
+ Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), _hwnd);
+ break;
+
+ case ID_SHOW_CLOCK: {
+ XMLBoolRef boolRef1(XMLPos(g_Globals.get_cfg("desktopbar/options")), "show-clock", true);
+ boolRef1.toggle();
+ SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0);
+ PropSheet_Changed(GetParent(_hwnd), _hwnd);
+ break;}
+
+ case ID_HIDE_INACTIVE_ICONS: {
+ XMLBoolRef boolRef2(XMLPos(g_Globals.get_cfg("notify-icons/options")), "hide-inactive", true);
+ boolRef2.toggle();
+ SendMessage(g_Globals._hwndDesktopBar, PM_REFRESH_CONFIG, 0, 0);
+ PropSheet_Changed(GetParent(_hwnd), _hwnd);
+ break;}
+
+ default:
+ return 1;
+ }
+
+ return 0;
+}
+
+
+StartmenuSettingsDlg::StartmenuSettingsDlg(HWND hwnd)
+ : super(hwnd)
+{
+}
+
+int StartmenuSettingsDlg::Command(int id, int code)
+{
+/*
+ switch(id) {
+ case ID_CONFIG_NOTIFYAREA:
+ Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), _hwnd);
+ return 0;
+ }
+*/
+ return 1;
+}
+
+
+MdiSdiDlg::MdiSdiDlg(HWND hwnd)
+ : super(hwnd)
+{
+ CenterWindow(hwnd);
+
+ XMLPos explorer_options = g_Globals.get_cfg("general/explorer");
+ bool mdi = XMLBool(explorer_options, "mdi", true);
+ bool separateFolders = XMLBool(explorer_options, "separate-folders", true);
+
+ int id = mdi? IDC_MDI: IDC_SDI;
+ CheckDlgButton(hwnd, id, BST_CHECKED);
+ SetFocus(GetDlgItem(hwnd, id));
+
+ CheckDlgButton(hwnd, IDC_SEPARATE_SUBFOLDERS, separateFolders?BST_CHECKED:BST_UNCHECKED);
+}
+
+int MdiSdiDlg::Command(int id, int code)
+{
+ if (code == BN_CLICKED) {
+ switch(id) {
+ case IDOK: {
+ bool mdi = IsDlgButtonChecked(_hwnd, IDC_MDI)==BST_CHECKED;
+ bool separateFolders = IsDlgButtonChecked(_hwnd, IDC_SEPARATE_SUBFOLDERS)==BST_CHECKED;
+
+ XMLPos explorer_options = g_Globals.get_cfg("general/explorer");
+
+ XMLBoolRef(explorer_options, "mdi") = mdi;
+ XMLBoolRef(explorer_options, "separate-folders") = separateFolders;
+ } // fall through
+
+ case IDCANCEL:
+ EndDialog(_hwnd, id);
+ break;
+ }
+
+ return 0;
+ }
+
+ return 1;
+}
--- /dev/null
+/*
+ * Copyright 2004, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // dialogs/settings.h
+ //
+ // Explorer dialogs
+ //
+ // Martin Fuchs, 18.01.2004
+ //
+
+
+void ExplorerPropertySheet(HWND hparent);
+
+
+ /// "Desktopbar Settings" Property Sheet Dialog
+struct DesktopSettingsDlg : public OwnerDrawParent<PropSheetPageDlg>
+{
+ typedef OwnerDrawParent<PropSheetPageDlg> super;
+
+ DesktopSettingsDlg(HWND hwnd);
+
+protected:
+ ResBitmap _bmp0;
+ ResBitmap _bmp1;
+ ResBitmap _bmp2;
+ ResBitmap _bmp3;
+ ResBitmap _bmp4;
+ ResBitmap _bmp5;
+ ResBitmap _bmp6;
+ ResBitmap _bmp7;
+ ResBitmap _bmp8;
+ ResBitmap _bmp9;
+ ResBitmap _bmp10;
+
+ int _alignment_cur;
+ int _alignment_tmp;
+
+ int _display_version_org;
+
+ virtual int Command(int id, int code);
+ virtual int Notify(int id, NMHDR* pnmh);
+};
+
+
+ /// "Taskbar Settings" Property Sheet Dialog
+struct TaskbarSettingsDlg : public PropSheetPageDlg
+{
+ typedef PropSheetPageDlg super;
+
+ TaskbarSettingsDlg(HWND hwnd);
+
+ virtual int Command(int id, int code);
+ virtual int Notify(int id, NMHDR* pnmh);
+
+protected:
+ XMLDoc _cfg_org;
+};
+
+
+ /// "Startmenu Settings" Property Sheet Dialog
+struct StartmenuSettingsDlg : public PropSheetPageDlg
+{
+ typedef PropSheetPageDlg super;
+
+ StartmenuSettingsDlg(HWND hwnd);
+
+ virtual int Command(int id, int code);
+};
+
+
+ /// configuration dialog to choose between MDI and SDI mode
+struct MdiSdiDlg : public ResizeController<Dialog>
+{
+ typedef ResizeController<Dialog> super;
+
+ MdiSdiDlg(HWND hwnd);
+
+protected:
+ virtual int Command(int id, int code);
+};
--- /dev/null
+- rewrite autostart code and include all possible autostart locations
+- read "DESCRIPT.ION" files to display file descriptions
+- detect display mode changes and adjust desktop bar size
+- handling of full screen applications
+- implement additional deskbands
+- Drag Drop and file renaming on the desktop does not work.
+- implement Drag Drop from the tree view.
+- activate accelerator keys like <DEL> in shell view folders
+- program manager "progman" DDE server
+- Windows-key combos
+- Application Desktop Toolbars
+- hide CVS subdirectories, may be even implement a CVS managment plugin
+- printer and RAS connection icons in desktop notification area
+- use multi threading for launching of programs and filling start menu subdirectories
+- close start start menu when resizing explorer bar
+- adjust already open windows of all running applications when resizing explorer bar
+- implement blink effect in task bar for SetForegoundWindow() requests
+- Execute selected programs with additional command line options ("Run" dialog with pre-filled edit field)
+- switch background images with desktop switcher
+- Desktop Manager: Desktop Names; Speicherung der Verteilung von Applikations-Fenstern auf die verschiedenen Desktops -> config file
+- autostart doesn't work on NT4 ?
+- hide desktop bar when showing full screen applications
+- new start menu entry "Filemanager" close to "Explore" -> display C: and D: drive in MDI window
+- Startmenu: You can open the start menu by pressing Win-key, but can't close with another hit of Win-key.
+- Export von Bookmarks für IE (+ Mozilla)
+
+- Search Programs -> performance monitor.msc -> Abort
+
+
+<Nonvo> Martin, I would have a whish concerning explorer: I often want to start a program and give it some parameters. So nice featue: "Start with param..."
+<tinus_> Nonvo: shell extension
+<m-fuchs> tinus: we should think about installing some default shell extensions
+<tinus_> m-fuchs: perhaps, but it'd be nice if they actually were shell extensions
+
--- /dev/null
+You will find only major changes in this file.
+Small bug fixes and developments steps are not listet here.
+If you search for more information, look into the Subversion repository.
+
+14.10.2002 m. fuchs Korrektur der Anpassungen durch Übernahme in wine: Anzeige der Verzeichnisnamen in Tree Pane
+ m. fuchs Wieder-Anpassung an natives Übersetzen unter WIN32 mit VC++
+
+15.10.2002 m. fuchs Entfernung der Warnungsmeldung durch SetWindowText(0, ...)
+ m. fuchs korrekte Anzeige der Header Control-Texte (nicht Unicode -> dlls/comctl32/header.c)
+
+15.10.2002 m. fuchs sofortige Anzeige der Dateiliste beim Starten und Öffnen neuer Fenster
+15.10.2002 m. fuchs Programmaufruf über Doppelklick in der Dateiliste
+
+07.06.2003 m. fuchs integration with ROS desktop window
+21.07.2003 m. fuchs extension of winefile for shell namespace
+04.08.2003 m. fuchs C++ explorer with architecture like MS Explorer:
+ usage of IShellView C++, implementation of IShellBrowser, ...
+09.08.2003 m. fuchs class DesktopWindow for shell view on the desktop
+11.08.2003 m. fuchs class BackgroundWindow for painting of desktop background
+ open child folders by double click in ShellBrowserChild
+13.08.2003 m. fuchs make explorer bar look more like windows taskbar bar
+16.08.2003 m. fuchs first draft of working task bar
+18.08.2003 m. fuchs first draft of explorer start menu
+21.08.2003 m. fuchs working start menu; beginning of tray notification area
+ Start menu popup is now closed when clicking in another window.
+22.08.2003 m. fuchs implemented clock display in tray notification area
+ implemented quick launch bar
+23.08.2003 m. fuchs implemented "Run..." dialog by calling shell32.dll
+ fixed memory and GDI handle leaks
+ implemented context menus for task bar
+ tool tips for quick launch bar
+24.08.2003 m. fuchs added reactos logo to startmenu
+ added romanian translation of Ciobanu Alexander
+26.08.2003 m. fuchs implemented tooltips and launching of date/time control panel applet for clock display
+27.08.2003 m. fuchs partly implemented control panel window
+28.08.2003 m. fuchs control panel window in cabinet view mode
+29.09.2003 m. fuchs Now we handle start menu popups via StartMenuRoot::TrackStartmenu().
+30.09.2003 m. fuchs compatibility to building as Winelib application
+10.09.2003 m. fuchs compatibility changes for correct desktop windows size on Windows NT
+19.09.2003 m. fuchs compatibility changes for correct start menu subentries on Windows 9x
+27.09.2003 m. fuchs moved start menu entries for control panel, etc. into new settings submenu
+ created a Makefile for compiling as standalone project using MinGW
+ eliminated all warnings displayed when using -Wall
+ activated option for compiling as UNICODE version
+ merged start menus of the same name (e.g. "All Users\Startup" with "<User>\Startup")
+28.09.2003 m. fuchs open cabinet windows then clicking on desktop folders
+18.10.2003 m. fuchs Program search dialog with interactive filtering and sorting does now work.
+19.10.2003 m. fuchs implemented floating start menus
+29.11.2003 m. fuchs implemented GDB stub for remote debugging
+06.12.2003 m. fuchs basic support to display NTFS streams in winefile windows
+20.12.2003 m. fuchs context menu implementation for desktop window
+01.01.2004 m. fuchs integrated icons of Everaldo (http://www.everaldo.com) into the start menu.
+02.01.2004 m. fuchs reimplemented start menu as light weight version
+03.01.2004 m. fuchs lazy icon extraction for start menu
+ direct file system access for start menu
+04.01.2004 m. fuchs implemented icon cache
+11.01.2004 m. fuchs keyboard navigation in start menu
+14.01.2004 m. fuchs automatically adjusted size of notification area and quicklaunch bar in desktop bar
+18.01.2004 m. fuchs explorer/desktop settings property sheet
+31.01.2004 m. fuchs included NT Object namespace as virtual file system
+31.01.2004 m. fuchs included Registry as virtual file system
+02.02.2004 m. fuchs reading of FAT image files
+07.02.2004 m. fuchs included IE/Mozilla as Active X control
+08.02.2004 m. fuchs desktop switching
+16.02.2004 m. fuchs lean explorer version without additional bells and whistles -> see CVS branch "lean-explorer"
+23.02.2004 m. fuchs start menu navigation using first characters of entry names
+ fixes for leaking GDI handles
+25.02.2004 m. fuchs rebar control for desktop bar
+28.02.2004 m. fuchs "minimize all" functionality
+ various fixes for notification icons, task bar and desktop switching
+12.03.2004 m. fuchs automatic adjustment start button to text size
+15.03.2004 m. fuchs implementation of volume control tray icon
+20.03.2004 m. fuchs context menu for notification area
+21.03.2004 m. fuchs configuration dialog for notification icons
+ XML storage for configuration options
+28.03.2004 m. fuchs configuration options for showing/hiding clock, ...
+04.04.2004 m. fuchs import of IE bookmarks; explorer sidebar with bookmark display
+09.04.2004 m. fuchs changed favorites start menu implementation to work with internal bookmarks
+
+12.04.2004 m. fuchs ShellBrowserChild: jump to addressbar target
+17.05.2004 m. fuchs use precompiled headers for VC++ builds
+01.06.2004 m. fuchs integrate optional SDI mode into main explorer branch
+15.07.2004 m. fuchs fix root path for folders opened from the desktop
+18.07.2004 m. fuchs precompiled header support for GCC 3.4.1
+31.07.2004 m. fuchs use same startmenu entries height as MS explorer
+02.08.2004 m. fuchs context menus for start menus and quick launch bar
+03.08.2004 m. fuchs get version number to display from RES_STR_PRODUCT_VERSION
+16.08.2004 m. fuchs display version information in about dialog and on the desktop
+15.09.2004 m. fuchs remove direct version output from desktop; instead store the activation flag into the registry
+17.09.2004 m. fuchs handle "." and ".." as special direcory names and move them at the very first beginning of directory listings
+23.09.2004 m. fuchs configuration dialog to choose between MDI and SDI mode with persistent storage
+20.11.2004 m. fuchs display notification icon change times
+ notification area button to toggle hidden icons
+ m. fuchs alpha-blend hidden notification icons
+ m. fuchs fix UTF8 conversion for the bookmarks list
+ m. fuchs decode HTML-encoded bookmark names
+ m. fuchs work around GCC's wide string constant bug when compiling inline functions
+27.12.2004 m. fuchs fix GPF for clicks in the favorites folder
+09.01.2005 frik85 update for german resource scripts
+10.01.2005 m. fuchs new _NO_ALPHABLEND compiler switch
+21.01.2005 tamlin Fix crashing browsing NT object namespace with non-zero-terminated UNICODE_STRING.
+27.01.2005 m. fuchs fixes for command line handling
+06.02.2005 m. fuchs support for owner drawn context menus at various places
+08.02.2005 gvg Prefer SEE_MASK_IDLIST, since that one is actually implemented in shell32
+20.02.2005 m. fuchs updates for Expat and XMLStorage files
+21.02.2005 m. fuchs move public expat headers into common include folder
+27.02.2005 frik85 Add support for explorer to load the desk.cpl when right clicking on background.
+04.03.2005 fireball New StartMenu and ReactOS icons by Mindflyer
+05.03.2005 m. fuchs case insensitive startmenu merging
+ m. fuchs update ROS icon in about dialog and start menu side bar
+14.03.2005 gvg tinus: Use RegisterShellHookWindow()
+19.03.2005 m. fuchs register ourselves as task manager window to make the RegisterShellHookWindow() call working [thanks to Filip :)]
+21.03.2005 fireball Nice "About Explorer" icon by Mindflyer
+27.03.2005 m. fuchs hide login screen to make the login on XP faster
+ m. fuchs launch shell DDE server
+ m. fuchs make Shell Hook Messages really work in Windows
+27.03.2005 greatlrd New Explorer icon from Mindflyer
+28.03.2005 m. fuchs launch all registered Shell Service Objects (Systray, network icons, ...)
+ m. fuchs enable multiline tooltips
+01.04.2005 greatlrd David Nordenberg: fixed minor things in swedish translation
+02.04.2005 m. fuchs terminate shell service objects thread if there is nothing to do
+ m. fuchs switch to search icon in search dialog
+ m. fuchs fix tray icon config dialog for the first icon
+ m. fuchs "minimize all": only minimize windows with valid positions
+ m. fuchs fix termination of "search program" dialog
+03.04.2005 m. fuchs fix SDI shell browser
+ m. fuchs display "log off" dialog, add "terminate" menu entry
+ m. fuchs show logoff dialog in lean explorer
+ m. fuchs activate printer folder menu
+14.04.2005 m. fuchs charn: step-wise taskbar resizing
+01.05.2005 m. fuchs merge ROS Shell without integrated explorer part into trunk
+03.05.2005 m. fuchs display custom folders in start menu root
+03.05.2005 m. fuchs rosshell: printer and network folder in start menu
+04.05.2005 greatlrd Fixes for Swedish resource script
+20.05.2005 navaraf Luk "denzil" Frolka: partial Czech translation of Explorer
+02.06.2005 fireball First version of Explorer's translation into Russian. Done by Dmitry Philippov, checked by me, DarkHobbit and others
+03.06.2005 m. fuchs split the big explorer resource file into smaller language specific rescource scripts
+05.06.2005 hpoussin Include French resources in explorer
+15.07.2005 greatlrd update swedish .rc and rename it from sw to sv, remove the german part in swedish rc
+16.07.2005 greatlrd crop the startmenu side bar logo to 30x280
+17.07.2005 m. fuchs add explorer-ro.rc
+26.08.2005 navaraf Make the explorer taskbar look a bit nicer
+12.09.2005 royce security audit of explorer code: strcpy -> lstrcpyn, ...
+19.09.2005 navaraf Fix the taskbar button resizing to account for button spacing.
+21.09.2005 m. fuchs XMLStorage update, Bugfix for UTF-8 strings
+ m. fuchs use size_t for buffer/string lengths instead of int, define COUNTOF if not defined already
+25.09.2005 navaraf Patricio Martínez Ros: Update spanish translation
+25.09.2005 m. fuchs new tool bar icons for the drive bar
+ m. fuchs refactor all IUnknown implementations using IComSrvBase
+30.09.2005 m. fuchs Fix of Bugzilla Bug 676: dynamic explorer start menu sidebar size
+01.10.2005 greatlrd new, smaller startmenu pictures using the dynamic explorer start menu sidebar feature
+01.10.2005 m. fuchs MDI/SDI option dialog: pictures for illustration, remove resizable flag
+02.10.2005 m. fuchs new option to open explorer subfolders in separate windows
+ m. fuchs fix enabling of split border
+ m. fuchs fix directory traversing in explorer SDI windows
+ m. fuchs fix tree list image loading: work around GCC's wide string constant bug
+04.10.2005 m. fuchs complete german resources for explorer
+04.10.2005 m. fuchs "execute" menu entry
+ m. fuchs activate execution from command bar
+05.10.2005 m. fuchs fix UNICODE control panel calls to handle double clicks on the task bar clock
+ m. fuchs one-click activation of "Start" button
+ m. fuchs use GET_X_LPARAM macro in WM_MOUSEMOVE handlers
+ m. fuchs leave TrackStartmenu() function when executing any start menu command
+06.10.2005 m. fuchs implemented command line parser for Explorer
+09.10.2005 m. fuchs Fix for Bugzilla Entry 330: Correctly handle WM_COMMAND messages in web windows without web control
+ m. fuchs replace "search computer" start menu entry by a "not yet implemented" message
+01.11.2005 m. fuchs String::str(), String::toLower() to allow conventient and WINE compatible string conversions
+29.11.2005 m. fuchs Adjustments for Visual Studio 2005: use new secure CT functions, COUNTOF for buffer sizes
+28.12.2005 m. fuchs display icon overlays in Explorer tree view
+31.12.2005 m. fuchs handle "/root" command line parameter
--- /dev/null
+
+For information on how to compile and install the ReactOS Explorer please look at the FAQ web page:
+
+http://www.sky.franken.de/explorer/
+
+
+
+Desktop Example
+---------------
+
+This program doesn't do much, apart from create a window which could be
+used as a desktop.
+
+It's pretty straightforward. It creates a window the size of the screen,
+displays some text in the corner, and then disables ALT+F4.
+
+Ideally, this would be incorporated into some other part of ReactOS, where
+it could be closed in a controlled manner (ie, when the user wishes to exit
+the GUI.)
+
+Hope someone finds it of some use. I think it should run before the
+explorer clone (taskbar) to get the wallpaper displayed (since when
+explorer crashes on Windows, the wallpaper is always displayed, and there
+is always a desktop, even with no icons, when the login window is shown.)
+
+It obviously is in need of some improvement, such as wallpaper actually
+being drawn (stretch, center/centre and tile...)
+
+So, feel free to play around with it.
+
+Andrew "Silver Blade" Greenwood
+silverblade_uk@hotmail.com
+
+
+Explorer Bar Example
+--------------------
+
+I have merged in Alexander Ciobanu's Explorer bar code as a example starting
+for the start menu. Its very simple at this point and just loads a window with
+buttons.
+
+The loading of this module was based on a patch by Martin Fuchs.
+
+Steven Edwards
+Steven_Ed4153@yahoo.com
--- /dev/null
+<hr size="1">
+<table border="0" width="100%" cellspacing="0">
+ <tr>
+ <td><address style="align: right;"><small>
+ROS Explorer Source Code Documentation
+<br>generated on 21.11.2004 by <a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border=0>
+ </small></address>
+ </td>
+ <td>
+ <p align="right"><a href="http://www.sky.franken.de/explorer/" target="_parent">ROS Explorer Homepage</a>
+ </td>
+ </tr>
+</table>
+</body>
+</html>
--- /dev/null
+<hr size="1">
+<table border="0" width="100%" cellspacing="0">
+ <tr>
+ <td><address style="align: right;"><small>
+ROS Explorer Source Code Documentation
+<br>@GEN@ by <a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border=0>
+ </small></address>
+ </td>
+ <td>
+ <p align="right"><a href="http://www.sky.franken.de/explorer/" target="_parent">ROS Explorer Homepage</a>
+ </td>
+ </tr>
+</table>
+</body>
+</html>
--- /dev/null
+Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+ and Clark Cooper
+Copyright (c) 2001, 2002, 2003 Expat maintainers.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<explorer-cfg>
+ <general>
+ <look-and-feel name="classic"/>
+ <explorer mdi="true" separate-folders="true"/>
+ <language name="EN"/>
+ </general>
+
+ <desktop>
+ <icon-alignment algorithm="simple" start="left-top" direction="horizontal"/>
+ </desktop>
+ <desktopbar>
+ <options show-clock="true"/>
+ <positions>
+ <bar name="quicklaunch" left="10" top="2" width="250" height="22"/>
+ <bar name="taskbar" left="300" top="2" width="400" height="22"/>
+ </positions>
+ </desktopbar>
+
+ <taskbar>
+ </taskbar>
+
+ <notify-icons>
+ <options hide-inactive="true" show-button="true" show-hidden="false"/>
+ <icon name="Volume Control" text="Volume" show="show"/>
+ </notify-icons>
+
+ <startmenu>
+ <order>
+ </order>
+ </startmenu>
+
+ <quicklaunch>
+ <order>
+ </order>
+ </quicklaunch>
+
+ <launchbar>
+ <entry type="startmenu"/>
+
+ <entry type="programs">
+ </entry>
+
+ <entry type="settings"/>
+ <entry type="desktops"/>
+ <entry type="notify-area"/>
+ <entry type="clock"/>
+ </launchbar>
+</explorer-cfg>
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "resource.h"
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Czech resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CSY)
+#ifdef _WIN32
+LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
+#pragma code_page(1250)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_MDIFRAME MENU PRELOAD DISCARDABLE
+BEGIN
+ POPUP "&Soubor"
+ BEGIN
+ MENUITEM "&Spustit...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Ukonèit", ID_FILE_EXIT
+ END
+ POPUP "&Zobrazení"
+ BEGIN
+ MENUITEM "&Li\9ata nástrojù", ID_VIEW_TOOL_BAR
+ MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR
+ MENUITEM "L&i\9ata diskù", ID_VIEW_DRIVE_BAR, CHECKED
+ MENUITEM "&Boèní li\9ata", ID_VIEW_SIDE_BAR
+ MENUITEM "&Status Bar", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Aktualizovat\tF5", ID_REFRESH
+ MENUITEM "&Celá obrazovka\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "SDI", ID_VIEW_SDI
+ END
+ POPUP "&Okno"
+ BEGIN
+ MENUITEM "&Nové Okno", ID_WINDOW_NEW
+ MENUITEM "&Kaskádovat\tShift+F5", ID_WINDOW_CASCADE
+ MENUITEM "&Uspoøádat vodorovnì", ID_WINDOW_TILE_HORZ
+ MENUITEM "U&spoøádat svisle\tShift+F4", ID_WINDOW_TILE_VERT
+ MENUITEM "Us&poøádat automaticky", ID_WINDOW_AUTOSORT
+ MENUITEM "Usp&oøádat symboly", ID_WINDOW_ARRANGE
+ END
+ POPUP "&Nástroje"
+ BEGIN
+ MENUITEM "&Nastavení", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Pomoc"
+ BEGIN
+ MENUITEM "&Prùzkumník &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "O p&rùzkumníku...", ID_ABOUT_EXPLORER
+ MENUITEM "&O OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_DESKTOPBAR MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Nastavení...", ID_DESKTOPBAR_SETTINGS
+ MENUITEM "&Správce úloh...", ID_TASKMGR
+ MENUITEM SEPARATOR
+ MENUITEM "&O Exploreru...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_VOLUME MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Otevøít ovládání hlasitosti", ID_TRAY_VOLUME
+ MENUITEM "&Upravit vlastnosti zvuku", ID_VOLUME_PROPERTIES
+ END
+END
+
+IDM_NOTIFYAREA MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Zobrazit skryté ikony", ID_SHOW_HIDDEN_ICONS
+ MENUITEM "Z&obrazit ikonu tlaèítka", ID_SHOW_ICON_BUTTON
+ MENUITEM "&Nastavit upozornìní...", ID_CONFIG_NOTIFYAREA
+ MENUITEM "N&astavit datum a èas...", ID_CONFIG_TIME
+ MENUITEM SEPARATOR
+ MENUITEM "&O prùzkuníku...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_SDIFRAME MENU PRELOAD DISCARDABLE
+BEGIN
+ POPUP "&Soubor"
+ BEGIN
+ MENUITEM "&Spustit...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Ukonèit", ID_FILE_EXIT
+ END
+ POPUP "&Zobrazení"
+ BEGIN
+ MENUITEM "&Li\9ata nástrojù", ID_VIEW_TOOL_BAR
+ MENUITEM "&Boèní li\9ata", ID_VIEW_SIDE_BAR, GRAYED
+ MENUITEM "&Status li\9ata", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Aktualizovat\tF5", ID_REFRESH
+ MENUITEM "Celá obrazovka\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "&MDI", ID_VIEW_MDI
+ END
+ POPUP "&Nástroje"
+ BEGIN
+ MENUITEM "&Nastavení", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Pomoc"
+ BEGIN
+ MENUITEM "Prùzkumník &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "O &prùzkumníku...", ID_ABOUT_EXPLORER
+ MENUITEM "O &OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_EXECUTE DIALOG FIXED IMPURE 15, 13, 210, 63
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Spustit"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10
+ CONTROL "&Command:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,
+ 18,60,10
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
+ CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,
+ 45,71,12
+ DEFPUSHBUTTON "&Spustit",1,158,6,47,14
+ PUSHBUTTON "&Zru\9ait",2,158,23,47,14
+ PUSHBUTTON "&Pomoc",254,158,43,47,14
+END
+
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Hledat program v nabídce Start"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "&Filter:",IDC_STATIC,7,9,18,8
+ EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT |
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER |
+ WS_TABSTOP,7,25,186,33
+ PUSHBUTTON "&Vyhledat",IDC_CHECK_ENTRIES,143,7,50,14
+END
+
+IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Vlastnosti plochy"
+FONT 8, "MS Sans Serif"
+BEGIN
+ LTEXT "Prosím zvolte si zpùsob zarovnání ikon:",IDC_STATIC,7,7,
+ 166,8
+ CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,25,46,44
+ CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,25,46,44
+ CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,25,46,44
+ CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,25,46,44
+ CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,73,46,44
+ CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,73,46,44
+ CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,73,46,44
+ CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,73,46,44
+ CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,121,46,44
+ CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,121,46,44
+ CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,121,46,44
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
+ WS_TABSTOP,159,121,46,44
+ CONTROL "Zobrazit verzi",ID_DESKTOP_VERSION,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10
+END
+
+IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Vlastnosti panelu úloh"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CONTROL "&Zobrazit èas",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,152,52,10
+ CONTROL "&Skrýt neaktivní ikony",ID_HIDE_INACTIVE_ICONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,174,111,10
+ PUSHBUTTON "&Upozornìní...",ID_CONFIG_NOTIFYAREA,153,173,50,14
+END
+
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Vlastnosti nabídky Start"
+FONT 8, "MS Sans Serif"
+BEGIN
+END
+
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Nastavení ikon v oblasti upozoròování"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES |
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31
+ LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8
+ EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL
+ LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8
+ EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL
+ LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8
+ EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL
+ GROUPBOX "&Display Mode",IDC_LABEL4,7,96,157,28
+ CONTROL "&show",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON |
+ WS_TABSTOP,15,108,33,10
+ CONTROL "&hide",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66,
+ 108,29,10
+ CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button",
+ BS_AUTORADIOBUTTON,112,108,43,10
+ ICON "",IDC_PICTURE,173,101,21,20
+ LTEXT "&Last Change:",IDC_LABEL6,7,132,43,8
+ EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL |
+ ES_READONLY
+ CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10
+ DEFPUSHBUTTON "&Nastavit",IDOK,91,153,50,14,WS_GROUP
+ PUSHBUTTON "&Zru\9ait",IDCANCEL,151,153,50,14
+END
+
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Volba MDI / SDI módu"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "Prosím zvolte si Vámi upøednostòovaný zpùsob zobrazení oken prùzkumníka:",
+ IDC_STATIC,7,7,160,8
+ CONTROL "&MDI (Mnoho dokumentový interface)",IDC_MDI,"Button",
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,121,10
+ CONTROL "&SDI (Jedno dokumentový interface)",IDC_SDI,"Button",
+ BS_AUTORADIOBUTTON,7,62,115,10
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13
+ CONTROL "Open Subfolders in s&eparate windows",
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,90,135,10
+ LTEXT "Toto nastavení bude pou\9eito jako implicitní pro v\9aechny okna prùzkumníka.",
+ IDC_STATIC,7,111,174,22
+ DEFPUSHBUTTON "&Nastavit",IDOK,29,136,50,14,WS_GROUP
+ PUSHBUTTON "&Zru\9ait",IDCANCEL,106,136,50,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TITLE "Reactos prùzkumník"
+ IDS_START "Start"
+ IDS_LOGOFF "Odhlásit se..."
+ IDS_SHUTDOWN "Vypnout..."
+ IDS_LAUNCH "Spustit..."
+ IDS_START_HELP "Pomoc"
+ IDS_SEARCH_FILES "Hledat..."
+ IDS_DOCUMENTS "Dokumenty"
+ IDS_FAVORITES "Oblíbené"
+ IDS_PROGRAMS "Programy"
+ IDS_SETTINGS "Nastavení"
+ IDS_EXPLORE "Prozkoumat"
+ IDS_EMPTY "(Prázdné)"
+ IDS_RECENT "Nedávné dokumenty"
+ IDS_ADMIN "Administrace"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_STARTMENU "Nabídka Start"
+ IDS_MINIMIZE_ALL "minimalizovat v\9aechna okna"
+ IDS_DESKTOP_NUM "Plocha %d"
+ IDS_VOLUME "Hlasitost"
+ IDS_ITEMS_CUR "souèasné polo\9eky"
+ IDS_ITEMS_CONFIGURED "nastavení"
+ IDS_ITEMS_VISIBLE "viditelné"
+ IDS_ITEMS_HIDDEN "skryté"
+ IDS_NOTIFY_SHOW "zobrazit"
+ IDS_NOTIFY_HIDE "skrýt"
+ IDS_NOTIFY_AUTOHIDE "skrývat automaticky"
+ IDS_SHOW_HIDDEN_ICONS "Zobrazit skryté ikony"
+ IDS_HIDE_ICONS "Skrýt ikony"
+ IDS_TERMINATE "Ukonèit ReactOS prùzkumník"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_NETWORK "Sí\8d"
+ IDS_CONNECTIONS "Sí\9dové spojení"
+ IDS_DRIVES "Disky"
+ IDS_SEARCH_COMPUTER "Hledat..."
+ IDS_SETTINGS_MENU "Nastavení"
+ IDS_CONTROL_PANEL "Ovládací panel"
+ IDS_PRINTERS "Tiskárny"
+ IDS_BROWSE "Prohlí\9eet soubory"
+ IDS_SEARCH_PRG "Search Program..."
+ IDS_ALL_USERS "V\9aichni u\9eivatelé\\"
+ IDS_SEARCH "Hledat"
+ IDS_ABOUT_EXPLORER "&O prùzkumníku..."
+ IDS_LAUNCH_MANY_PROGRAMS
+ "Spustili jste více ne\9e jeden program.\nJste si jisti, \9ee je chcete spustit v\9aechny?"
+ IDS_DESKTOPBAR_SETTINGS "Nastavení plochy"
+ IDS_DESKTOP "Plocha"
+ IDS_TASKBAR "Panel úloh"
+END
+
+#endif // Czech resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// German (Germany) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""resource.h""\r\n"
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // German (Germany) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "resource.h"
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// German (Germany) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_MDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Datei"
+ BEGIN
+ MENUITEM "&Ausführen...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Beenden", ID_FILE_EXIT
+ END
+ POPUP "&Ansicht"
+ BEGIN
+ MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR
+ MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR
+ MENUITEM "Lauf&werkleiste", ID_VIEW_DRIVE_BAR, CHECKED
+ MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR
+ MENUITEM "&Status Bar", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Aktualisieren\tF5", ID_REFRESH
+ MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "SDI", ID_VIEW_SDI
+ END
+ POPUP "&Fenster"
+ BEGIN
+ MENUITEM "Neues &Fenster", ID_WINDOW_NEW
+ MENUITEM "Über&lappend\tUmschalt+F5", ID_WINDOW_CASCADE
+ MENUITEM "&Untereinander", ID_WINDOW_TILE_HORZ
+ MENUITEM "&Nebeneinander\tUmschalt+F4", ID_WINDOW_TILE_VERT
+ MENUITEM "au&tomatisch anordnen", ID_WINDOW_AUTOSORT
+ MENUITEM "&Symbole anordnen", ID_WINDOW_ARRANGE
+ END
+ POPUP "&Extras"
+ BEGIN
+ MENUITEM "&Optionen", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Hilfe"
+ BEGIN
+ MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "&Über ReactOS Explorer...", ID_ABOUT_EXPLORER
+ MENUITEM "Über React&OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_SDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Datei"
+ BEGIN
+ MENUITEM "&Ausführen...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Schliessen", ID_FILE_EXIT
+ END
+ POPUP "&Ansicht"
+ BEGIN
+ MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR
+ MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED
+ MENUITEM "&Status Bar", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Aktualisieren\tF5", ID_REFRESH
+ MENUITEM "&Vollbild\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "&MDI", ID_VIEW_MDI
+ END
+ POPUP "&Extras"
+ BEGIN
+ MENUITEM "&Optionen", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Hilfe"
+ BEGIN
+ MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "&Über Explorer...", ID_ABOUT_EXPLORER
+ MENUITEM "Über &OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_DESKTOPBAR MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Einstellungen...", ID_DESKTOPBAR_SETTINGS
+ MENUITEM "&Task Manager...", ID_TASKMGR
+ MENUITEM SEPARATOR
+ MENUITEM "&Über Explorer...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_NOTIFYAREA MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Zeige versteckte Icons", ID_SHOW_HIDDEN_ICONS
+ MENUITEM "Zeige Icon-&Button", ID_SHOW_ICON_BUTTON
+ MENUITEM "&Konfiguriere Benachrichtigungen...", ID_CONFIG_NOTIFYAREA
+ MENUITEM "Einstellen von &Datum/Zeit...", ID_CONFIG_TIME
+ MENUITEM SEPARATOR
+ MENUITEM "&Über Explorer...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_VOLUME MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Öffne &Lautstärkeregler", ID_TRAY_VOLUME
+ MENUITEM "Editieren der Audio-&Einstellungen", ID_VOLUME_PROPERTIES
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Ausführen"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10
+ CONTROL "Befehls&zeile:",-1,"Static",SS_LEFTNOWORDWRAP |
+ WS_GROUP,3,18,60,10
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
+ CONTROL "Als &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+ 3,45,71,12
+ DEFPUSHBUTTON "&OK",1,158,6,47,14
+ PUSHBUTTON "A&bbrechen",2,158,23,47,14
+ PUSHBUTTON "&Hilfe",254,158,43,47,14
+END
+
+IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Über ReactOS Explorer"
+FONT 10, "MS Sans Serif"
+BEGIN
+ LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11
+ LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8
+ LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8
+ LTEXT "",IDC_WIN_VERSION,91,58,98,22
+ LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129,
+ 8
+ CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,
+ 154,90,38,12
+END
+
+IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 204
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Desktop-Einstellungen"
+FONT 8, "MS Sans Serif"
+BEGIN
+ LTEXT "Bitte wählen Sie den gewünschten Platzierungs-Algorithmus für die Desktop-Icons aus:",
+ IDC_STATIC,7,7,197,23
+ CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,35,46,44
+ CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,35,46,44
+ CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,35,46,44
+ CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,35,46,44
+ CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,83,46,44
+ CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,83,46,44
+ CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,83,46,44
+ CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,83,46,44
+ CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,131,46,44
+ CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,131,46,44
+ CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,131,46,44
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
+ WS_TABSTOP,159,131,46,44
+ CONTROL "Anzeige der &Versionsnummer",ID_DESKTOP_VERSION,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,187,107,10
+END
+
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 204
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Startmenü-Einstellungen"
+FONT 8, "MS Sans Serif"
+BEGIN
+END
+
+IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 204
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Taskbar-Einstellungen"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CONTROL "Anzeigen der &Uhr",ID_SHOW_CLOCK,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,152,71,10
+ CONTROL "&verstecke inaktive Notification-Icons",
+ ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,174,131,10
+ PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14
+END
+
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Auswahl des Explorerfenster-Modus"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "Please select your prefered explorer user interface:",
+ IDC_STATIC,7,7,160,8
+ CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button",
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10
+ CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button",
+ BS_AUTORADIOBUTTON,7,62,118,10
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13
+ CONTROL "Öffne Unterverzeichnisses in &neuen Fenstern",
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,90,157,10
+ LTEXT "Diese Auswahl wird künftig für alle Explorer-Fenster verwendet werden.",
+ IDC_STATIC,7,111,174,22
+ DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP
+ PUSHBUTTON "A&bbrechen",IDCANCEL,106,136,50,14
+END
+
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Konfiguration der Benachrichtigungs-Icons"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES |
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31
+ LTEXT "&Tooltip-Text:",IDC_LABEL1,7,44,40,8
+ EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL
+ LTEXT "&Fenster-Titel:",IDC_LABEL2,7,63,42,8
+ EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL
+ LTEXT "&Modulpfad:",IDC_LABEL3,7,81,36,8
+ EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL
+ GROUPBOX "&Anzeigemodus",IDC_LABEL4,7,96,157,28
+ CONTROL "&zeigen",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON |
+ WS_TABSTOP,15,108,37,10
+ CONTROL "&verstecken",IDC_NOTIFY_HIDE,"Button",
+ BS_AUTORADIOBUTTON,55,108,51,10
+ CONTROL "a&utomatisch",IDC_NOTIFY_AUTOHIDE,"Button",
+ BS_AUTORADIOBUTTON,110,108,54,10
+ ICON "",IDC_PICTURE,173,101,20,20
+ LTEXT "&Letzte Änderung:",IDC_LABEL6,7,132,55,8
+ EDITTEXT IDC_LAST_CHANGE,66,129,98,14,ES_AUTOHSCROLL |
+ ES_READONLY
+ CONTROL "zei&ge versteckte",ID_SHOW_HIDDEN_ICONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,68,10
+ DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP
+ PUSHBUTTON "A&bbrechen",IDCANCEL,151,153,50,14
+END
+
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Programmsuche im Startmenü"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "&Filter:",IDC_STATIC,7,9,18,8
+ EDITTEXT IDC_FILTER,34,7,96,14,ES_AUTOHSCROLL
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT |
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER |
+ WS_TABSTOP,7,25,186,33
+ PUSHBUTTON "Alle über&prüfen",IDC_CHECK_ENTRIES,138,7,55,14
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""resource.h""\r\n"
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TITLE "Reactos Explorer"
+ IDS_START "Start"
+ IDS_LOGOFF "Abmelden..."
+ IDS_SHUTDOWN "Herunterfahren..."
+ IDS_LAUNCH "Starten..."
+ IDS_START_HELP "Hilfe"
+ IDS_SEARCH_FILES "Suche Dateien..."
+ IDS_DOCUMENTS "Dokumente"
+ IDS_FAVORITES "Bookmarks"
+ IDS_PROGRAMS "Programme"
+ IDS_SETTINGS "Einstellungen"
+ IDS_EXPLORE "Explore"
+ IDS_EMPTY "(Empty)"
+ IDS_RECENT "Aktuelle Dokumente"
+ IDS_ADMIN "Verwaltung"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_STARTMENU "Startmenü"
+ IDS_MINIMIZE_ALL "alle Fenster minimieren"
+ IDS_DESKTOP_NUM "Desktop %d"
+ IDS_VOLUME "Lautstärke"
+ IDS_ITEMS_CUR "aktuelle Icons"
+ IDS_ITEMS_CONFIGURED "Konfiguratrion"
+ IDS_ITEMS_VISIBLE "sichtbar"
+ IDS_ITEMS_HIDDEN "unsichtbar"
+ IDS_NOTIFY_SHOW "sichtbar"
+ IDS_NOTIFY_HIDE "versteckt"
+ IDS_NOTIFY_AUTOHIDE "automatisch"
+ IDS_SHOW_HIDDEN_ICONS "Zeige versteckte Icons"
+ IDS_HIDE_ICONS "Verstecke Icons"
+ IDS_TERMINATE "ROS Explorer beenden"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_NETWORK "Netzwerk"
+ IDS_CONNECTIONS "Netzwerk-Verbindungen"
+ IDS_DRIVES "Verzeichnisse"
+ IDS_SEARCH_COMPUTER "Suche Computer..."
+ IDS_SETTINGS_MENU "Einstellungen-Menu"
+ IDS_CONTROL_PANEL "Systemsteuerung"
+ IDS_PRINTERS "Drucker"
+ IDS_BROWSE "Dateien"
+ IDS_SEARCH_PRG "Suche Programm..."
+ IDS_ALL_USERS "Alle Benutzer\\"
+ IDS_SEARCH "Suche"
+ IDS_ABOUT_EXPLORER "&Über Explorer..."
+ IDS_LAUNCH_MANY_PROGRAMS
+ "Sie haben mehrere Programme ausgewählt.\nSind Sie sicher, daß sie diese alle starten wollen?"
+ IDS_DESKTOPBAR_SETTINGS "Desktop-Einstellungen"
+ IDS_DESKTOP "Desktop"
+ IDS_TASKBAR "Taskbar"
+END
+
+#endif // German (Germany) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_MDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&File"
+ BEGIN
+ MENUITEM "&Execute...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "E&xit", ID_FILE_EXIT
+ END
+ POPUP "&View"
+ BEGIN
+ MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR
+ MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR
+ MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED
+ MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR
+ MENUITEM "&Status Bar", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Refresh\tF5", ID_REFRESH
+ MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "SDI", ID_VIEW_SDI
+ END
+ POPUP "&Window"
+ BEGIN
+ MENUITEM "New &Window", ID_WINDOW_NEW
+ MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE
+ MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ
+ MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT
+ MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT
+ MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE
+ END
+ POPUP "&Tools"
+ BEGIN
+ MENUITEM "&Options", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Help"
+ BEGIN
+ MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER
+ MENUITEM "About &OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_DESKTOPBAR MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Settings...", ID_DESKTOPBAR_SETTINGS
+ MENUITEM "&Task Manager...", ID_TASKMGR
+ MENUITEM SEPARATOR
+ MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_VOLUME MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Open Volume Control", ID_TRAY_VOLUME
+ MENUITEM "Adjust Audio Properties", ID_VOLUME_PROPERTIES
+ END
+END
+
+IDM_NOTIFYAREA MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Show hidden icons", ID_SHOW_HIDDEN_ICONS
+ MENUITEM "Show Icon &Button", ID_SHOW_ICON_BUTTON
+ MENUITEM "&Configure Notifications...", ID_CONFIG_NOTIFYAREA
+ MENUITEM "Adjust Date/&Time...", ID_CONFIG_TIME
+ MENUITEM SEPARATOR
+ MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_SDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&File"
+ BEGIN
+ MENUITEM "&Execute...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Close", ID_FILE_EXIT
+ END
+ POPUP "&View"
+ BEGIN
+ MENUITEM "&Toolbar", ID_VIEW_TOOL_BAR
+ MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED
+ MENUITEM "&Status Bar", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Refresh\tF5", ID_REFRESH
+ MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "&MDI", ID_VIEW_MDI
+ END
+ POPUP "&Tools"
+ BEGIN
+ MENUITEM "&Options", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Help"
+ BEGIN
+ MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "&About Explorer...", ID_ABOUT_EXPLORER
+ MENUITEM "About &OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Execute"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10
+ CONTROL "&Command:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,
+ 18,60,10
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
+ CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,
+ 45,71,12
+ DEFPUSHBUTTON "&OK",1,158,6,47,14
+ PUSHBUTTON "&Cancel",2,158,23,47,14
+ PUSHBUTTON "&Help",254,158,43,47,14
+END
+
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Search Program in Startmenu"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "&Filter:",IDC_STATIC,7,9,18,8
+ EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT |
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER |
+ WS_TABSTOP,7,25,186,33
+ PUSHBUTTON "&Check Entries",IDC_CHECK_ENTRIES,143,7,50,14
+END
+
+IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Desktop Properties"
+FONT 8, "MS Sans Serif"
+BEGIN
+ LTEXT "Please select your prefered icon alignment algorithm:",
+ IDC_STATIC,7,7,166,8
+ CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,25,46,44
+ CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,25,46,44
+ CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,25,46,44
+ CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,25,46,44
+ CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,73,46,44
+ CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,73,46,44
+ CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,73,46,44
+ CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,73,46,44
+ CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,121,46,44
+ CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,121,46,44
+ CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,121,46,44
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
+ WS_TABSTOP,159,121,46,44
+ CONTROL "Display &Version Number",ID_DESKTOP_VERSION,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10
+END
+
+IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Taskbar Properties"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CONTROL "show &clock",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,152,52,10
+ CONTROL "&hide inactive notification icons",
+ ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,174,111,10
+ PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14
+END
+
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Startmenu Properties"
+FONT 8, "MS Sans Serif"
+BEGIN
+END
+
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Configure Notification Icons"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES |
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31
+ LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8
+ EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL
+ LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8
+ EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL
+ LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8
+ EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL
+ GROUPBOX "&Display Mode",IDC_LABEL4,7,96,157,28
+ CONTROL "&show",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON |
+ WS_TABSTOP,15,108,33,10
+ CONTROL "&hide",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66,
+ 108,29,10
+ CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button",
+ BS_AUTORADIOBUTTON,112,108,43,10
+ ICON "",IDC_PICTURE,173,101,21,20
+ LTEXT "&Last Change:",IDC_LABEL6,7,132,43,8
+ EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL |
+ ES_READONLY
+ CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10
+ DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP
+ PUSHBUTTON "&Cancel",IDCANCEL,151,153,50,14
+END
+
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Choose Explorer window mode"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "Please select your prefered explorer user interface:",
+ IDC_STATIC,7,7,160,8
+ CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button",
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10
+ CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button",
+ BS_AUTORADIOBUTTON,7,62,118,10
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13
+ CONTROL "Open Subfolders in s&eparate windows",
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,90,135,10
+ LTEXT "This setting will be used as default for all explorer windows in the future.",
+ IDC_STATIC,7,111,174,22
+ DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP
+ PUSHBUTTON "&Cancel",IDCANCEL,106,136,50,14
+END
+
+IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "About ReactOS Explorer"
+FONT 10, "MS Sans Serif"
+BEGIN
+ LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11
+ LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8
+ LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8
+ LTEXT "",IDC_WIN_VERSION,91,58,98,22
+ LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129,
+ 8
+ CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,
+ 154,90,38,12
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "#include <windows.h>\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TITLE "Reactos Explorer"
+ IDS_START "Start"
+ IDS_LOGOFF "Log Off..."
+ IDS_SHUTDOWN "Turn Off..."
+ IDS_LAUNCH "Run..."
+ IDS_START_HELP "Help"
+ IDS_SEARCH_FILES "Search..."
+ IDS_DOCUMENTS "My Documents"
+ IDS_FAVORITES "Favorites"
+ IDS_PROGRAMS "Programs"
+ IDS_SETTINGS "Settings"
+ IDS_EXPLORE "Explore"
+ IDS_EMPTY "(Empty)"
+ IDS_RECENT "Recent Documents"
+ IDS_ADMIN "Administration"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_STARTMENU "Startmenu"
+ IDS_MINIMIZE_ALL "minimize all windows"
+ IDS_DESKTOP_NUM "Desktop %d"
+ IDS_VOLUME "Volume"
+ IDS_ITEMS_CUR "current items"
+ IDS_ITEMS_CONFIGURED "configuration"
+ IDS_ITEMS_VISIBLE "visible"
+ IDS_ITEMS_HIDDEN "hidden"
+ IDS_NOTIFY_SHOW "show"
+ IDS_NOTIFY_HIDE "hide"
+ IDS_NOTIFY_AUTOHIDE "autohide"
+ IDS_SHOW_HIDDEN_ICONS "Show hidden icons"
+ IDS_HIDE_ICONS "Hide icons"
+ IDS_TERMINATE "Terminate ROS Explorer"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_NETWORK "Network"
+ IDS_CONNECTIONS "Network Connections"
+ IDS_DRIVES "Drives"
+ IDS_SEARCH_COMPUTER "Search Computer..."
+ IDS_SETTINGS_MENU "Settings Menu"
+ IDS_CONTROL_PANEL "Control Panel"
+ IDS_PRINTERS "Printers"
+ IDS_BROWSE "Browse Files"
+ IDS_SEARCH_PRG "Search Program..."
+ IDS_ALL_USERS "All Users\\"
+ IDS_SEARCH "Search"
+ IDS_ABOUT_EXPLORER "&About Explorer..."
+ IDS_LAUNCH_MANY_PROGRAMS
+ "You have selected more than one program.\nAre you sure you want to launch all of them?"
+ IDS_DESKTOPBAR_SETTINGS "Desktop Settings"
+ IDS_DESKTOP "Desktop"
+ IDS_TASKBAR "Taskbar"
+END
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Spanish (Castilian) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ESP)
+#ifdef _WIN32
+LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_MDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Archivo"
+ BEGIN
+ MENUITEM "E&jecutar...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Salir", ID_FILE_EXIT
+ END
+ POPUP "&Ver"
+ BEGIN
+ MENUITEM "&Herramientas", ID_VIEW_TOOL_BAR
+ MENUITEM "Barra &Extra", ID_VIEW_EXTRA_BAR
+ MENUITEM "Barra de &Unidades", ID_VIEW_DRIVE_BAR, CHECKED
+ MENUITEM "Barra &Lateral", ID_VIEW_SIDE_BAR
+ MENUITEM "Barra de &Estado", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Actualizar\tF5", ID_REFRESH
+ MENUITEM "P&antalla Completa\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "&SDI", ID_VIEW_SDI
+ END
+ POPUP "&Ventana"
+ BEGIN
+ MENUITEM "Nueva &Ventana", ID_WINDOW_NEW
+ MENUITEM "Cascada\tShift+F5", ID_WINDOW_CASCADE
+ MENUITEM "Mosaico &Horizontal", ID_WINDOW_TILE_HORZ
+ MENUITEM "Mosaico &Vertical\tShift+F4", ID_WINDOW_TILE_VERT
+ MENUITEM "Agrupar Automaticamente", ID_WINDOW_AUTOSORT
+ MENUITEM "Agrupar &Símbolos", ID_WINDOW_ARRANGE
+ END
+ POPUP "&Tools"
+ BEGIN
+ MENUITEM "&Options", ID_TOOLS_OPTIONS
+ END
+ POPUP "A&yuda"
+ BEGIN
+ MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER
+ MENUITEM "Acerca de &OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_DESKTOPBAR MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Configuracion...", ID_DESKTOPBAR_SETTINGS
+ MENUITEM "&Administrador de Tareas...", ID_TASKMGR
+ MENUITEM SEPARATOR
+ MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_VOLUME MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Abrir Control de Volumen", ID_TRAY_VOLUME
+ MENUITEM "Ajustar Propiedades de Audio", ID_VOLUME_PROPERTIES
+ END
+END
+
+IDM_NOTIFYAREA MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Mostrar iconos ocultos", ID_SHOW_HIDDEN_ICONS
+ MENUITEM "Mostrar &Botón de Icono", ID_SHOW_ICON_BUTTON
+ MENUITEM "&Configurar Notificaciones...", ID_CONFIG_NOTIFYAREA
+ MENUITEM "Ajustar Fecha/&Hora...", ID_CONFIG_TIME
+ MENUITEM SEPARATOR
+ MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_SDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Archivo"
+ BEGIN
+ MENUITEM "E&jecutar...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "S&alir", ID_FILE_EXIT
+ END
+ POPUP "&Ver"
+ BEGIN
+ MENUITEM "&Barra de Herramientas", ID_VIEW_TOOL_BAR
+ MENUITEM "Barra &Lateral", ID_VIEW_SIDE_BAR, GRAYED
+ MENUITEM "Barra de &Estado", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Actualizar\tF5", ID_REFRESH
+ MENUITEM "P&antalla Completa\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "&MDI", ID_VIEW_MDI
+ END
+ POPUP "Herramientas"
+ BEGIN
+ MENUITEM "&Opciones", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Ayuda"
+ BEGIN
+ MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "&Acerca de Explorer...", ID_ABOUT_EXPLORER
+ MENUITEM "Acerca de &OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Ejecutar"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10
+ CONTROL "Orden:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,18,
+ 60,10
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
+ CONTROL "Como &Símbolo",214,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,3,45,71,12
+ DEFPUSHBUTTON "&Aceptar",1,158,6,47,14
+ PUSHBUTTON "&Cancelar",2,158,23,47,14
+ PUSHBUTTON "&Ayuda",254,158,43,47,14
+END
+
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Buscar Programa en el menu Inicio"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "&Filtro:",IDC_STATIC,7,9,23,8
+ EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT |
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER |
+ WS_TABSTOP,7,25,186,33
+ PUSHBUTTON "&Marcar Entradas",IDC_CHECK_ENTRIES,136,7,57,14
+END
+
+IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Propiedades de Pantalla"
+FONT 8, "MS Sans Serif"
+BEGIN
+ LTEXT "Por favor seleccione su algoritmo de alineamiento preferido:",
+ IDC_STATIC,7,7,195,8
+ CONTROL "izquierda/arriba abajo",IDC_ICON_ALIGN_0,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,25,46,44
+ CONTROL "izquierda/arriba derecha",IDC_ICON_ALIGN_1,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,25,46,44
+ CONTROL "derecha/arriba izquierda",IDC_ICON_ALIGN_2,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,25,46,44
+ CONTROL "derecha/arriba abajo",IDC_ICON_ALIGN_3,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,25,46,44
+ CONTROL "derecha/abajo arriba",IDC_ICON_ALIGN_4,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,73,46,44
+ CONTROL "izquierda/abajo derecha",IDC_ICON_ALIGN_5,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,73,46,44
+ CONTROL "derecha/abajo izquierda",IDC_ICON_ALIGN_6,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,73,46,44
+ CONTROL "derecha/abajo",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,73,46,44
+ CONTROL "borde inferior",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,121,46,44
+ CONTROL "borde H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,121,46,44
+ CONTROL "aproximado",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,121,46,44
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
+ WS_TABSTOP,159,121,46,44
+ CONTROL "Mostrar &Version",ID_DESKTOP_VERSION,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10
+END
+
+IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Propiedades de la Barra de Tareas"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CONTROL "Mostrar &Reloj",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,152,56,10
+ CONTROL "&Ocultar iconos de notificacion inactivos",
+ ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,174,136,10
+ PUSHBUTTON "&Notificaciones...",ID_CONFIG_NOTIFYAREA,145,173,64,14
+END
+
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Propiedades del Menú Inicio"
+FONT 8, "MS Sans Serif"
+BEGIN
+END
+
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Configurar Iconos de Notificaciones"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES |
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31
+ LTEXT "&Texto de Info:",IDC_LABEL1,8,44,51,8
+ EDITTEXT IDC_NOTIFY_TOOLTIP,82,42,117,14,ES_AUTOHSCROLL
+ LTEXT "Título de la V&entana:",IDC_LABEL2,8,63,70,8
+ EDITTEXT IDC_NOTIFY_TITLE,82,60,117,14,ES_AUTOHSCROLL
+ LTEXT "&Parche del Módulo:",IDC_LABEL3,8,81,65,8
+ EDITTEXT IDC_NOTIFY_MODULE,82,78,117,14,ES_AUTOHSCROLL
+ GROUPBOX "Modo de &Display",IDC_LABEL4,7,96,157,28
+ CONTROL "&Mostrar",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON |
+ WS_TABSTOP,15,108,38,10
+ CONTROL "&Ocultar",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,
+ 66,108,36,10
+ CONTROL "A&utoocultar",IDC_NOTIFY_AUTOHIDE,"Button",
+ BS_AUTORADIOBUTTON,112,108,50,10
+ ICON "",IDC_PICTURE,173,101,21,20
+ LTEXT "Último cambio:",IDC_LABEL6,7,132,50,8
+ EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL |
+ ES_READONLY
+ CONTROL "Mostrar Ocu<os",ID_SHOW_HIDDEN_ICONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,64,10
+ DEFPUSHBUTTON "&Aceptar",IDOK,91,153,50,14,WS_GROUP
+ PUSHBUTTON "&Cancelar",IDCANCEL,151,153,50,14
+END
+
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Elegir modo MDI / SDI"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "Por favor, seleccione su interfaz de usuario preferida para el explorador:",
+ IDC_STATIC,7,7,170,18
+ CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button",
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,123,10
+ CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button",
+ BS_AUTORADIOBUTTON,7,62,116,10
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13
+ CONTROL "Open Subfolders in s&eparate windows",
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,90,135,10
+ LTEXT "Esta configuración se usará por defecto y apartir de ahora para todas las ventanas del explorador.",
+ IDC_STATIC,7,111,174,22
+ DEFPUSHBUTTON "&Aceptar",IDOK,29,136,50,14,WS_GROUP
+ PUSHBUTTON "&Cancelar",IDCANCEL,106,136,50,14
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "#include <windows.h>\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TITLE "ReactOS Explorer"
+ IDS_START "Iniciar"
+ IDS_LOGOFF "Salir..."
+ IDS_SHUTDOWN "Apagar..."
+ IDS_LAUNCH "Ejecutar..."
+ IDS_START_HELP "Ayuda"
+ IDS_SEARCH_FILES "Buscar..."
+ IDS_DOCUMENTS "Documentos"
+ IDS_FAVORITES "Favoritos"
+ IDS_PROGRAMS "Programas"
+ IDS_SETTINGS "Configuración"
+ IDS_EXPLORE "Explorar"
+ IDS_EMPTY "(Vacío)"
+ IDS_RECENT "Documentos Recientes"
+ IDS_ADMIN "Administracion"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_STARTMENU "Menú Inicio"
+ IDS_MINIMIZE_ALL "mimimizar todas las ventanas"
+ IDS_DESKTOP_NUM "Escritorio %d"
+ IDS_VOLUME "Volumen"
+ IDS_ITEMS_CUR "Objetos Actuales"
+ IDS_ITEMS_CONFIGURED "configuración"
+ IDS_ITEMS_VISIBLE "visible"
+ IDS_ITEMS_HIDDEN "oculto"
+ IDS_NOTIFY_SHOW "mostrar"
+ IDS_NOTIFY_HIDE "ocultar"
+ IDS_NOTIFY_AUTOHIDE "autoocultar"
+ IDS_SHOW_HIDDEN_ICONS "Mostrar iconos ocultos"
+ IDS_HIDE_ICONS "Ocultar iconos"
+ IDS_TERMINATE "Finalizar ROS Explorer"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_NETWORK "Red"
+ IDS_CONNECTIONS "Conexiones de Red"
+ IDS_DRIVES "Unidades"
+ IDS_SEARCH_COMPUTER "Buscar PC..."
+ IDS_SETTINGS_MENU "Menús de Configuración"
+ IDS_CONTROL_PANEL "Panel de Control"
+ IDS_PRINTERS "Impresoras"
+ IDS_BROWSE "Explorar Archivos"
+ IDS_SEARCH_PRG "Buscar Programas..."
+ IDS_ALL_USERS "Todos los Usuarios\\"
+ IDS_SEARCH "Buscar"
+ IDS_ABOUT_EXPLORER "&Acerca de Explorer..."
+ IDS_LAUNCH_MANY_PROGRAMS
+ "Ha seleccionado más de un programa.\n¿Está seguro de que desea ejecutarlos todos?"
+ IDS_DESKTOPBAR_SETTINGS "Configuracion del Escritorio"
+ IDS_DESKTOP "Escritorio"
+ IDS_TASKBAR "Barra de Tareas"
+END
+
+#endif // Spanish (Castilian) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "resource.h"
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// German (Germany) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""resource.h""\r\n"
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // German (Germany) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// French (France) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA)
+#ifdef _WIN32
+LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_MDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Fichier"
+ BEGIN
+ MENUITEM "E&xécuter...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Fermer", ID_FILE_EXIT
+ END
+ POPUP "&Affichage"
+ BEGIN
+ MENUITEM "Barre d'&outils", ID_VIEW_TOOL_BAR
+ MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR
+ MENUITEM "&Barre des lecteurs", ID_VIEW_DRIVE_BAR, CHECKED
+ MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR
+ MENUITEM "Barre d'&état", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "A&ctualiser\tF5", ID_REFRESH
+ MENUITEM "&Plein écran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "SDI", ID_VIEW_SDI
+ END
+ POPUP "&Fenêtre"
+ BEGIN
+ MENUITEM "Nouvelle &fenêtre", ID_WINDOW_NEW
+ MENUITEM "Cascade\tShift+F5", ID_WINDOW_CASCADE
+ MENUITEM "Mosaïque &horizontale", ID_WINDOW_TILE_HORZ
+ MENUITEM "Mosaïque &verticale\tCtrl+Shift+S", ID_WINDOW_TILE_VERT
+ MENUITEM "Organisation automatique", ID_WINDOW_AUTOSORT
+ MENUITEM "&Organisation des symboles", ID_WINDOW_ARRANGE
+ END
+ POPUP "&Outils"
+ BEGIN
+ MENUITEM "&Options", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Aide"
+ BEGIN
+ MENUITEM "&FAQ de l'explorateur...", ID_EXPLORER_FAQ
+ MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER
+ MENUITEM "A propos de l'&OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_DESKTOPBAR MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Paramètres...", ID_DESKTOPBAR_SETTINGS
+ MENUITEM "&Gestionnaire de tâches...", ID_TASKMGR
+ MENUITEM SEPARATOR
+ MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_VOLUME MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Ouvrir le contrôle du volume", ID_TRAY_VOLUME
+ MENUITEM "Ajuster les propriétés audio", ID_VOLUME_PROPERTIES
+ END
+END
+
+IDM_NOTIFYAREA MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Afficher les icônes cachés", ID_SHOW_HIDDEN_ICONS
+ MENUITEM "Afficher l'icône &Boutton", ID_SHOW_ICON_BUTTON
+ MENUITEM "&Configurer les Notifications...", ID_CONFIG_NOTIFYAREA
+ MENUITEM "Ajuster Date/&Heure...", ID_CONFIG_TIME
+ MENUITEM SEPARATOR
+ MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_SDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Fichier"
+ BEGIN
+ MENUITEM "&Exécuter...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Fermer", ID_FILE_EXIT
+ END
+ POPUP "&Affichage"
+ BEGIN
+ MENUITEM "&Barre d'outils", ID_VIEW_TOOL_BAR
+ MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED
+ MENUITEM "&Barre d'état", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "A&ctualiser\tF5", ID_REFRESH
+ MENUITEM "&Plein écran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "&MDI", ID_VIEW_MDI
+ END
+ POPUP "&Outils"
+ BEGIN
+ MENUITEM "&Options", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Aide"
+ BEGIN
+ MENUITEM "&FAQ de l'explorateur...", ID_EXPLORER_FAQ
+ MENUITEM "&A propos de l'explorateur...", ID_ABOUT_EXPLORER
+ MENUITEM "A propos de l'&OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Exécuter"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10
+ CONTROL "&Commande:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,
+ 18,60,10
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
+ CONTROL "Comme &Symbole",214,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,3,45,71,12
+ DEFPUSHBUTTON "&OK",1,158,6,47,14
+ PUSHBUTTON "&Annuler",2,158,23,47,14
+ PUSHBUTTON "&Aide",254,158,43,47,14
+END
+
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Rechercher un programme dans le menu démarrer"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "&Filtre:",IDC_STATIC,7,9,18,8
+ EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT |
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER |
+ WS_TABSTOP,7,25,186,33
+ PUSHBUTTON "&Vérifier les entrées",IDC_CHECK_ENTRIES,143,7,50,14
+END
+
+IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Propriétés du bureau"
+FONT 8, "MS Sans Serif"
+BEGIN
+ LTEXT "Please select your prefered icon alignment algorithm:",
+ IDC_STATIC,7,7,166,8
+ CONTROL "gauche/haut descend",IDC_ICON_ALIGN_0,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,25,46,44
+ CONTROL "gauche/haut droite",IDC_ICON_ALIGN_1,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,25,46,44
+ CONTROL "droite/haut left",IDC_ICON_ALIGN_2,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,25,46,44
+ CONTROL "droite/haut descend",IDC_ICON_ALIGN_3,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,25,46,44
+ CONTROL "gauche/fond monte",IDC_ICON_ALIGN_4,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,73,46,44
+ CONTROL "gauche/fond right",IDC_ICON_ALIGN_5,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,73,46,44
+ CONTROL "droite/fond gauche",IDC_ICON_ALIGN_6,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,73,46,44
+ CONTROL "rdroite/fond. descend",IDC_ICON_ALIGN_7,"Button",
+ BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,73,46,44
+ CONTROL "bord descend",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,121,46,44
+ CONTROL "bord H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,121,46,44
+ CONTROL "faire le tour",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,121,46,44
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
+ WS_TABSTOP,159,121,46,44
+ CONTROL "Afficher le numéro de la &version",ID_DESKTOP_VERSION,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10
+END
+
+IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Propriétés de la barre de tâches"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CONTROL "afficher l'&heure",ID_SHOW_CLOCK,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,152,52,10
+ CONTROL "&masquer les icônes inactives",ID_HIDE_INACTIVE_ICONS,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,174,111,10
+ PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14
+END
+
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Propriétés du menu démarrer"
+FONT 8, "MS Sans Serif"
+BEGIN
+END
+
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Configurer Icônes de Notification"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES |
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31
+ LTEXT "&Texte conseil:",IDC_LABEL1,7,44,40,8
+ EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL
+ LTEXT "Titre de la &fenêtre:",IDC_LABEL2,7,63,44,8
+ EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL
+ LTEXT "&Repertoire du module:",IDC_LABEL3,7,81,43,8
+ EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL
+ GROUPBOX "&Mode d'affichage",IDC_LABEL4,7,96,157,28
+ CONTROL "&afficher",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON |
+ WS_TABSTOP,15,108,33,10
+ CONTROL "&cacher",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66,
+ 108,29,10
+ CONTROL "&cacher automatiquement",IDC_NOTIFY_AUTOHIDE,"Button",
+ BS_AUTORADIOBUTTON,112,108,43,10
+ ICON "",IDC_PICTURE,173,101,21,20
+ LTEXT "&Dernier changement:",IDC_LABEL6,7,132,43,8
+ EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL |
+ ES_READONLY
+ CONTROL "afficher les cac&hés",ID_SHOW_HIDDEN_ICONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10
+ DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP
+ PUSHBUTTON "&Annuler",IDCANCEL,151,153,50,14
+END
+
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Veuillez choisir un mode de fenêtres pour explorateur"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "Veuillez sélectionner l'interface que vous préférez pour l'explorateur:",
+ IDC_STATIC,7,7,160,8
+ CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button",
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10
+ CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button",
+ BS_AUTORADIOBUTTON,7,62,118,10
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13
+ CONTROL "Ouvrir les sous-dossiers dans des fenêtres s&éparrées",
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,90,135,10
+ LTEXT "Ce paramètre sera utilisé par défaut.",IDC_STATIC,7,111,
+ 174,22
+ DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP
+ PUSHBUTTON "&Annuler",IDCANCEL,106,136,50,14
+END
+
+IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "A propos de ReactOS Explorer"
+FONT 10, "MS Sans Serif"
+BEGIN
+ LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11
+ LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8
+ LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8
+ LTEXT "",IDC_WIN_VERSION,91,58,98,22
+ LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129,
+ 8
+ CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,
+ 154,90,38,12
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TITLE "Reactos Explorer"
+ IDS_START "Démarrer"
+ IDS_LOGOFF "Se déconnecter..."
+ IDS_SHUTDOWN "Arrêter..."
+ IDS_LAUNCH "Exécuter..."
+ IDS_START_HELP "Aide"
+ IDS_SEARCH_FILES "Rechercher..."
+ IDS_DOCUMENTS "Documents"
+ IDS_FAVORITES "Favoris"
+ IDS_PROGRAMS "Programmes"
+ IDS_SETTINGS "Paramètres"
+ IDS_EXPLORE "Explorer"
+ IDS_EMPTY "(Vide)"
+ IDS_RECENT "Documents récents"
+ IDS_ADMIN "Administration"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_STARTMENU "Menu démarrer"
+ IDS_MINIMIZE_ALL "mimimiser toutes les fenêtres"
+ IDS_DESKTOP_NUM "Bureau %d"
+ IDS_VOLUME "Volume"
+ IDS_ITEMS_CUR "abjets actuels"
+ IDS_ITEMS_CONFIGURED "configuration"
+ IDS_ITEMS_VISIBLE "visible"
+ IDS_ITEMS_HIDDEN "caché"
+ IDS_NOTIFY_SHOW "afficher"
+ IDS_NOTIFY_HIDE "cacher"
+ IDS_NOTIFY_AUTOHIDE "cacher automatiquement"
+ IDS_SHOW_HIDDEN_ICONS "Afficher les icones cachés"
+ IDS_HIDE_ICONS "Cacher les icones"
+ IDS_TERMINATE "Fermer ROS Explorer"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_NETWORK "Réseaux"
+ IDS_CONNECTIONS "Connections Réseaux"
+ IDS_DRIVES "Drives"
+ IDS_SEARCH_COMPUTER "Rechercher un ordinateur..."
+ IDS_SETTINGS_MENU "Paramètres du menu"
+ IDS_CONTROL_PANEL "Panneau de configuration"
+ IDS_PRINTERS "Imprimantes"
+ IDS_BROWSE "Parcourir"
+ IDS_SEARCH_PRG "Rechercher un programme..."
+ IDS_ALL_USERS "Tous les utilisateurs\\"
+ IDS_SEARCH "Rechercher"
+ IDS_ABOUT_EXPLORER "&A propos de l'explorateur..."
+ IDS_LAUNCH_MANY_PROGRAMS
+ "Vous avez selectionné plus d'un programme.\nEtes vous sur de vouloir tous les lancer?"
+ IDS_DESKTOPBAR_SETTINGS "Paramètres du bureau"
+ IDS_DESKTOP "Bureau"
+ IDS_TASKBAR "Barre de tâches"
+END
+
+#endif // French (France) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+//Microsoft Developer Studio generated resource script.\r
+//\r
+#include "resource.h"\r
+\r
+#define APSTUDIO_READONLY_SYMBOLS\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 2 resource.\r
+//\r
+#include <windows.h>\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#undef APSTUDIO_READONLY_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Hungarian (unknown sub-lang: 0x0) resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_HUN)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_HUNGARIAN, 0x0\r
+#pragma code_page(1250)\r
+#endif //_WIN32\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Menu\r
+//\r
+\r
+IDM_MDIFRAME MENU DISCARDABLE \r
+BEGIN\r
+ POPUP "&File"\r
+ BEGIN\r
+ MENUITEM "&Futtatás...", ID_EXECUTE\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Kilépés", ID_FILE_EXIT\r
+ END\r
+ POPUP "&Nézet"\r
+ BEGIN\r
+ MENUITEM "&Eszköztár", ID_VIEW_TOOL_BAR\r
+ MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR\r
+ MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED\r
+ MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR\r
+ MENUITEM "&Állapot sor", ID_VIEW_STATUSBAR\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Frissít\tF5", ID_REFRESH\r
+ MENUITEM "T&eljes képernyõ\tCtrl+Shift+S", ID_VIEW_FULLSCREEN\r
+ MENUITEM "SDI", ID_VIEW_SDI\r
+ END\r
+ POPUP "&Ablak"\r
+ BEGIN\r
+ MENUITEM "Új &Ablak", ID_WINDOW_NEW\r
+ MENUITEM "Lépcsõzetes\tShift+F5", ID_WINDOW_CASCADE\r
+ MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ\r
+ MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT\r
+ MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT\r
+ MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE\r
+ END\r
+ POPUP "&Eszközök"\r
+ BEGIN\r
+ MENUITEM "&Beállítások", ID_TOOLS_OPTIONS\r
+ END\r
+ POPUP "&Súgóó"\r
+ BEGIN\r
+ MENUITEM "Explorer &GYIK...", ID_EXPLORER_FAQ\r
+ MENUITEM "Explorer &névjegye...", ID_ABOUT_EXPLORER\r
+ MENUITEM "Az &OS névjegye...", ID_ABOUT_WINDOWS\r
+ END\r
+END\r
+\r
+IDM_DESKTOPBAR MENU DISCARDABLE \r
+BEGIN\r
+ POPUP ""\r
+ BEGIN\r
+ MENUITEM "&Beállítások...", ID_DESKTOPBAR_SETTINGS\r
+ MENUITEM "&Feladatkezelõ...", ID_TASKMGR\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Explorer névjegye...", ID_ABOUT_EXPLORER\r
+ END\r
+END\r
+\r
+IDM_VOLUME MENU DISCARDABLE \r
+BEGIN\r
+ POPUP ""\r
+ BEGIN\r
+ MENUITEM "Hangerõ beállítások", ID_TRAY_VOLUME\r
+ MENUITEM "Hangrendszer tulajdonságai", ID_VOLUME_PROPERTIES\r
+ END\r
+END\r
+\r
+IDM_NOTIFYAREA MENU DISCARDABLE \r
+BEGIN\r
+ POPUP ""\r
+ BEGIN\r
+ MENUITEM "&Rejtett ikonok megjelenítése", ID_SHOW_HIDDEN_ICONS\r
+ MENUITEM "Show Icon &Button", ID_SHOW_ICON_BUTTON\r
+ MENUITEM "&Configure Notifications...", ID_CONFIG_NOTIFYAREA\r
+ MENUITEM "Dátum és idõ beállításai...", ID_CONFIG_TIME\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Explorer névjegye...", ID_ABOUT_EXPLORER\r
+ END\r
+END\r
+\r
+IDM_SDIFRAME MENU DISCARDABLE \r
+BEGIN\r
+ POPUP "&File"\r
+ BEGIN\r
+ MENUITEM "&Futtatás...", ID_EXECUTE\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Bezárás", ID_FILE_EXIT\r
+ END\r
+ POPUP "&Nézet"\r
+ BEGIN\r
+ MENUITEM "&Eszköztár", ID_VIEW_TOOL_BAR\r
+ MENUITEM "S&ide Bar", ID_VIEW_SIDE_BAR, GRAYED\r
+ MENUITEM "&Állapot sor", ID_VIEW_STATUSBAR\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Frissítés\tF5", ID_REFRESH\r
+ MENUITEM "T&eljes képernyõ\tCtrl+Shift+S", ID_VIEW_FULLSCREEN\r
+ MENUITEM "&MDI", ID_VIEW_MDI\r
+ END\r
+ POPUP "&Eszközök"\r
+ BEGIN\r
+ MENUITEM "&Beállítások", ID_TOOLS_OPTIONS\r
+ END\r
+ POPUP "&Súgóó"\r
+ BEGIN\r
+ MENUITEM "Explorer &GYIK...", ID_EXPLORER_FAQ\r
+ MENUITEM "&Az Explorer névjegye...", ID_ABOUT_EXPLORER\r
+ MENUITEM "Az &OS névjegye...", ID_ABOUT_WINDOWS\r
+ END\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Dialog\r
+//\r
+\r
+IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "Futtatás"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10\r
+ CONTROL "&Parancs:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,\r
+ 18,60,10\r
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL\r
+ CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,\r
+ 45,71,12\r
+ DEFPUSHBUTTON "&OK",1,158,6,47,14\r
+ PUSHBUTTON "&Mégse",2,158,23,47,14\r
+ PUSHBUTTON "&Súgó",254,158,43,47,14\r
+END\r
+\r
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65\r
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | \r
+ WS_SYSMENU | WS_THICKFRAME\r
+EXSTYLE WS_EX_APPWINDOW\r
+CAPTION "Search Program in Startmenu"\r
+FONT 8, "MS Sans Serif", 0, 0, 0x1\r
+BEGIN\r
+ LTEXT "&Filter:",IDC_STATIC,7,9,18,8\r
+ EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL\r
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | \r
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | \r
+ WS_TABSTOP,7,25,186,33\r
+ PUSHBUTTON "&Check Entries",IDC_CHECK_ENTRIES,143,7,50,14\r
+END\r
+\r
+IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194\r
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Asztal beállításai"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+ LTEXT "Please select your prefered icon alignment algorithm:",\r
+ IDC_STATIC,7,7,166,8\r
+ CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,7,25,46,44\r
+ CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,57,25,46,44\r
+ CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,110,25,46,44\r
+ CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,159,25,46,44\r
+ CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,7,73,46,44\r
+ CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,57,73,46,44\r
+ CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,110,73,46,44\r
+ CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,159,73,46,44\r
+ CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,7,121,46,44\r
+ CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,57,121,46,44\r
+ CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,110,121,46,44\r
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | \r
+ WS_TABSTOP,159,121,46,44\r
+ CONTROL "Display &Version Number",ID_DESKTOP_VERSION,"Button",\r
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10\r
+END\r
+\r
+IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194\r
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Taskbar Properties"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+ CONTROL "show &clock",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | \r
+ WS_TABSTOP,7,152,52,10\r
+ CONTROL "&hide inactive notification icons",\r
+ ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | \r
+ WS_TABSTOP,7,174,111,10\r
+ PUSHBUTTON "&Notifications...",ID_CONFIG_NOTIFYAREA,153,173,50,14\r
+END\r
+\r
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194\r
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "Startmenu Properties"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+END\r
+\r
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174\r
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | \r
+ WS_SYSMENU | WS_THICKFRAME\r
+EXSTYLE WS_EX_APPWINDOW\r
+CAPTION "Configure Notification Icons"\r
+FONT 8, "MS Sans Serif", 0, 0, 0x1\r
+BEGIN\r
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | \r
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31\r
+ LTEXT "&Tooltip Text:",IDC_LABEL1,7,44,40,8\r
+ EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL\r
+ LTEXT "W&indow Title:",IDC_LABEL2,7,63,44,8\r
+ EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL\r
+ LTEXT "&Module Path:",IDC_LABEL3,7,81,43,8\r
+ EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL\r
+ GROUPBOX "&Display Mode",IDC_LABEL4,7,96,157,28\r
+ CONTROL "&show",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | \r
+ WS_TABSTOP,15,108,33,10\r
+ CONTROL "&hide",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66,\r
+ 108,29,10\r
+ CONTROL "a&utohide",IDC_NOTIFY_AUTOHIDE,"Button",\r
+ BS_AUTORADIOBUTTON,112,108,43,10\r
+ ICON "",IDC_PICTURE,173,101,21,20\r
+ LTEXT "&Last Change:",IDC_LABEL6,7,132,43,8\r
+ EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | \r
+ ES_READONLY\r
+ CONTROL "sho&w hidden",ID_SHOW_HIDDEN_ICONS,"Button",\r
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10\r
+ DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP\r
+ PUSHBUTTON "&Mégse",IDCANCEL,151,153,50,14\r
+END\r
+\r
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157\r
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU\r
+EXSTYLE WS_EX_APPWINDOW\r
+CAPTION "Choose Explorer window mode"\r
+FONT 8, "MS Sans Serif", 0, 0, 0x1\r
+BEGIN\r
+ LTEXT "Please select your prefered explorer user interface:",\r
+ IDC_STATIC,7,7,160,8\r
+ CONTROL "&MDI (Multiple Document Interface)",IDC_MDI,"Button",\r
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10\r
+ CONTROL "&SDI (Single Document Interface)",IDC_SDI,"Button",\r
+ BS_AUTORADIOBUTTON,7,62,118,10\r
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13\r
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13\r
+ CONTROL "Open Subfolders in s&eparate windows",\r
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | \r
+ WS_TABSTOP,7,90,135,10\r
+ LTEXT "This setting will be used as default for all explorer windows in the future.",\r
+ IDC_STATIC,7,111,174,22\r
+ DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP\r
+ PUSHBUTTON "&Mégse",IDCANCEL,106,136,50,14\r
+END\r
+\r
+IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "About ReactOS Explorer"\r
+FONT 10, "MS Sans Serif"\r
+BEGIN\r
+ LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11\r
+ LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8\r
+ LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8\r
+ LTEXT "",IDC_WIN_VERSION,91,58,98,22\r
+ LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129,\r
+ 8\r
+ CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,\r
+ 154,90,38,12\r
+END\r
+\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// TEXTINCLUDE\r
+//\r
+\r
+1 TEXTINCLUDE MOVEABLE PURE \r
+BEGIN\r
+ "resource.h\0"\r
+END\r
+\r
+2 TEXTINCLUDE MOVEABLE PURE \r
+BEGIN\r
+ "#include <windows.h>\r\n"\r
+ "\0"\r
+END\r
+\r
+3 TEXTINCLUDE MOVEABLE PURE \r
+BEGIN\r
+ "\r\n"\r
+ "\0"\r
+END\r
+\r
+#endif // APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// String Table\r
+//\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+ IDS_TITLE "Reactos Explorer"\r
+ IDS_START "Start"\r
+ IDS_LOGOFF "Kijelentkezés..."\r
+ IDS_SHUTDOWN "Kikapcsolás..."\r
+ IDS_LAUNCH "Futtatás..."\r
+ IDS_START_HELP "Súgó"\r
+ IDS_SEARCH_FILES "Keresés..."\r
+ IDS_DOCUMENTS "Dokumentumok"\r
+ IDS_FAVORITES "Kedvencek"\r
+ IDS_PROGRAMS "Programok"\r
+ IDS_SETTINGS "Beállítások"\r
+ IDS_EXPLORE "Böngészés"\r
+ IDS_EMPTY "(Üres)"\r
+ IDS_RECENT "Recent Documents"\r
+ IDS_ADMIN "Felügyelet"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+ IDS_STARTMENU "Startmenu"\r
+ IDS_MINIMIZE_ALL "mimimize all windows"\r
+ IDS_DESKTOP_NUM "%d. asztal"\r
+ IDS_VOLUME "Hangerõ"\r
+ IDS_ITEMS_CUR "current items"\r
+ IDS_ITEMS_CONFIGURED "configuration"\r
+ IDS_ITEMS_VISIBLE "visible"\r
+ IDS_ITEMS_HIDDEN "Rejtett"\r
+ IDS_NOTIFY_SHOW "show"\r
+ IDS_NOTIFY_HIDE "hide"\r
+ IDS_NOTIFY_AUTOHIDE "autohide"\r
+ IDS_SHOW_HIDDEN_ICONS "Show hidden icons"\r
+ IDS_HIDE_ICONS "Hide icons"\r
+ IDS_TERMINATE "Kilépés a ROS Explorerbõl"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+ IDS_NETWORK "Hálózat"\r
+ IDS_CONNECTIONS "Hálózati kapcsolatok"\r
+ IDS_DRIVES "Meghajtók"\r
+ IDS_SEARCH_COMPUTER "Számítógép keresése..."\r
+ IDS_SETTINGS_MENU "Settings Menu"\r
+ IDS_CONTROL_PANEL "Vezérlõpult"\r
+ IDS_PRINTERS "Nyomtatók"\r
+ IDS_BROWSE "Állományok böngészése"\r
+ IDS_SEARCH_PRG "Search Program..."\r
+ IDS_ALL_USERS "All Users\\"\r
+ IDS_SEARCH "Keresés"\r
+ IDS_ABOUT_EXPLORER "Az &Explorer névjegye..."\r
+ IDS_LAUNCH_MANY_PROGRAMS \r
+ "Több programot választottál ki.\nBiztosan szeretnéd mindegyiket futtatni?"\r
+ IDS_DESKTOPBAR_SETTINGS "Asztal beállításai"\r
+ IDS_DESKTOP "Asztal"\r
+ IDS_TASKBAR "Taskbar"\r
+END\r
+\r
+#endif // Hungarian (unknown sub-lang: 0x0) resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+\r
+#ifndef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 3 resource.\r
+//\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#endif // not APSTUDIO_INVOKED\r
+\r
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Japanese resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+#ifdef _WIN32
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+#pragma code_page(932)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_MDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "\83t\83@\83C\83\8b(&F)"
+ BEGIN
+ MENUITEM "\8eÀ\8ds(&E)...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "\8fI\97¹(&X)", ID_FILE_EXIT
+ END
+ POPUP "\95\\\8e¦(&V)"
+ BEGIN
+ MENUITEM "\83c\81[\83\8b \83o\81[(&T)", ID_VIEW_TOOL_BAR
+ MENUITEM "\83G\83L\83X\83g\83\89 \83o\81[(&E)", ID_VIEW_EXTRA_BAR
+ MENUITEM "\83h\83\89\83C\83u\83o\81[(&D)", ID_VIEW_DRIVE_BAR, CHECKED
+ MENUITEM "\83T\83C\83h \83o\81[(&I)", ID_VIEW_SIDE_BAR
+ MENUITEM "\83X\83e\81[\83^\83X \83o\81[(&S)", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "\8dÅ\90V\82Ì\8fî\95ñ\82É\8dX\90V(&R)\tF5", ID_REFRESH
+ MENUITEM "\91S\89æ\96Ê\95\\\8e¦(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "SDI", ID_VIEW_SDI
+ END
+ POPUP "\83E\83B\83\93\83h\83E(&W)"
+ BEGIN
+ MENUITEM "\90V\82µ\82¢\83E\83B\83\93\83h\83E(&W)", ID_WINDOW_NEW
+ MENUITEM "\8fd\82Ë\82Ä\95\\\8e¦\tShift+F5", ID_WINDOW_CASCADE
+ MENUITEM "\90\85\95½\82É\95À\82×\82Ä\95\\\8e¦(&H)", ID_WINDOW_TILE_HORZ
+ MENUITEM "\90\82\92¼\82É\95À\82×\82Ä\95\\\8e¦(&V)\tShift+F4", ID_WINDOW_TILE_VERT
+ MENUITEM "\8e©\93®\90®\97ñ", ID_WINDOW_AUTOSORT
+ MENUITEM "\8dÅ\8f¬\89»\82³\82ê\82½\8eq\83E\83B\83\93\83h\83E\82ð\90®\97ñ(&S)", ID_WINDOW_ARRANGE
+ END
+ POPUP "\83c\81[\83\8b(&T)"
+ BEGIN
+ MENUITEM "\83I\83v\83V\83\87\83\93(&O)", ID_TOOLS_OPTIONS
+ END
+ POPUP "\83w\83\8b\83v(&H)"
+ BEGIN
+ MENUITEM "Explorer FAQ (&F)...", ID_EXPLORER_FAQ
+ MENUITEM "Explorer \82É\82Â\82¢\82Ä(&A)...", ID_ABOUT_EXPLORER
+ MENUITEM "OS \82É\82Â\82¢\82Ä(&O)...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_DESKTOPBAR MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "\90Ý\92è(&S)...", ID_DESKTOPBAR_SETTINGS
+ MENUITEM "\83^\83X\83N \83}\83l\81[\83W\83\83(&T)...", ID_TASKMGR
+ MENUITEM SEPARATOR
+ MENUITEM "Explorer \82É\82Â\82¢\82Ä(&A)...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_VOLUME MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "\83{\83\8a\83\85\81[\83\80 \83R\83\93\83g\83\8d\81[\83\8b\82ð\8aJ\82", ID_TRAY_VOLUME
+ MENUITEM "\83I\81[\83f\83B\83I \83v\83\8d\83p\83e\83B\82Ì\92²\90®", ID_VOLUME_PROPERTIES
+ END
+END
+
+IDM_NOTIFYAREA MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "\89B\82³\82ê\82½\83A\83C\83R\83\93\82ð\95\\\8e¦\82·\82é(&S)", ID_SHOW_HIDDEN_ICONS
+ MENUITEM "\83A\83C\83R\83\93 \83{\83^\83\93\82ð\95\\\8e¦\82·\82é(&B)", ID_SHOW_ICON_BUTTON
+ MENUITEM "\92Ê\92m\82Ì\83J\83X\83^\83}\83C\83Y(&C)...", ID_CONFIG_NOTIFYAREA
+ MENUITEM "\93ú\95t\82Æ\8e\9e\8d\8f\82Ì\92²\90®(&T)...", ID_CONFIG_TIME
+ MENUITEM SEPARATOR
+ MENUITEM "Explorer \82É\82Â\82¢\82Ä(&A)...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_SDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "\83t\83@\83C\83\8b(&F)"
+ BEGIN
+ MENUITEM "\8eÀ\8ds(&E)...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "\95Â\82¶\82é(&C)", ID_FILE_EXIT
+ END
+ POPUP "\95\\\8e¦(&V)"
+ BEGIN
+ MENUITEM "\83c\81[\83\8b \83o\81[(&T)", ID_VIEW_TOOL_BAR
+ MENUITEM "\83T\83C\83h \83o\81[(&I)", ID_VIEW_SIDE_BAR, GRAYED
+ MENUITEM "\83X\83e\81[\83^\83X \83o\81[(&S)", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "\8dÅ\90V\82Ì\8fî\95ñ\82É\8dX\90V(&R)\tF5", ID_REFRESH
+ MENUITEM "\91S\89æ\96Ê\95\\\8e¦(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "MDI (&M)", ID_VIEW_MDI
+ END
+ POPUP "\83c\81[\83\8b(&T)"
+ BEGIN
+ MENUITEM "\83I\83v\83V\83\87\83\93(&O)", ID_TOOLS_OPTIONS
+ END
+ POPUP "\83w\83\8b\83v(&H)"
+ BEGIN
+ MENUITEM "Explorer FAQ (&F)...", ID_EXPLORER_FAQ
+ MENUITEM "Explorer \82É\82Â\82¢\82Ä(&A)...", ID_ABOUT_EXPLORER
+ MENUITEM "OS \82É\82Â\82¢\82Ä(&O)...", ID_ABOUT_WINDOWS
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "\8eÀ\8ds"
+FONT 9, "MS UI Gothic"
+BEGIN
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10
+ CONTROL "\83R\83}\83\93\83h(&C):",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,
+ 18,60,10
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
+ CONTROL "\8dÅ\8f¬\89»\82µ\82½\8fó\91Ô\82Å\8eÀ\8ds(&S)",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,
+ 45,71,12
+ DEFPUSHBUTTON "OK (&O)",1,158,6,47,14
+ PUSHBUTTON "\83L\83\83\83\93\83Z\83\8b(&C)",2,158,23,47,14
+ PUSHBUTTON "\83w\83\8b\83v(&H)",254,158,43,47,14
+END
+
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "\83X\83^\81[\83g\83\81\83j\83\85\81[\82©\82ç\83v\83\8d\83O\83\89\83\80\82ð\8c\9f\8dõ"
+FONT 9, "MS UI Gothic", 0, 0, 0x1
+BEGIN
+ LTEXT "\83t\83B\83\8b\83^(&F):",IDC_STATIC,7,9,18,8
+ EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT |
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER |
+ WS_TABSTOP,7,25,186,33
+ PUSHBUTTON "\93o\98^\82ð\83`\83F\83b\83N\82·\82é(&C)",IDC_CHECK_ENTRIES,143,7,50,14
+END
+
+IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "\83f\83X\83N\83g\83b\83v\82Ì\83v\83\8d\83p\83e\83B"
+FONT 9, "MS UI Gothic"
+BEGIN
+ LTEXT "\8eg\97p\82µ\82½\82¢\83A\83C\83R\83\93\82Ì\94z\92u\82ð\91I\91ð\82µ\82Ä\82\82¾\82³\82¢:",
+ IDC_STATIC,7,7,166,8
+ CONTROL "\8d¶\8fã\82©\82ç\89º\82Ö",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,25,46,44
+ CONTROL "\8d¶\8fã\82©\82ç\89E\82Ö",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,25,46,44
+ CONTROL "\89E\8fã\82©\82ç\8d¶\82Ö",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,25,46,44
+ CONTROL "\89E\8fã\82©\82ç\89º\82Ö",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,25,46,44
+ CONTROL "\8d¶\89º\82©\82ç\8fã\82Ö",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,73,46,44
+ CONTROL "\8d¶\89º\82©\82ç\89E\82Ö",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,73,46,44
+ CONTROL "\89E\89º\82©\82ç\8d¶\82Ö",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,73,46,44
+ CONTROL "\89E\89º\82©\82ç\89º\82Ö",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,73,46,44
+ CONTROL "\8d¶\89E\82ð\89º\82Ö",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,121,46,44
+ CONTROL "\8fã\82Æ\8d¶\89E\82Ì\92[",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,121,46,44
+ CONTROL "\97Ö\82É\82È\82é\82æ\82¤\82É",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,121,46,44
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
+ WS_TABSTOP,159,121,46,44
+ CONTROL "\83f\83X\83N\83g\83b\83v\82É\83o\81[\83W\83\87\83\93\82ð\95\\\8e¦\82·\82é(&V)",ID_DESKTOP_VERSION,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10
+END
+
+IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "\83^\83X\83N \83o\81[\82Ì\83v\83\8d\83p\83e\83B"
+FONT 9, "MS UI Gothic"
+BEGIN
+ CONTROL "\8e\9e\8cv\82ð\95\\\8e¦\82·\82é(&C)",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,152,52,10
+ CONTROL "\83A\83N\83e\83B\83u\82Å\82È\82¢\92Ê\92m\83A\83C\83R\83\93\82ð\89B\82·(&H)",
+ ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,174,111,10
+ PUSHBUTTON "\92Ê\92m\83A\83C\83R\83\93(&N)...",ID_CONFIG_NOTIFYAREA,153,173,50,14
+END
+
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "\83X\83^\81[\83g\83\81\83j\83\85\81[\82Ì\83v\83\8d\83p\83e\83B"
+FONT 9, "MS UI Gothic"
+BEGIN
+END
+
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "\92Ê\92m\83A\83C\83R\83\93\82Ì\90Ý\92è"
+FONT 9, "MS UI Gothic", 0, 0, 0x1
+BEGIN
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES |
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31
+ LTEXT "\83c\81[\83\8b \83`\83b\83v\82Ì\93à\97e(&T):",IDC_LABEL1,7,44,40,8
+ EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL
+ LTEXT "\83E\83B\83\93\83h\83E\82Ì\83^\83C\83g\83\8b(&I):",IDC_LABEL2,7,63,44,8
+ EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL
+ LTEXT "\83\82\83W\83\85\81[\83\8b\82Ì\8fê\8f\8a(&M):",IDC_LABEL3,7,81,43,8
+ EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL
+ GROUPBOX "\95\\\8e¦\83\82\81[\83h(&D)",IDC_LABEL4,7,96,157,28
+ CONTROL "\95\\\8e¦\82·\82é(&S)",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON |
+ WS_TABSTOP,15,108,33,10
+ CONTROL "\89B\82·(&H)",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66,
+ 108,29,10
+ CONTROL "\8e©\93®\93I\82É\89B\82·(&U)",IDC_NOTIFY_AUTOHIDE,"Button",
+ BS_AUTORADIOBUTTON,112,108,43,10
+ ICON "",IDC_PICTURE,173,101,21,20
+ LTEXT "\8dÅ\8fI\95Ï\8dX(&L):",IDC_LABEL6,7,132,43,8
+ EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL |
+ ES_READONLY
+ CONTROL "\89B\82ê\82½\83A\83C\83R\83\93\82à\95\\\8e¦(&W)",ID_SHOW_HIDDEN_ICONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10
+ DEFPUSHBUTTON "OK (&O)",IDOK,91,153,50,14,WS_GROUP
+ PUSHBUTTON "\83L\83\83\83\93\83Z\83\8b(&C)",IDCANCEL,151,153,50,14
+END
+
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 138
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "\83G\83N\83X\83v\83\8d\81[\83\89\82Ì\83E\83B\83\93\83h\83E \83\82\81[\83h\82Ì\91I\91ð"
+FONT 9, "MS UI Gothic", 0, 0, 0x1
+BEGIN
+ LTEXT "\8eg\97p\82µ\82½\82¢\83\86\81[\83U\81[ \83C\83\93\83^\81[\83t\83F\81[\83X\82ð\91I\91ð\82µ\82Ä\82\82¾\82³\82¢:",
+ IDC_STATIC,7,7,160,8
+ CONTROL "MDI (Multiple Document Interface)(&M)",IDC_MDI,"Button",
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10
+ CONTROL "SDI (Single Document Interface)(&S)",IDC_SDI,"Button",
+ BS_AUTORADIOBUTTON,7,62,118,10
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13
+ CONTROL "\83T\83u\83t\83H\83\8b\83_\82ð\90V\82µ\82¢\83E\83B\83\93\83h\83E\82Å\8aJ\82(&E)",
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,90,135,10
+ LTEXT "\82±\82ê\82æ\82è\82±\82Ì\90Ý\92è\82ª\81A\82·\82×\82Ä\82Ì Explorer \83E\83B\83\93\83h\83E\82Ì\83f\83t\83H\83\8b\83g\82É\82È\82è\82Ü\82·\81B",
+ IDC_STATIC,7,111,174,22
+ DEFPUSHBUTTON "OK (&O)",IDOK,29,136,50,14,WS_GROUP
+ PUSHBUTTON "\83L\83\83\83\93\83Z\83\8b(&C)",IDCANCEL,106,136,50,14
+END
+
+IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ReactOS Explorer \82É\82Â\82¢\82Ä"
+FONT 10, "MS UI Gothic"
+BEGIN
+ LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11
+ LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8
+ LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8
+ LTEXT "",IDC_WIN_VERSION,91,58,98,22
+ LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129,
+ 8
+ CONTROL "OK (&O)",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,
+ 154,90,38,12
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "#include <windows.h>\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TITLE "ReactOS Explorer"
+ IDS_START "½À°Ä"
+ IDS_LOGOFF "\83\8d\83O\83I\83t..."
+ IDS_SHUTDOWN "\83V\83\83\83b\83g\83_\83E\83\93..."
+ IDS_LAUNCH "\83t\83@\83C\83\8b\96¼\82ð\8ew\92è\82µ\82Ä\8eÀ\8ds..."
+ IDS_START_HELP "\83w\83\8b\83v"
+ IDS_SEARCH_FILES "\83t\83@\83C\83\8b\82â\83t\83H\83\8b\83_..."
+ IDS_DOCUMENTS "\83}\83C\83h\83L\83\85\83\81\83\93\83g"
+ IDS_FAVORITES "\82¨\8bC\82É\93ü\82è"
+ IDS_PROGRAMS "\83v\83\8d\83O\83\89\83\80"
+ IDS_SETTINGS "\90Ý\92è"
+ IDS_EXPLORE "\83G\83N\83X\83v\83\8d\81[\83\89"
+ IDS_EMPTY "(\82È\82µ)"
+ IDS_RECENT "\8dÅ\8bß\8eg\82Á\82½\83t\83@\83C\83\8b"
+ IDS_ADMIN "\8aÇ\97\9d\83c\81[\83\8b"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_STARTMENU "\83X\83^\81[\83g\83\81\83j\83\85\81["
+ IDS_MINIMIZE_ALL "\91S\83E\83B\83\93\83h\83E\82ð\8dÅ\8f¬\89»"
+ IDS_DESKTOP_NUM "\83f\83X\83N\83g\83b\83v %d"
+ IDS_VOLUME "\89¹\97Ê"
+ IDS_ITEMS_CUR "\8c»\8dÝ\82Ì\83A\83C\83R\83\93"
+ IDS_ITEMS_CONFIGURED "\90Ý\92è"
+ IDS_ITEMS_VISIBLE "\95\\\8e¦"
+ IDS_ITEMS_HIDDEN "\94ñ\95\\\8e¦"
+ IDS_NOTIFY_SHOW "\95\\\8e¦\82·\82é"
+ IDS_NOTIFY_HIDE "\89B\82·"
+ IDS_NOTIFY_AUTOHIDE "\8e©\93®\93I\82É\89B\82·"
+ IDS_SHOW_HIDDEN_ICONS "\89B\82ê\82Ä\82¢\82é\83A\83C\83R\83\93\82à\95\\\8e¦\82·\82é"
+ IDS_HIDE_ICONS "\83A\83C\83R\83\93\82ð\89B\82·"
+ IDS_TERMINATE "ROS Explorer \82ð\8fI\97¹\82·\82é"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_NETWORK "\83l\83b\83g\83\8f\81[\83N"
+ IDS_CONNECTIONS "\83l\83b\83g\83\8f\81[\83N\90Ú\91±"
+ IDS_DRIVES "\83\8d\81[\83J\83\8b\83f\83B\83X\83N"
+ IDS_SEARCH_COMPUTER "\83R\83\93\83s\83\85\81[\83^\82Ì\8c\9f\8dõ..."
+ IDS_SETTINGS_MENU "\90Ý\92è\83\81\83j\83\85\81["
+ IDS_CONTROL_PANEL "\83R\83\93\83g\83\8d\81[\83\8b \83p\83l\83\8b"
+ IDS_PRINTERS "\83v\83\8a\83\93\83^"
+ IDS_BROWSE "\83t\83@\83C\83\8b\82Ì\83u\83\89\83E\83Y"
+ IDS_SEARCH_PRG "\83v\83\8d\83O\83\89\83\80\82ð\8c\9f\8dõ..."
+ IDS_ALL_USERS "All Users\\"
+ IDS_SEARCH "\8c\9f\8dõ"
+ IDS_ABOUT_EXPLORER "Explorer \82É\82Â\82¢\82Ä(&A)..."
+ IDS_LAUNCH_MANY_PROGRAMS
+ "\93ñ\82Â\88È\8fã\82Ì\83v\83\8d\83O\83\89\83\80\82ª\91I\91ð\82³\82ê\82Ü\82µ\82½\81B\n\82·\82×\82Ä\82Ì\83v\83\8d\83O\83\89\83\80\82ð\8eÀ\8ds\82µ\82Ü\82·\82©?"
+ IDS_DESKTOPBAR_SETTINGS "\83f\83X\83N\83g\83b\83v\82Ì\90Ý\92è"
+ IDS_DESKTOP "\83f\83X\83N\83g\83b\83v"
+ IDS_TASKBAR "\83^\83X\83N\83o\81["
+END
+
+#endif // Japanese resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+//Microsoft Developer Studio generated resource script.\r
+//\r
+#include "resource.h"\r
+\r
+#define APSTUDIO_READONLY_SYMBOLS\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 2 resource.\r
+//\r
+#include <windows.h>\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#undef APSTUDIO_READONLY_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Polish (PL) resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_POLISH, SUBLANG_NEUTRAL\r
+#pragma code_page(1250)\r
+#endif //_WIN32\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Menu\r
+//\r
+\r
+IDM_MDIFRAME MENU DISCARDABLE \r
+BEGIN\r
+ POPUP "&Plik"\r
+ BEGIN\r
+ MENUITEM "Urucho&m...", ID_EXECUTE\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "Za&koñcz", ID_FILE_EXIT\r
+ END\r
+ POPUP "&Widok"\r
+ BEGIN\r
+ MENUITEM "Przyciski &standardowe", ID_VIEW_TOOL_BAR\r
+ MENUITEM "P&rzyciski dodatkowe", ID_VIEW_EXTRA_BAR\r
+ MENUITEM "Pasek &dysków", ID_VIEW_DRIVE_BAR, CHECKED\r
+ MENUITEM "Pasek &boczny", ID_VIEW_SIDE_BAR\r
+ MENUITEM "Pasek sta&nu", ID_VIEW_STATUSBAR\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Od\9cwie¿\tF5", ID_REFRESH\r
+ MENUITEM "P&e³ny ekran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN\r
+ MENUITEM "SDI", ID_VIEW_SDI\r
+ END\r
+ POPUP "&Okna"\r
+ BEGIN\r
+ MENUITEM "Nowe &okno", ID_WINDOW_NEW\r
+ MENUITEM "&Kaskada\tShift+F5", ID_WINDOW_CASCADE\r
+ MENUITEM "&S¹siaduj¹co poziomo", ID_WINDOW_TILE_HORZ\r
+ MENUITEM "S¹siaduj¹co &pionowo\tShift+F4", ID_WINDOW_TILE_VERT\r
+ MENUITEM "&Autorozmieszczenie", ID_WINDOW_AUTOSORT\r
+ MENUITEM "Rozmie\9cæ wed³ug &nazwy", ID_WINDOW_ARRANGE\r
+ END\r
+ POPUP "&Narzêdzia"\r
+ BEGIN\r
+ MENUITEM "&Opcje", ID_TOOLS_OPTIONS\r
+ END\r
+ POPUP "Pomo&c"\r
+ BEGIN\r
+ MENUITEM "Explorer &FAQ", ID_EXPLORER_FAQ\r
+ MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER\r
+ MENUITEM "ReactOS - I&nformacje", ID_ABOUT_WINDOWS\r
+ END\r
+END\r
+\r
+IDM_DESKTOPBAR MENU DISCARDABLE \r
+BEGIN\r
+ POPUP ""\r
+ BEGIN\r
+ MENUITEM "&W³a\9cciwo\9cci", ID_DESKTOPBAR_SETTINGS\r
+ MENUITEM "Mened¿er &zadañ", ID_TASKMGR\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER\r
+ END\r
+END\r
+\r
+IDM_VOLUME MENU DISCARDABLE \r
+BEGIN\r
+ POPUP ""\r
+ BEGIN\r
+ MENUITEM "&Otwórz regulacje g³o\9cno\9cci", ID_TRAY_VOLUME\r
+ MENUITEM "&Ustaw w³a\9cciwo\9cci audio", ID_VOLUME_PROPERTIES\r
+ END\r
+END\r
+\r
+IDM_NOTIFYAREA MENU DISCARDABLE \r
+BEGIN\r
+ POPUP ""\r
+ BEGIN\r
+ MENUITEM "&Poka¿ ukryte ikony", ID_SHOW_HIDDEN_ICONS\r
+ MENUITEM "&Ukrywaj nieu¿ywane ikony", ID_SHOW_ICON_BUTTON\r
+ MENUITEM "&Konfiguruj powiadomienia", ID_CONFIG_NOTIFYAREA\r
+ MENUITEM "Ustaw &datê/godzinê", ID_CONFIG_TIME\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER\r
+ END\r
+END\r
+\r
+IDM_SDIFRAME MENU DISCARDABLE \r
+BEGIN\r
+ POPUP "&Plik"\r
+ BEGIN\r
+ MENUITEM "Urucho&m...", ID_EXECUTE\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "Za&koñcz", ID_FILE_EXIT\r
+ END\r
+ POPUP "&Widok"\r
+ BEGIN\r
+ MENUITEM "Przyciski &standardowe", ID_VIEW_TOOL_BAR\r
+ MENUITEM "Pasek &boczny", ID_VIEW_SIDE_BAR, GRAYED\r
+ MENUITEM "Pasek sta&nu", ID_VIEW_STATUSBAR\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "&Od\9cwie¿\tF5", ID_REFRESH\r
+ MENUITEM "P&e³ny ekran\tCtrl+Shift+S", ID_VIEW_FULLSCREEN\r
+ MENUITEM "&MDI", ID_VIEW_MDI\r
+ END\r
+ POPUP "&Narzêdzia"\r
+ BEGIN\r
+ MENUITEM "&Opcje", ID_TOOLS_OPTIONS\r
+ END\r
+ POPUP "Pomo&c"\r
+ BEGIN\r
+ MENUITEM "Explorer &FAQ", ID_EXPLORER_FAQ\r
+ MENUITEM "ReactOS Explorer - &Informacje", ID_ABOUT_EXPLORER\r
+ MENUITEM "ReactOS - I&nformacje", ID_ABOUT_WINDOWS\r
+ END\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Dialog\r
+//\r
+\r
+IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "Uruchom"\r
+FONT 8, "MS Shell Dlg"\r
+BEGIN\r
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10\r
+ CONTROL "&Polecenie:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,\r
+ 18,60,10\r
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL\r
+ CONTROL "Jako &symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,\r
+ 45,71,12\r
+ DEFPUSHBUTTON "&OK",1,158,6,47,14\r
+ PUSHBUTTON "&Anuluj",2,158,23,47,14\r
+ PUSHBUTTON "Pomo&c",254,158,43,47,14\r
+END\r
+\r
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65\r
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | \r
+ WS_SYSMENU | WS_THICKFRAME\r
+EXSTYLE WS_EX_APPWINDOW\r
+CAPTION "Szukaj programu w menu start"\r
+FONT 8, "MS Sans Serif", 0, 0, 0x1\r
+BEGIN\r
+ LTEXT "&Filtry:",IDC_STATIC,7,9,18,8\r
+ EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL\r
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT | \r
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | \r
+ WS_TABSTOP,7,25,186,33\r
+ PUSHBUTTON "&Szukaj nazwy",IDC_CHECK_ENTRIES,143,7,50,14\r
+END\r
+\r
+IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194\r
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "W³a\9cciwo\9cci pulpitu"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+ LTEXT "Wybierz sposób uk³adania ikon:",\r
+ IDC_STATIC,7,7,166,8\r
+ CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,7,25,46,44\r
+ CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,57,25,46,44\r
+ CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,110,25,46,44\r
+ CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,159,25,46,44\r
+ CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,7,73,46,44\r
+ CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,57,73,46,44\r
+ CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,110,73,46,44\r
+ CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,159,73,46,44\r
+ CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,7,121,46,44\r
+ CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,57,121,46,44\r
+ CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | \r
+ BS_BOTTOM | WS_TABSTOP,110,121,46,44\r
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | \r
+ WS_TABSTOP,159,121,46,44\r
+ CONTROL "Wy\9cwietlaj &numer wersji",ID_DESKTOP_VERSION,"Button",\r
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10\r
+END\r
+\r
+IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194\r
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "W³a\9cciwo\9cci paska zadañ"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+ CONTROL "Poka¿ &zegar",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX | \r
+ WS_TABSTOP,7,152,52,10\r
+ CONTROL "&Ukrywaj nieaktywne ikony",\r
+ ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX | \r
+ WS_TABSTOP,7,174,111,10\r
+ PUSHBUTTON "&Dostosuj",ID_CONFIG_NOTIFYAREA,153,173,50,14\r
+END\r
+\r
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194\r
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION\r
+CAPTION "W³a\9cciwo\9cci Menu Start"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+END\r
+\r
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174\r
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | \r
+ WS_SYSMENU | WS_THICKFRAME\r
+EXSTYLE WS_EX_APPWINDOW\r
+CAPTION "Konfiguracja ikon powiadomieñ"\r
+FONT 8, "MS Sans Serif", 0, 0, 0x1\r
+BEGIN\r
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES | \r
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31\r
+ LTEXT "&Podpowied\9f:",IDC_LABEL1,7,44,40,8\r
+ EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL\r
+ LTEXT "&Tytu³ okna:",IDC_LABEL2,7,63,44,8\r
+ EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL\r
+ LTEXT "\8ccie¿ka:",IDC_LABEL3,7,81,43,8\r
+ EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL\r
+ GROUPBOX "&Sposób wy\9cwietlania",IDC_LABEL4,7,96,157,28\r
+ CONTROL "&widoczny",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON | \r
+ WS_TABSTOP,15,108,33,10\r
+ CONTROL "&ukryty",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66,\r
+ 108,29,10\r
+ CONTROL "&autoukrywanie",IDC_NOTIFY_AUTOHIDE,"Button",\r
+ BS_AUTORADIOBUTTON,112,108,43,10\r
+ ICON "",IDC_PICTURE,173,101,21,20\r
+ LTEXT "&Zmodyfikowany:",IDC_LABEL6,7,132,43,8\r
+ EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL | \r
+ ES_READONLY\r
+ CONTROL "Po&ka¿ wszystkie",ID_SHOW_HIDDEN_ICONS,"Button",\r
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10\r
+ DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP\r
+ PUSHBUTTON "&Anuluj",IDCANCEL,151,153,50,14\r
+END\r
+\r
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157\r
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU\r
+EXSTYLE WS_EX_APPWINDOW\r
+CAPTION "Tryb wy\9cwietlania okien"\r
+FONT 8, "MS Sans Serif", 0, 0, 0x1\r
+BEGIN\r
+ LTEXT "Wybierz tryb wy\9cwietlania okien:",\r
+ IDC_STATIC,7,7,160,8\r
+ CONTROL "&MDI (Otwieraj w jednym oknie)",IDC_MDI,"Button",\r
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10\r
+ CONTROL "&SDI (Otwieraj we w³asnym oknie)",IDC_SDI,"Button",\r
+ BS_AUTORADIOBUTTON,7,62,118,10\r
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13\r
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13\r
+ CONTROL "&Otwieraj podkatalogi w nowych oknach",\r
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | \r
+ WS_TABSTOP,7,90,135,10\r
+ LTEXT "Te opcje bêd¹ stosowane w przysz³o\9cci do wszystkich okien.",\r
+ IDC_STATIC,7,111,174,22\r
+ DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP\r
+ PUSHBUTTON "&Anuluj",IDCANCEL,106,136,50,14\r
+END\r
+\r
+IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106\r
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "ReactOS Explorer - &Informacje"\r
+FONT 10, "MS Sans Serif"\r
+BEGIN\r
+ LTEXT "ReactOS Explorer",IDC_ROS_EXPLORER,91,13,104,11\r
+ LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8\r
+ LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8\r
+ LTEXT "",IDC_WIN_VERSION,91,58,98,22\r
+ LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129,\r
+ 8\r
+ CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,\r
+ 154,90,38,12\r
+END\r
+\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// TEXTINCLUDE\r
+//\r
+\r
+1 TEXTINCLUDE MOVEABLE PURE \r
+BEGIN\r
+ "resource.h\0"\r
+END\r
+\r
+2 TEXTINCLUDE MOVEABLE PURE \r
+BEGIN\r
+ "#include <windows.h>\r\n"\r
+ "\0"\r
+END\r
+\r
+3 TEXTINCLUDE MOVEABLE PURE \r
+BEGIN\r
+ "\r\n"\r
+ "\0"\r
+END\r
+\r
+#endif // APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// String Table\r
+//\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+ IDS_TITLE "Reactos Explorer"\r
+ IDS_START "Start"\r
+ IDS_LOGOFF "Wyloguj..."\r
+ IDS_SHUTDOWN "Zamknij system..."\r
+ IDS_LAUNCH "Uruchom..."\r
+ IDS_START_HELP "Pomoc"\r
+ IDS_SEARCH_FILES "Szukaj..."\r
+ IDS_DOCUMENTS "Dokumenty"\r
+ IDS_FAVORITES "Ulubione"\r
+ IDS_PROGRAMS "Programy"\r
+ IDS_SETTINGS "Ustawienia"\r
+ IDS_EXPLORE "Eksploruj"\r
+ IDS_EMPTY "(pusty)"\r
+ IDS_RECENT "Ostatnio otwarte"\r
+ IDS_ADMIN "Administracja"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+ IDS_STARTMENU "Menu start"\r
+ IDS_MINIMIZE_ALL "Minimalizuj wszystko"\r
+ IDS_DESKTOP_NUM "Pulpit %d"\r
+ IDS_VOLUME "G³o\9cno\9cæ"\r
+ IDS_ITEMS_CUR "Aktualne pozycje"\r
+ IDS_ITEMS_CONFIGURED "ustawienia"\r
+ IDS_ITEMS_VISIBLE "widoczne"\r
+ IDS_ITEMS_HIDDEN "ukryte"\r
+ IDS_NOTIFY_SHOW "poka¿"\r
+ IDS_NOTIFY_HIDE "ukryj"\r
+ IDS_NOTIFY_AUTOHIDE "autoukrywanie"\r
+ IDS_SHOW_HIDDEN_ICONS "Poka¿ ukryte ikony"\r
+ IDS_HIDE_ICONS "Ukryj ikony"\r
+ IDS_TERMINATE "Zakoñcz dzia³anie ROS Explorer"\r
+END\r
+\r
+STRINGTABLE DISCARDABLE \r
+BEGIN\r
+ IDS_NETWORK "Sieæ"\r
+ IDS_CONNECTIONS "Po³¹czenia sieciowe"\r
+ IDS_DRIVES "Dysk"\r
+ IDS_SEARCH_COMPUTER "Znajd\9f komputar..."\r
+ IDS_SETTINGS_MENU "Settings menu"\r
+ IDS_CONTROL_PANEL "Panel sterowania"\r
+ IDS_PRINTERS "Drukarki"\r
+ IDS_BROWSE "Przegl¹daj"\r
+ IDS_SEARCH_PRG "Znajd\9f progarm..."\r
+ IDS_ALL_USERS "All Users\\"\r
+ IDS_SEARCH "Szukaj"\r
+ IDS_ABOUT_EXPLORER "ReactOS Explorer - &Informacje"\r
+ IDS_LAUNCH_MANY_PROGRAMS \r
+ "Zaznaczy³e\9c wiêcej ni¿ jeden program.\nCzy chcesz uruchomiæ je jednocze\9cnie?"\r
+ IDS_DESKTOPBAR_SETTINGS "W³a\9cciwo\9cci pulpitu"\r
+ IDS_DESKTOP "Pulpit"\r
+ IDS_TASKBAR "Pasek zadañ"\r
+END\r
+\r
+#endif // Polish (PL) resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+\r
+#ifndef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 3 resource.\r
+//\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#endif // not APSTUDIO_INVOKED\r
+\r
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "resource.h"
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// German (Germany) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""resource.h""\r\n"
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // German (Germany) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Portuguese (Portugal) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_PTG)
+#ifdef _WIN32
+LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Executar"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10
+ CONTROL "Co&mando:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,
+ 18,60,10
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
+ CONTROL "Como &Símbolo",214,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,3,45,71,12
+ DEFPUSHBUTTON "&OK",1,158,6,47,14
+ PUSHBUTTON "&Cancelar",2,158,23,47,14
+ PUSHBUTTON "&Ajuda",254,158,43,47,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TITLE "Explorador do Reactos"
+ IDS_START "Iniciar"
+ IDS_LOGOFF "Terminar sessão..."
+ IDS_SHUTDOWN "Desligar..."
+ IDS_LAUNCH "Executar..."
+ IDS_START_HELP "Ajuda"
+ IDS_SEARCH_FILES "Procurar..."
+ IDS_DOCUMENTS "Documentos"
+ IDS_FAVORITES "Favoritos"
+ IDS_PROGRAMS "Programas"
+ IDS_SETTINGS "Definições"
+ IDS_EXPLORE "Explorar"
+ IDS_EMPTY "(Vazio)"
+ IDS_RECENT "Documentos recentes"
+ IDS_ADMIN "Administrar"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_STARTMENU "Startmenu"
+ IDS_MINIMIZE_ALL "mimimize all windows"
+ IDS_DESKTOP_NUM "Desktop %d"
+ IDS_VOLUME "Volume"
+ IDS_ITEMS_CUR "current items"
+ IDS_ITEMS_CONFIGURED "configuration"
+ IDS_ITEMS_VISIBLE "visible"
+ IDS_ITEMS_HIDDEN "hidden"
+ IDS_NOTIFY_SHOW "show"
+ IDS_NOTIFY_HIDE "hide"
+ IDS_NOTIFY_AUTOHIDE "autohide"
+ IDS_SHOW_HIDDEN_ICONS "Show hidden icons"
+ IDS_HIDE_ICONS "Hide icons"
+ IDS_TERMINATE "Terminar ROS Explorador"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_NETWORK "Rede"
+ IDS_CONNECTIONS "Conecções da rede"
+ IDS_DRIVES "Drives"
+ IDS_SEARCH_COMPUTER "Procurar computador..."
+ IDS_SETTINGS_MENU "Menu das definições"
+ IDS_CONTROL_PANEL "Painel de controle"
+ IDS_PRINTERS "Impressora"
+ IDS_BROWSE "Vasculhar Ficheiros"
+ IDS_SEARCH_PRG "Procurar programa..."
+ IDS_ALL_USERS "Todos utilizadores\\"
+ IDS_SEARCH "Procurar"
+ IDS_ABOUT_EXPLORER "Sobre o Explorador..."
+ IDS_LAUNCH_MANY_PROGRAMS
+ "You have selected more than one program.\nAre you sure you want to launch all of them?"
+ IDS_DESKTOPBAR_SETTINGS "Desktop Settings"
+ IDS_DESKTOP "Desktop"
+ IDS_TASKBAR "Taskbar"
+END
+
+#endif // Portuguese (Portugal) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "resource.h"
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Romanian resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ROM)
+#ifdef _WIN32
+LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+#pragma code_page(1250)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_MDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Fiºier"
+ BEGIN
+ MENUITEM "&Execute...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Ieºire", ID_FILE_EXIT
+ END
+ POPUP "&Prezentare"
+ BEGIN
+ MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR
+ MENUITEM "&Extra Bar", ID_VIEW_EXTRA_BAR
+ MENUITEM "&Drivebar", ID_VIEW_DRIVE_BAR, CHECKED
+ MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR
+ MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Resetare\tF5", ID_REFRESH
+ MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "&SDI", ID_VIEW_SDI
+ END
+ POPUP "&Fereastrã"
+ BEGIN
+ MENUITEM "&Fereastrã Nouã", ID_WINDOW_NEW
+ MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE
+ MENUITEM "Aliniazã &Orizontal", ID_WINDOW_TILE_HORZ
+ MENUITEM "Aliniazã &Vertical\tShift+F4", ID_WINDOW_TILE_VERT
+ MENUITEM "Aranjeazã automat", ID_WINDOW_AUTOSORT
+ MENUITEM "Aranjeazã &Simbolurile", ID_WINDOW_ARRANGE
+ END
+ POPUP "&Tools"
+ BEGIN
+ MENUITEM "&Options", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Ajutor"
+ BEGIN
+ MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "&Despre Explorer...", ID_ABOUT_EXPLORER
+ MENUITEM "Despre &OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_SDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Fiºier"
+ BEGIN
+ MENUITEM "&Execute...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Ieºire", ID_FILE_EXIT
+ END
+ POPUP "&Prezentare"
+ BEGIN
+ MENUITEM "&Bara cu instrumente", ID_VIEW_TOOL_BAR
+ MENUITEM "&Side Bar", ID_VIEW_SIDE_BAR, GRAYED
+ MENUITEM "&Bara de stare", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Resetare\tF5", ID_REFRESH
+ MENUITEM "F&ull Screen\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "&MDI", ID_VIEW_MDI
+ END
+ POPUP "&Tools"
+ BEGIN
+ MENUITEM "&Options", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Ajutor"
+ BEGIN
+ MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "&Despre Explorer...", ID_ABOUT_EXPLORER
+ MENUITEM "Despre &OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Execute"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10
+ CONTROL "&Comanda:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,
+ 18,60,10
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
+ CONTROL "Ca &Simbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,
+ 45,71,12
+ DEFPUSHBUTTON "&OK",1,158,6,47,14
+ PUSHBUTTON "A&nulare",2,158,23,47,14
+ PUSHBUTTON "&Ajutor",254,158,43,47,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TITLE "ReactOS Explorer"
+ IDS_START "Începe"
+ IDS_LOGOFF "Închide sesiunea ..."
+ IDS_SHUTDOWN "Oprire calculator ..."
+ IDS_LAUNCH "Pornire ..."
+ IDS_START_HELP "Ajutor"
+ IDS_SEARCH_FILES "Cãutare Files..."
+ IDS_DOCUMENTS "Documente"
+ IDS_FAVORITES "Preferinþe"
+ IDS_PROGRAMS "Programe"
+ IDS_SETTINGS "Setãri"
+ IDS_EXPLORE "Explorare"
+ IDS_EMPTY "(Empty)"
+ IDS_RECENT "Documente Recente"
+ IDS_ADMIN "Administrare"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_STARTMENU "Startmenu"
+ IDS_MINIMIZE_ALL "mimimize all windows"
+ IDS_DESKTOP_NUM "Desktop %d"
+ IDS_VOLUME "Volume"
+ IDS_ITEMS_CUR "current items"
+ IDS_ITEMS_CONFIGURED "configuration"
+ IDS_ITEMS_VISIBLE "visible"
+ IDS_ITEMS_HIDDEN "hidden"
+ IDS_NOTIFY_SHOW "show"
+ IDS_NOTIFY_HIDE "hide"
+ IDS_NOTIFY_AUTOHIDE "autohide"
+ IDS_SHOW_HIDDEN_ICONS "Show hidden icons"
+ IDS_HIDE_ICONS "Hide icons"
+ IDS_TERMINATE "Închide sesiunea"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_NETWORK "Reþea"
+ IDS_CONNECTIONS "Conecþii"
+ IDS_DRIVES "Discuri"
+ IDS_SEARCH_COMPUTER "Search Computer..."
+ IDS_SETTINGS_MENU "Settings Menu"
+ IDS_CONTROL_PANEL "Control Panel"
+ IDS_PRINTERS "Printers"
+ IDS_BROWSE "Browse Files"
+ IDS_SEARCH_PRG "Search Programm..."
+ IDS_ALL_USERS "All Users\\"
+ IDS_SEARCH "Cãutare..."
+ IDS_ABOUT_EXPLORER "&Despre Explorer..."
+ IDS_LAUNCH_MANY_PROGRAMS
+ "You have selected more than one program.\nAre you sure you want to launch all of them?"
+ IDS_DESKTOPBAR_SETTINGS "Desktop Settings"
+ IDS_DESKTOP "Desktop"
+ IDS_TASKBAR "Taskbar"
+END
+
+#endif // Romanian resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// German (Germany) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""resource.h""\r\n"
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // German (Germany) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "resource.h"
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Russian resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
+#ifdef _WIN32
+LANGUAGE LANG_RUSSIAN, SUBLANG_NEUTRAL
+#pragma code_page(1251)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_DESKTOPBAR MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Íàñòðîéêè...", ID_DESKTOPBAR_SETTINGS
+ MENUITEM "&Äèñïåò÷åð Çàäà÷...", ID_TASKMGR
+ MENUITEM SEPARATOR
+ MENUITEM "&Î Ïðîâîäíèêå...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_MDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Ôàéë"
+ BEGIN
+ MENUITEM "&Çàïóñòèòü...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "Â&ûõîä", ID_FILE_EXIT
+ END
+ POPUP "&Âèä"
+ BEGIN
+ MENUITEM "&Ïàíåëü èíñòðóìåíòîâ", ID_VIEW_TOOL_BAR
+ MENUITEM "&Äîïîëíèòåëüíàÿ ïàíåëü", ID_VIEW_EXTRA_BAR
+ MENUITEM "&Äèñêè", ID_VIEW_DRIVE_BAR, CHECKED
+ MENUITEM "È&çáðàííîå", ID_VIEW_SIDE_BAR
+ MENUITEM "&Ñòðîêà ñîñòîÿíèÿ", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Îáíîâèòü\tF5", ID_REFRESH
+ MENUITEM "Ïî&ëíûé ýêðàí\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "SDI", ID_VIEW_SDI
+ END
+ POPUP "Î&êíà"
+ BEGIN
+ MENUITEM "Íîâîå î&êíî", ID_WINDOW_NEW
+ MENUITEM "Ðàñïîëîæèòü êàñêàäîì\tShift+F5", ID_WINDOW_CASCADE
+ MENUITEM "&Ãîðèçîíòàëüíî", ID_WINDOW_TILE_HORZ
+ MENUITEM "&Âåðòèêàëüíî\tShift+F4", ID_WINDOW_TILE_VERT
+ MENUITEM "Óïîðÿäî÷èòü àâòîìàòè÷åñêè", ID_WINDOW_AUTOSORT
+ MENUITEM "Óïîðÿäî÷èòü &çíà÷êè", ID_WINDOW_ARRANGE
+ END
+ POPUP "&Èíñòðóìåíòû"
+ BEGIN
+ MENUITEM "&Îïöèè", ID_TOOLS_OPTIONS
+ END
+ POPUP "Ïî&ìîùü"
+ BEGIN
+ MENUITEM "&FAQ(×àÂî) ïî Ïðîâîäíèêó...", ID_EXPLORER_FAQ
+ MENUITEM "Î &Ïðîâîäíèêå...", ID_ABOUT_EXPLORER
+ MENUITEM "Îá &ÎÑ...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_NOTIFYAREA MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Ïîêàçûâàòü ñêðûòûå çíà÷êè", ID_SHOW_HIDDEN_ICONS
+ MENUITEM "Ïîêàçûâàòü çíà÷êè íà &êíîïêàõ", ID_SHOW_ICON_BUTTON
+ MENUITEM "&Íàñòðîéêà óâåäîìëåíèé...", ID_CONFIG_NOTIFYAREA
+ MENUITEM "Íàñòðîéêà äàòû/&âðåìåíè", ID_CONFIG_TIME
+ MENUITEM SEPARATOR
+ MENUITEM "&Î Ïðîâîäíèêå...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_SDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Ôàéë"
+ BEGIN
+ MENUITEM "&Çàïóñòèòü...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "Â&ûõîä", ID_FILE_EXIT
+ END
+ POPUP "&Âèä"
+ BEGIN
+ MENUITEM "&Ïàíåëü èíñòðóìåíòîâ", ID_VIEW_TOOL_BAR
+ MENUITEM "È&çáðàííîå", ID_VIEW_SIDE_BAR, GRAYED
+ MENUITEM "&Ñòðîêà ñîñòîÿíèÿ", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Îáíîâèòü\tF5", ID_REFRESH
+ MENUITEM "Ïî&ëíûé ýêðàí\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "&MDI", ID_VIEW_MDI
+ END
+ POPUP "&Èíñòðóìåíòû"
+ BEGIN
+ MENUITEM "&Îïöèè", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Ñïðàâêà"
+ BEGIN
+ MENUITEM "&FAQ(×àÂÎ) ïî Ïðîâîäíèêó...", ID_EXPLORER_FAQ
+ MENUITEM "Î &Ïðîâîäíèêå...", ID_ABOUT_EXPLORER
+ MENUITEM "Îá &ÎÑ...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_VOLUME MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Ãðîìêîñòü", ID_TRAY_VOLUME
+ MENUITEM "Ñâîéñòâà çâóêà", ID_VOLUME_PROPERTIES
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_ABOUT_EXPLORER DIALOGEX 0, 0, 199, 106
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Î Ïðîâîäíèêå ReactOS"
+FONT 10, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "Ïðîâîäíèê ReactOS",IDC_ROS_EXPLORER,91,13,104,11
+ LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8
+ LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8
+ LTEXT "",IDC_WIN_VERSION,91,58,98,22
+ LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129,
+ 8
+ CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,
+ 154,90,38,12
+END
+
+IDD_DESKBAR_DESKTOP DIALOGEX 0, 0, 212, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Ñâîéñòâà Ðàáî÷åãî Ñòîëà"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "Âûáåðèòå, íàèáîëåå ïðåäïî÷òèòåëüíûé äëÿ âàñ, \nñïîñîá âûðàâíèâàíèÿ çíà÷êîâ",
+ IDC_STATIC,7,7,195,18
+ CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,25,46,44
+ CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,25,46,44
+ CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,25,46,44
+ CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,25,46,44
+ CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,73,46,44
+ CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,73,46,44
+ CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,73,46,44
+ CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,73,46,44
+ CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,121,46,44
+ CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,121,46,44
+ CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,121,46,44
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
+ WS_TABSTOP,159,121,46,44
+ CONTROL "Ïîêàçûâàòü Íîìåð &Âåðñèè",ID_DESKTOP_VERSION,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,177,109,10
+END
+
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Ñâîéòñâà ìåíþ Ïóñê"
+FONT 8, "MS Sans Serif"
+BEGIN
+END
+
+IDD_DESKBAR_TASKBAR DIALOGEX 0, 0, 227, 202
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Ñâîéñòâà ïàíåëè çàäà÷"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "Îòîáðàæàòü &÷àñû",ID_SHOW_CLOCK,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,17,161,76,10
+ CONTROL "&Ñêðûâàòü íåèñïîëüçóåìûå çíà÷êè",ID_HIDE_INACTIVE_ICONS,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,178,135,10
+ PUSHBUTTON "&Óâåäîìëåíèÿ...",ID_CONFIG_NOTIFYAREA,156,174,63,14
+END
+
+IDD_EXECUTE DIALOGEX 15, 13, 210, 63
+STYLE DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Âûïîëíèòü"
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10
+ CONTROL "&Êîìàíäà:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,
+ 18,60,10
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
+ CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,
+ 45,71,12
+ DEFPUSHBUTTON "&OK",1,158,6,47,14
+ PUSHBUTTON "&Îòìåíà",2,158,24,47,14
+ PUSHBUTTON "&Ñïðàâêà",254,158,42,47,14
+END
+
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Âûáåðèòå ðåæèì MDI / SDI"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "Âûáåðèòå íàèáîëåå ïðåäïî÷òèòåëüíûé äëÿ âàñ\nâèä ïðîâîäíèêà:",
+ IDC_STATIC,7,7,171,17
+ CONTROL "&MDI (ìíîãîäîêóìåíòíûé íòåðôåéñ)",IDC_MDI,"Button",
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,136,10
+ CONTROL "&SDI (îäíîäîêóìåíòíûé èíòåðôåéñ)",IDC_SDI,"Button",
+ BS_AUTORADIOBUTTON,7,62,134,10
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13
+ CONTROL "Open Subfolders in s&eparate windows",
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,90,135,10
+ LTEXT "Ýòè íàñòðîéêè áóäóò èñïîëüçîâàííû, êàê çíà÷åíèå ïî óìîë÷àíèþ äëÿ âñåõ îêîí ïðîâîäíèêà â áóäóùåì.",
+ IDC_STATIC,7,107,174,26
+ DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP
+ PUSHBUTTON "&Cancel",IDCANCEL,106,136,50,14
+END
+
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Êîíôèãóðàöèÿ çíà÷êîâ"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES |
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31
+ LTEXT "&Òåêñò Ïîäñêàçêè:",IDC_LABEL1,7,44,62,8
+ EDITTEXT IDC_NOTIFY_TOOLTIP,76,42,125,14,ES_AUTOHSCROLL
+ LTEXT "Çàãîëîâîê Î&êíà:",IDC_LABEL2,7,63,58,8
+ EDITTEXT IDC_NOTIFY_TITLE,76,60,125,14,ES_AUTOHSCROLL
+ LTEXT "&Ïóòü ê Ìîäóëþ:",IDC_LABEL3,7,81,54,8
+ EDITTEXT IDC_NOTIFY_MODULE,76,78,125,14,ES_AUTOHSCROLL
+ GROUPBOX "&Ðåæèì Îòîáðàæåíèÿ",IDC_LABEL4,7,96,169,28
+ CONTROL "&ïîêàçàòü",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON |
+ WS_TABSTOP,15,108,47,10
+ CONTROL "&ñêðûòü",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66,
+ 108,41,10
+ CONTROL "à&âòîñêðûòèå",IDC_NOTIFY_AUTOHIDE,"Button",
+ BS_AUTORADIOBUTTON,112,108,60,10
+ ICON "",IDC_PICTURE,181,101,20,20
+ LTEXT "&Ïîñëåäíèå\nÈçìåíåíèÿ",IDC_LABEL6,7,129,40,19
+ EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL |
+ ES_READONLY
+ CONTROL "ïîêà&çàòü ñêðûòîå",ID_SHOW_HIDDEN_ICONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,78,10
+ DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP
+ PUSHBUTTON "&Îòìåíà",IDCANCEL,151,153,50,14
+END
+
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Ïîèñê ïðîãðàììû â Ïñóêå"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "&Ôèëüòð:",IDC_STATIC,7,9,30,8
+ EDITTEXT IDC_FILTER,40,7,94,14,ES_AUTOHSCROLL
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT |
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER |
+ WS_TABSTOP,7,25,186,33
+ PUSHBUTTON "&Ïðîâåðèòü",IDC_CHECK_ENTRIES,143,7,50,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TITLE "Ïðîâîäíèê Reactos"
+ IDS_START "Ïóñê"
+ IDS_LOGOFF "Âûõîä èç ñèñòåìû..."
+ IDS_SHUTDOWN "Âûêëþ÷èòü..."
+ IDS_LAUNCH "Âûïîëíèòü..."
+ IDS_START_HELP "Ñïðàâêà"
+ IDS_SEARCH_FILES "Ïîèñê..."
+ IDS_DOCUMENTS "Äîêóìåíòû"
+ IDS_FAVORITES "Èçáðàííîå"
+ IDS_PROGRAMS "Ïðîãðàììû"
+ IDS_SETTINGS "Íàñòðîéêè"
+ IDS_EXPLORE "Îáçîð"
+ IDS_EMPTY "(Ïóñòî)"
+ IDS_RECENT "Íåäàâíèå äîêóìåíòû"
+ IDS_ADMIN "Àäìèíèñòðèðîâàíèå"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_NETWORK "Ñåòü"
+ IDS_CONNECTIONS "Ñåòåâûå ïîäêëþ÷åíèÿ"
+ IDS_DRIVES "Äèñêè"
+ IDS_SEARCH_COMPUTER "Íàéòè êîìïüþòåð..."
+ IDS_SETTINGS_MENU "Íàñòðîéêà ìåíþ"
+ IDS_CONTROL_PANEL "Ïàíåëü óïðàâëåíèÿ"
+ IDS_PRINTERS "Ïðèíòåðû"
+ IDS_BROWSE "Îáçîð ôàéëîâ"
+ IDS_SEARCH_PRG "Íàéòè ïðîãðàììó..."
+ IDS_ALL_USERS "Âñå ïîëüçîâàòåëè\\"
+ IDS_SEARCH "Ïîèñê"
+ IDS_ABOUT_EXPLORER "&Î Ïðîâîäíèêå..."
+ IDS_LAUNCH_MANY_PROGRAMS
+ "Âû âûáðàëè áîëåå îäíîé ïðîãðàììû.\nÂû óâåðåíû, ÷òî õîòèòå âûïîëíèòü èõ âñå?"
+ IDS_DESKTOPBAR_SETTINGS "Íàñòðîéêè ðàáî÷åãî ñòîëà"
+ IDS_DESKTOP "Ðàáî÷èé Ñòîë"
+ IDS_TASKBAR "Ïàíåëü çàäà÷"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_STARTMENU "Ìåíþ Ïóñêà"
+ IDS_MINIMIZE_ALL "ñâåðíóòü âñå îêíà"
+ IDS_DESKTOP_NUM "Ðàáî÷èé Ñòîë %d"
+ IDS_VOLUME "Îáú¸ì"
+ IDS_ITEMS_CUR "òåêóùåé ýëåìåíò"
+ IDS_ITEMS_CONFIGURED "êîíôèãóðàöèÿ"
+ IDS_ITEMS_VISIBLE "âèäèìûé"
+ IDS_ITEMS_HIDDEN "ñêðûòûé"
+ IDS_NOTIFY_SHOW "ïîêàçàòü"
+ IDS_NOTIFY_HIDE "ñêðûòü"
+ IDS_NOTIFY_AUTOHIDE "àâòîñêðûòèå"
+ IDS_SHOW_HIDDEN_ICONS "Ïîêàçàòü ñêðûòûå çíà÷êè"
+ IDS_HIDE_ICONS "Ñêðûòü çíà÷êè"
+ IDS_TERMINATE "Çàâåðøèòü ðàáîòó Ïðîâîäíèêà"
+END
+
+#endif // Russian resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// German (Germany) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""resource.h""\r\n"
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // German (Germany) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// German (Germany) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "#include <windows.h>\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // German (Germany) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Swedish resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_SVE)
+#ifdef _WIN32
+LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_MDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Arkiv"
+ BEGIN
+ MENUITEM "&Kör...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Avsluta", ID_FILE_EXIT
+ END
+ POPUP "&Visa"
+ BEGIN
+ MENUITEM "&Verktygsfält", ID_VIEW_TOOL_BAR
+ MENUITEM "&Extrafält", ID_VIEW_EXTRA_BAR
+ MENUITEM "E&nhetsfält", ID_VIEW_DRIVE_BAR, CHECKED
+ MENUITEM "S&idfält", ID_VIEW_SIDE_BAR
+ MENUITEM "&Statusfält", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Uppdatera\tF5", ID_REFRESH
+ MENUITEM "F&ullskärm\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "SDI", ID_VIEW_SDI
+ END
+ POPUP "&Fönster"
+ BEGIN
+ MENUITEM "Nytt &fönster", ID_WINDOW_NEW
+ MENUITEM "Överlappande\tShift+F5", ID_WINDOW_CASCADE
+ MENUITEM "Ordna &horizontellt", ID_WINDOW_TILE_HORZ
+ MENUITEM "Ordna &vertikalt\tShift+F4", ID_WINDOW_TILE_VERT
+ MENUITEM "Ordna automatiskt", ID_WINDOW_AUTOSORT
+ MENUITEM "Ordna &symboler", ID_WINDOW_ARRANGE
+ END
+ POPUP "&Verktyg"
+ BEGIN
+ MENUITEM "&Alternativ", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Hjälp"
+ BEGIN
+ MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "Om &Explorer...", ID_ABOUT_EXPLORER
+ MENUITEM "Om &OS...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_DESKTOPBAR MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Inställningar...", ID_DESKTOPBAR_SETTINGS
+ MENUITEM "&Aktivitetshanteraren...", ID_TASKMGR
+ MENUITEM SEPARATOR
+ MENUITEM "&Om Explorer...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_VOLUME MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Öppna volymkontroll", ID_TRAY_VOLUME
+ MENUITEM "Justera ljudinställningar", ID_VOLUME_PROPERTIES
+ END
+END
+
+IDM_NOTIFYAREA MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Visa dolda ikoner", ID_SHOW_HIDDEN_ICONS
+ MENUITEM "Visa &ikonknapp", ID_SHOW_ICON_BUTTON
+ MENUITEM "&Konfigurera meddelanden...", ID_CONFIG_NOTIFYAREA
+ MENUITEM "Justera &datum och &tid...", ID_CONFIG_TIME
+ MENUITEM SEPARATOR
+ MENUITEM "&Om Explorer...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_SDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Arkiv"
+ BEGIN
+ MENUITEM "&Kör...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Avsluta", ID_FILE_EXIT
+ END
+ POPUP "&Visa"
+ BEGIN
+ MENUITEM "&Verktygsfält", ID_VIEW_TOOL_BAR
+ MENUITEM "&Sidfält", ID_VIEW_SIDE_BAR, GRAYED
+ MENUITEM "&Statusfält", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Uppdatera\tF5", ID_REFRESH
+ MENUITEM "&Fullskärm\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "&MDI", ID_VIEW_MDI
+ END
+ POPUP "&Verktyg"
+ BEGIN
+ MENUITEM "&Alternativ", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Hjälp"
+ BEGIN
+ MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ
+ MENUITEM "&Om Explorer...", ID_ABOUT_EXPLORER
+ MENUITEM "Om &operativsystemet...", ID_ABOUT_WINDOWS
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Kör"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,162,10
+ CONTROL "&Kommando:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,
+ 18,60,10
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
+ CONTROL "&Som symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+ 3,45,71,12
+ DEFPUSHBUTTON "&OK",1,158,6,47,14
+ PUSHBUTTON "&Avbryt",2,158,23,47,14
+ PUSHBUTTON "&Hjälp",254,158,43,47,14
+END
+
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Sök program på startmenyn"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "&Filter:",IDC_STATIC,7,9,18,8
+ EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT |
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER |
+ WS_TABSTOP,7,25,186,33
+ PUSHBUTTON "&Kontrollera poster",IDC_CHECK_ENTRIES,143,7,50,14
+END
+
+IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Skrivbordsinställningar"
+FONT 8, "MS Sans Serif"
+BEGIN
+ LTEXT "Välj från vilket hörn och åt vilket håll du föredrar att rada upp ikonerna:",
+ IDC_STATIC,7,7,166,8
+ CONTROL "vä. och neråt",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,25,46,44
+ CONTROL "övre åt hö.",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,25,46,44
+ CONTROL "övre åt vä.",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,25,46,44
+ CONTROL "hö. och neråt",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,25,46,44
+ CONTROL "vä. och uppåt",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,73,46,44
+ CONTROL "nedre åt hö.",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,73,46,44
+ CONTROL "nedre åt vä.",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,73,46,44
+ CONTROL "hö. och uppåt",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,73,46,44
+ CONTROL "sidor och ner",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,121,46,44
+ CONTROL "kanter",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,121,46,44
+ CONTROL "runt om",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,121,46,44
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
+ WS_TABSTOP,159,121,46,44
+ CONTROL "Visa &versionsnummer",ID_DESKTOP_VERSION,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10
+END
+
+IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Aktivitetsfältsinställningar"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CONTROL "visa &klockan",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,152,52,10
+ CONTROL "&Göm inaktiva meddelandeikoner",ID_HIDE_INACTIVE_ICONS,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,174,111,10
+ PUSHBUTTON "&Meddelanden...",ID_CONFIG_NOTIFYAREA,153,173,50,14
+END
+
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Startmenyinställningar"
+FONT 8, "MS Sans Serif"
+BEGIN
+END
+
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Inställningar för meddelandeikoner"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES |
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31
+ LTEXT "&Hjälptext:",IDC_LABEL1,7,44,40,8
+ EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL
+ LTEXT "&Fönstertitel:",IDC_LABEL2,7,63,44,8
+ EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL
+ LTEXT "&Modulsökväg:",IDC_LABEL3,7,81,43,8
+ EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL
+ GROUPBOX "&Visningsläge",IDC_LABEL4,7,96,157,28
+ CONTROL "v&isa",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON |
+ WS_TABSTOP,15,108,33,10
+ CONTROL "&dölj",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66,
+ 108,29,10
+ CONTROL "dölj a&utomatiskt",IDC_NOTIFY_AUTOHIDE,"Button",
+ BS_AUTORADIOBUTTON,112,108,43,10
+ ICON "",IDC_PICTURE,173,101,21,20
+ LTEXT "&Senast ändrad:",IDC_LABEL6,7,132,43,8
+ EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL |
+ ES_READONLY
+ CONTROL "visa d&olda",ID_SHOW_HIDDEN_ICONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10
+ DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP
+ PUSHBUTTON "&Avbryt",IDCANCEL,151,153,50,14
+END
+
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Välj MDI / SDI Läge"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "Välj det gränssnitt du föredrar:",IDC_STATIC,7,7,160,8
+ CONTROL "&MDI (multiple document interface)",IDC_MDI,"Button",
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,121,10
+ CONTROL "&SDI (single document interface)",IDC_SDI,"Button",
+ BS_AUTORADIOBUTTON,7,62,115,10
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13
+ CONTROL "Open Subfolders in s&eparate windows",
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,90,135,10
+ LTEXT "Den här inställningen kommer att gälla som standard i alla nya explorer-fönster.",
+ IDC_STATIC,7,107,174,22
+ DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP
+ PUSHBUTTON "&Avbryt",IDCANCEL,106,136,50,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TITLE "Reactos Explorer"
+ IDS_START "Start"
+ IDS_LOGOFF "Logga ut..."
+ IDS_SHUTDOWN "Stäng av..."
+ IDS_LAUNCH "Kör..."
+ IDS_START_HELP "Hjälp"
+ IDS_SEARCH_FILES "Sök..."
+ IDS_DOCUMENTS "Dokument"
+ IDS_FAVORITES "Favoriter"
+ IDS_PROGRAMS "Program"
+ IDS_SETTINGS "Inställningar"
+ IDS_EXPLORE "Utforska"
+ IDS_EMPTY "(tom)"
+ IDS_RECENT "Senaste dokumenten"
+ IDS_ADMIN "Administration"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_STARTMENU "Startmeny"
+ IDS_MINIMIZE_ALL "minimera alla fönster"
+ IDS_DESKTOP_NUM "Skrivbord %d"
+ IDS_VOLUME "Volym"
+ IDS_ITEMS_CUR "aktuella meddelanden"
+ IDS_ITEMS_CONFIGURED "konfiguration"
+ IDS_ITEMS_VISIBLE "synlig"
+ IDS_ITEMS_HIDDEN "dold"
+ IDS_NOTIFY_SHOW "visa"
+ IDS_NOTIFY_HIDE "dölj"
+ IDS_NOTIFY_AUTOHIDE "dölj automatiskt"
+ IDS_SHOW_HIDDEN_ICONS "Visa dolda ikoner"
+ IDS_HIDE_ICONS "Dölj ikoner"
+ IDS_TERMINATE "Avsluta Explorer"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_NETWORK "Nätverk"
+ IDS_CONNECTIONS "Nätverksanslutningar"
+ IDS_DRIVES "Enheter"
+ IDS_SEARCH_COMPUTER "Sök dator..."
+ IDS_SETTINGS_MENU "Inställningsmeny"
+ IDS_CONTROL_PANEL "Kontrollpanelen"
+ IDS_PRINTERS "Skrivare"
+ IDS_BROWSE "Utforska filer"
+ IDS_SEARCH_PRG "Sök program..."
+ IDS_ALL_USERS "Alla användare\\"
+ IDS_SEARCH "Sök"
+ IDS_ABOUT_EXPLORER "&Om Explorer..."
+ IDS_LAUNCH_MANY_PROGRAMS
+ "Du har valt fler än ett program.\nÄr du säker på att du vill öppna dem alla?"
+ IDS_DESKTOPBAR_SETTINGS "Skrivbordsinställningar"
+ IDS_DESKTOP "Skrivbord"
+ IDS_TASKBAR "Aktivitetsfält"
+END
+
+#endif // Swedish resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Ukrainian resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_UKR)
+#ifdef _WIN32
+LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+#pragma code_page(1251)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDM_MDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Ôàéë"
+ BEGIN
+ MENUITEM "&Âèêîíàòè...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "Â&èõ³ä", ID_FILE_EXIT
+ END
+ POPUP "&Âèãëÿä"
+ BEGIN
+ MENUITEM "&Ïàíåëü ³íñòðóìåíò³â", ID_VIEW_TOOL_BAR
+ MENUITEM "&Äîäàòêîâà ïàíåëü", ID_VIEW_EXTRA_BAR
+ MENUITEM "Ä&èñêè", ID_VIEW_DRIVE_BAR, CHECKED
+ MENUITEM "&Âèáðàíå", ID_VIEW_SIDE_BAR
+ MENUITEM "&Ðÿäîê ñòàíó", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Îíîâèòè\tF5", ID_REFRESH
+ MENUITEM "Ïîâíèé &åêðàí\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "SDI", ID_VIEW_SDI
+ END
+ POPUP "Â&³êíà"
+ BEGIN
+ MENUITEM "&Íîâå â³êíî", ID_WINDOW_NEW
+ MENUITEM "&Êàñêàäîì\tShift+F5", ID_WINDOW_CASCADE
+ MENUITEM "&Ãîðèçîíòàëüíî", ID_WINDOW_TILE_HORZ
+ MENUITEM "&Âåðòèêàëüíî\tShift+F4", ID_WINDOW_TILE_VERT
+ MENUITEM "Óïîðÿäêóâàòè àâòîìàòè÷íî", ID_WINDOW_AUTOSORT
+ MENUITEM "Óïîðÿäêóâàòè &çíà÷êè", ID_WINDOW_ARRANGE
+ END
+ POPUP "&²íñòðóìåíòè"
+ BEGIN
+ MENUITEM "&Îïö³¿", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Äîâ³äêà"
+ BEGIN
+ MENUITEM "&FAQ(×àÏè) ïî Ïðîâ³äíèêó...", ID_EXPLORER_FAQ
+ MENUITEM "Ïðî &Ïðîâ³äíèê...", ID_ABOUT_EXPLORER
+ MENUITEM "Ïðî &ÎÑ...", ID_ABOUT_WINDOWS
+ END
+END
+
+IDM_DESKTOPBAR MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&Íàñòðîéêè...", ID_DESKTOPBAR_SETTINGS
+ MENUITEM "Ä&èñïåò÷åð çàâäàíü...", ID_TASKMGR
+ MENUITEM SEPARATOR
+ MENUITEM "&Ïðî Ïðîâ³äíèê...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_VOLUME MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Ãó÷í³ñòü", ID_TRAY_VOLUME
+ MENUITEM "&Âëàñòèâîñò³ çâóêó", ID_VOLUME_PROPERTIES
+ END
+END
+
+IDM_NOTIFYAREA MENU DISCARDABLE
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "&³äîáðàæàòè ïðèõîâàí³ çíà÷êè", ID_SHOW_HIDDEN_ICONS
+ MENUITEM "³äîáðàæàòè çíà÷êè íà &êíîïêàõ", ID_SHOW_ICON_BUTTON
+ MENUITEM "&Í&àñòðîéêà ñïîâ³ùåíü...", ID_CONFIG_NOTIFYAREA
+ MENUITEM "&Íàñòðîéêà äàòè é ÷àñó...", ID_CONFIG_TIME
+ MENUITEM SEPARATOR
+ MENUITEM "&Ïðî Ïðîâ³äíèê...", ID_ABOUT_EXPLORER
+ END
+END
+
+IDM_SDIFRAME MENU DISCARDABLE
+BEGIN
+ POPUP "&Ôàéë"
+ BEGIN
+ MENUITEM "&Âèêîíàòè...", ID_EXECUTE
+ MENUITEM SEPARATOR
+ MENUITEM "Â&èõ³ä", ID_FILE_EXIT
+ END
+ POPUP "&Âèãëÿä"
+ BEGIN
+ MENUITEM "&Ïàíåëü ³íñòðóìåíò³â", ID_VIEW_TOOL_BAR
+ MENUITEM "&Âèáðàíå", ID_VIEW_SIDE_BAR, GRAYED
+ MENUITEM "&Ðÿäîê ñòàíó", ID_VIEW_STATUSBAR
+ MENUITEM SEPARATOR
+ MENUITEM "&Îíîâèòè\tF5", ID_REFRESH
+ MENUITEM "Ïîâíèé &åêðàí\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
+ MENUITEM "&MDI", ID_VIEW_MDI
+ END
+ POPUP "&²íñòðóìåíòè"
+ BEGIN
+ MENUITEM "&Îïö³¿", ID_TOOLS_OPTIONS
+ END
+ POPUP "&Äîâ³äêà"
+ BEGIN
+ MENUITEM "&FAQ(×àÏè) ïî Ïðîâ³äíèêó...", ID_EXPLORER_FAQ
+ MENUITEM "Ïðî &Ïðîâ³äíèê...", ID_ABOUT_EXPLORER
+ MENUITEM "Ïðî &ÎÑ...", ID_ABOUT_WINDOWS
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_EXECUTE DIALOG DISCARDABLE 15, 13, 210, 63
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Âèêîíàòè"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ CONTROL "",101,"Static",SS_SIMPLE | SS_NOPREFIX,3,6,150,10
+ CONTROL "&Êîìàíäà:",-1,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,3,
+ 18,60,10
+ EDITTEXT 201,3,29,134,12,ES_AUTOHSCROLL
+ CONTROL "As &Symbol",214,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,
+ 45,71,12
+ DEFPUSHBUTTON "&OK",1,158,6,47,14
+ PUSHBUTTON "&Ñêàñóâàòè",2,158,23,47,14
+ PUSHBUTTON "&Äîâ³äêà",254,158,43,47,14
+END
+
+IDD_SEARCH_PROGRAM DIALOGEX 0, 0, 200, 65
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Ïîøóê ïðîãðàìè â ìåíþ Ïóñê"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "&Ô³ëüòð:",IDC_STATIC,7,9,18,8
+ EDITTEXT IDC_FILTER,34,7,100,14,ES_AUTOHSCROLL
+ CONTROL "List1",IDC_PROGRAMS_FOUND,"SysListView32",LVS_REPORT |
+ LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER |
+ WS_TABSTOP,7,25,186,33
+ PUSHBUTTON "&Ïåðåâ³ðèòè",IDC_CHECK_ENTRIES,143,7,50,14
+END
+
+IDD_DESKBAR_DESKTOP DIALOG DISCARDABLE 0, 0, 212, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Âëàñòèâîñò³ ðîáî÷îãî ñòîëà"
+FONT 8, "MS Sans Serif"
+BEGIN
+ LTEXT "Îáåð³òü íàéá³ëüø çðó÷íèé äëÿ âàñ àëãîðèòì âèð³âíþâàííÿ çíà÷ê³â:",
+ IDC_STATIC,7,7,166,8
+ CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,25,46,44
+ CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,25,46,44
+ CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,25,46,44
+ CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,25,46,44
+ CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,73,46,44
+ CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,73,46,44
+ CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,73,46,44
+ CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,159,73,46,44
+ CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,7,121,46,44
+ CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,57,121,46,44
+ CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
+ BS_BOTTOM | WS_TABSTOP,110,121,46,44
+ CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
+ WS_TABSTOP,159,121,46,44
+ CONTROL "³äîáðàæàòè Íîìåð &Âåðñ³¿",ID_DESKTOP_VERSION,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,177,91,10
+END
+
+IDD_DESKBAR_TASKBAR DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Âëàñòèâîñò³ ïàíåë³ çàâäàíü"
+FONT 8, "MS Sans Serif"
+BEGIN
+ CONTROL "³äîáðà&æàòè ãîäèííèê",ID_SHOW_CLOCK,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,152,52,10
+ CONTROL "Ïðè&õîâóâàòè íåâèêîðèñòîâóâàí³ çíà÷êè",
+ ID_HIDE_INACTIVE_ICONS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,174,111,10
+ PUSHBUTTON "&Ñïîâ³ùåííÿ...",ID_CONFIG_NOTIFYAREA,153,173,50,14
+END
+
+IDD_DESKBAR_STARTMENU DIALOG DISCARDABLE 0, 0, 210, 194
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
+CAPTION "Âëàñòèâîñò³ ìåíþ Ïóñê"
+FONT 8, "MS Sans Serif"
+BEGIN
+END
+
+IDD_NOTIFYAREA DIALOGEX 0, 0, 208, 174
+STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION |
+ WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Êîíô³ãóðàö³ÿ çíà÷ê³â ñïîâ³ùåíü"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ CONTROL "Tree1",IDC_NOTIFY_ICONS,"SysTreeView32",TVS_HASLINES |
+ TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,194,31
+ LTEXT "&Òåêñò ϳäêàçêè:",IDC_LABEL1,7,44,40,8
+ EDITTEXT IDC_NOTIFY_TOOLTIP,58,42,143,14,ES_AUTOHSCROLL
+ LTEXT "Çàãîëîâîê Â&³êíà:",IDC_LABEL2,7,63,44,8
+ EDITTEXT IDC_NOTIFY_TITLE,58,60,143,14,ES_AUTOHSCROLL
+ LTEXT "&Øëÿõ äî Ìîäóëÿ:",IDC_LABEL3,7,81,43,8
+ EDITTEXT IDC_NOTIFY_MODULE,58,78,143,14,ES_AUTOHSCROLL
+ GROUPBOX "&Ðåæèì ³äîáðàæåííÿ",IDC_LABEL4,7,96,157,28
+ CONTROL "&ïîêàçàòè",IDC_NOTIFY_SHOW,"Button",BS_AUTORADIOBUTTON |
+ WS_TABSTOP,15,108,33,10
+ CONTROL "&ñõîâàòè",IDC_NOTIFY_HIDE,"Button",BS_AUTORADIOBUTTON,66,
+ 108,29,10
+ CONTROL "à&âòîïðèõîâàííÿ",IDC_NOTIFY_AUTOHIDE,"Button",
+ BS_AUTORADIOBUTTON,112,108,43,10
+ ICON "",IDC_PICTURE,173,101,21,20
+ LTEXT "&Îñòàííÿ çì³íà:",IDC_LABEL6,7,132,43,8
+ EDITTEXT IDC_LAST_CHANGE,59,129,105,14,ES_AUTOHSCROLL |
+ ES_READONLY
+ CONTROL "ïîêà&çàòè ïðèõîâàíå",ID_SHOW_HIDDEN_ICONS,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,7,154,56,10
+ DEFPUSHBUTTON "&OK",IDOK,91,153,50,14,WS_GROUP
+ PUSHBUTTON "&Ñêàñóâàòè",IDCANCEL,151,153,50,14
+END
+
+IDD_MDI_SDI DIALOGEX 0, 0, 194, 157
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "Îáåð³òü ðåæèì â³êîí Ïðîâ³äíèêà"
+FONT 8, "MS Sans Serif", 0, 0, 0x1
+BEGIN
+ LTEXT "Îáåð³òü íàéá³ëüø çðó÷íèé äëÿ âàñ ³íòåðôåéñ ïðîâ³äíèêà:",
+ IDC_STATIC,7,7,160,8
+ CONTROL "&MDI (áàãàòîäîêóìåíòíèé ³íòåðôåéñ)",IDC_MDI,"Button",
+ BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,7,31,124,10
+ CONTROL "&SDI (îäíîäîêóìåíòíèé ³íòåðôåéñ)",IDC_SDI,"Button",
+ BS_AUTORADIOBUTTON,7,62,118,10
+ CONTROL 170,IDC_STATIC,"Static",SS_BITMAP,145,23,15,13
+ CONTROL 171,IDC_STATIC,"Static",SS_BITMAP,145,57,15,13
+ CONTROL "³äêðèâàòè ï³äïàïêè â î&êðåìèõ â³êíàõ",
+ IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,7,90,135,10
+ LTEXT "Ö³ íàñòðîéêè áóäóòü âèêîðèñòàí³ ÿê çíà÷åííÿ çà çàìîâ÷óâàííÿì äëÿ âñ³õ â³êîí ïðîâ³äíèêà â ìàéáóòíüîìó.",
+ IDC_STATIC,7,111,174,22
+ DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP
+ PUSHBUTTON "&Ñêàñóâàòè",IDCANCEL,106,136,50,14
+END
+
+IDD_ABOUT_EXPLORER DIALOG DISCARDABLE 0, 0, 199, 106
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Ïðî Ïðîâ³äíèê ReactOS"
+FONT 10, "MS Sans Serif"
+BEGIN
+ LTEXT "Ïðîâ³äíèê ReactOS",IDC_ROS_EXPLORER,91,13,104,11
+ LTEXT "V 0.9",IDC_VERSION_TXT,91,27,104,8
+ LTEXT "(c) 2003-2005 Martin Fuchs",IDC_STATIC,91,42,104,8
+ LTEXT "",IDC_WIN_VERSION,91,58,98,22
+ LTEXT "http://www.sky.franken.de/explorer/",IDC_WWW,17,84,129,
+ 8
+ CONTROL "&OK",IDOK,"Button",BS_OWNERDRAW | BS_FLAT | WS_GROUP,
+ 154,90,38,12
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "#include <windows.h>\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_TITLE "Ïðîâ³äíèê Reactos"
+ IDS_START "Ïóñê"
+ IDS_LOGOFF "Âèõ³ä ³ç ñèñòåìè..."
+ IDS_SHUTDOWN "Âèìêíåííÿ..."
+ IDS_LAUNCH "Âèêîíàòè..."
+ IDS_START_HELP "Äîâ³äêà"
+ IDS_SEARCH_FILES "Ïîøóê..."
+ IDS_DOCUMENTS "Äîêóìåíòè"
+ IDS_FAVORITES "Âèáðàíå"
+ IDS_PROGRAMS "Ïðîãðàìè"
+ IDS_SETTINGS "Íàñòðîéêè"
+ IDS_EXPLORE "Îãëÿä"
+ IDS_EMPTY "(Ïîðîæíüî)"
+ IDS_RECENT "Íåäàâí³ äîêóìåíòè"
+ IDS_ADMIN "Àäì³í³ñòðóâàííÿ"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_STARTMENU "Ìåíþ Ïóñê"
+ IDS_MINIMIZE_ALL "çãîðíóòè âñ³ â³êíà"
+ IDS_DESKTOP_NUM "Ðîáî÷èé Ñò³ë %d"
+ IDS_VOLUME "Ãó÷í³ñòü"
+ IDS_ITEMS_CUR "ïîòî÷í³ åëåìåíòè"
+ IDS_ITEMS_CONFIGURED "êîíô³ãóðàö³ÿ"
+ IDS_ITEMS_VISIBLE "âèäèìèé"
+ IDS_ITEMS_HIDDEN "ïðèõîâàíèé"
+ IDS_NOTIFY_SHOW "ïîêàçàòè"
+ IDS_NOTIFY_HIDE "ñõîâàòè"
+ IDS_NOTIFY_AUTOHIDE "àâòîïðèõîâàííÿ"
+ IDS_SHOW_HIDDEN_ICONS "Ïîêàçàòè ïðèõîâàí³ çíà÷êè"
+ IDS_HIDE_ICONS "Ñõîâàòè çíà÷êè"
+ IDS_TERMINATE "Çàâåðøèòè ðîáîòó Ïðîâ³äíèêà"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_NETWORK "Ìåðåæà"
+ IDS_CONNECTIONS "Ìåðåæí³ ï³äêëþ÷åííÿ"
+ IDS_DRIVES "Äèñêè"
+ IDS_SEARCH_COMPUTER "Ïîøóê êîìï\92þòåðà..."
+ IDS_SETTINGS_MENU "Ìåíþ Íàñòðîéêà"
+ IDS_CONTROL_PANEL "Ïàíåëü êåðóâàííÿ"
+ IDS_PRINTERS "Ïðèíòåðè"
+ IDS_BROWSE "Îãëÿä ôàéë³â"
+ IDS_SEARCH_PRG "Ïîøóê ïðîãðàìè..."
+ IDS_ALL_USERS "Âñ³ êîðèñòóâà÷³\\"
+ IDS_SEARCH "Ïîøóê"
+ IDS_ABOUT_EXPLORER "&Ïðî Ïðîâ³äíèê..."
+ IDS_LAUNCH_MANY_PROGRAMS
+ "Âè îáðàëè á³ëüøå îäí³º¿ ïðîãðàìè.\nÂè âïåâíåí³, ùî õî÷åòå çàïóñòèòè ¿õ âñ³?"
+ IDS_DESKTOPBAR_SETTINGS "Íàñòðîéêè ðîáî÷îãî ñòîëà"
+ IDS_DESKTOP "Ðîáî÷èé Ñò³ë"
+ IDS_TASKBAR "Ïàíåëü çàâäàíü"
+END
+
+#endif // Ukrainian resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // explorer.cpp
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+ // Credits: Thanks to Leon Finker for his explorer cabinet window example
+ //
+
+
+#include <precomp.h> // <precomp.h> instead of "precomp.h" because the ROS build system needs this to find the precompiled header file (*.gch) in the output directory tree
+
+#include "resource.h"
+
+#include <locale.h> // for setlocale()
+
+#ifndef __WINE__
+#include <io.h> // for dup2()
+#include <fcntl.h> // for _O_RDONLY
+#endif
+
+#include "dialogs/settings.h" // for MdiSdiDlg
+
+#include "services/shellservices.h"
+
+
+extern "C" int initialize_gdb_stub(); // start up GDB stub
+
+
+DynamicLoadLibFct<void(__stdcall*)(BOOL)> g_SHDOCVW_ShellDDEInit(TEXT("SHDOCVW"), 118);
+
+
+ExplorerGlobals g_Globals;
+
+
+ExplorerGlobals::ExplorerGlobals()
+{
+ _hInstance = 0;
+ _cfStrFName = 0;
+
+#ifndef ROSSHELL
+ _hframeClass = 0;
+ _hMainWnd = 0;
+ _desktop_mode = false;
+ _prescan_nodes = false;
+#endif
+
+ _log = NULL;
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ _SHRestricted = 0;
+#endif
+ _hwndDesktopBar = 0;
+ _hwndShellView = 0;
+ _hwndDesktop = 0;
+}
+
+
+void ExplorerGlobals::init(HINSTANCE hInstance)
+{
+ _hInstance = hInstance;
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ _SHRestricted = (DWORD(STDAPICALLTYPE*)(RESTRICTIONS)) GetProcAddress(GetModuleHandle(TEXT("SHELL32")), "SHRestricted");
+#endif
+
+ _icon_cache.init();
+}
+
+
+void ExplorerGlobals::read_persistent()
+{
+ // read configuration file
+ _cfg_dir.printf(TEXT("%s\\ReactOS"), (LPCTSTR)SpecialFolderFSPath(CSIDL_APPDATA,0));
+ _cfg_path.printf(TEXT("%s\\ros-explorer-cfg.xml"), _cfg_dir.c_str());
+
+ if (!_cfg.read(_cfg_path)) {
+ if (_cfg._last_error != XML_ERROR_NO_ELEMENTS)
+ MessageBox(g_Globals._hwndDesktop, String(_cfg._last_error_msg.c_str()),
+ TEXT("ROS Explorer - reading user settings"), MB_OK);
+
+ _cfg.read(TEXT("explorer-cfg-template.xml"));
+ }
+
+ // read bookmarks
+ _favorites_path.printf(TEXT("%s\\ros-explorer-bookmarks.xml"), _cfg_dir.c_str());
+
+ if (!_favorites.read(_favorites_path)) {
+ _favorites.import_IE_favorites(0);
+ _favorites.write(_favorites_path);
+ }
+}
+
+void ExplorerGlobals::write_persistent()
+{
+ // write configuration file
+ RecursiveCreateDirectory(_cfg_dir);
+
+ _cfg.write(_cfg_path);
+ _favorites.write(_favorites_path);
+}
+
+
+XMLPos ExplorerGlobals::get_cfg()
+{
+ XMLPos cfg_pos(&_cfg);
+
+ cfg_pos.smart_create("explorer-cfg");
+
+ return cfg_pos;
+}
+
+XMLPos ExplorerGlobals::get_cfg(const char* path)
+{
+ XMLPos cfg_pos(&_cfg);
+
+ cfg_pos.smart_create("explorer-cfg");
+ cfg_pos.create_relative(path);
+
+ return cfg_pos;
+}
+
+
+void _log_(LPCTSTR txt)
+{
+ FmtString msg(TEXT("%s\n"), txt);
+
+ if (g_Globals._log)
+ _fputts(msg, g_Globals._log);
+
+ OutputDebugString(msg);
+}
+
+
+bool FileTypeManager::is_exe_file(LPCTSTR ext)
+{
+ static const LPCTSTR s_executable_extensions[] = {
+ TEXT("COM"),
+ TEXT("EXE"),
+ TEXT("BAT"),
+ TEXT("CMD"),
+ TEXT("CMM"),
+ TEXT("BTM"),
+ TEXT("AWK"),
+ 0
+ };
+
+ TCHAR ext_buffer[_MAX_EXT];
+ const LPCTSTR* p;
+ LPCTSTR s;
+ LPTSTR d;
+
+ for(s=ext+1,d=ext_buffer; (*d=toupper(*s)); s++)
+ ++d;
+
+ for(p=s_executable_extensions; *p; p++)
+ if (!lstrcmp(ext_buffer, *p))
+ return true;
+
+ return false;
+}
+
+
+const FileTypeInfo& FileTypeManager::operator[](String ext)
+{
+ ext.toLower();
+
+ iterator found = find(ext);
+ if (found != end())
+ return found->second;
+
+ FileTypeInfo& ftype = super::operator[](ext);
+
+ ftype._neverShowExt = false;
+
+ HKEY hkey;
+ TCHAR value[MAX_PATH], display_name[MAX_PATH];
+ LONG valuelen = sizeof(value);
+
+ if (!RegQueryValue(HKEY_CLASSES_ROOT, ext, value, &valuelen)) {
+ ftype._classname = value;
+
+ valuelen = sizeof(display_name);
+ if (!RegQueryValue(HKEY_CLASSES_ROOT, ftype._classname, display_name, &valuelen))
+ ftype._displayname = display_name;
+
+ if (!RegOpenKey(HKEY_CLASSES_ROOT, ftype._classname, &hkey)) {
+ if (!RegQueryValueEx(hkey, TEXT("NeverShowExt"), 0, NULL, NULL, NULL))
+ ftype._neverShowExt = true;
+
+ RegCloseKey(hkey);
+ }
+ }
+
+ return ftype;
+}
+
+LPCTSTR FileTypeManager::set_type(Entry* entry, bool dont_hide_ext)
+{
+ LPCTSTR ext = _tcsrchr(entry->_data.cFileName, TEXT('.'));
+
+ if (ext) {
+ const FileTypeInfo& type = (*this)[ext];
+
+ if (!type._displayname.empty())
+ entry->_type_name = _tcsdup(type._displayname);
+
+ // hide some file extensions
+ if (type._neverShowExt && !dont_hide_ext) {
+ int len = ext - entry->_data.cFileName;
+ entry->_display_name = (LPTSTR) malloc((len+1)*sizeof(TCHAR));
+ lstrcpyn(entry->_display_name, entry->_data.cFileName, len + 1);
+ }
+
+ if (is_exe_file(ext))
+ entry->_data.dwFileAttributes |= ATTRIBUTE_EXECUTABLE;
+ }
+
+ return ext;
+}
+
+
+Icon::Icon()
+ : _id(ICID_UNKNOWN),
+ _itype(IT_STATIC),
+ _hicon(0)
+{
+}
+
+Icon::Icon(ICON_ID id, UINT nid) //, int cx, int cy
+ : _id(id),
+ _itype(IT_STATIC),
+ _hicon(ResIcon(nid)) // ResIconEx(nid, cx, cy)
+{
+}
+
+Icon::Icon(ICON_ID id, UINT nid, int icon_size)
+ : _id(id),
+ _itype(IT_STATIC),
+ _hicon(ResIconEx(nid, icon_size, icon_size))
+{
+}
+
+Icon::Icon(ICON_TYPE itype, int id, HICON hIcon)
+ : _id((ICON_ID)id),
+ _itype(itype),
+ _hicon(hIcon)
+{
+}
+
+Icon::Icon(ICON_TYPE itype, int id, int sys_idx)
+ : _id((ICON_ID)id),
+ _itype(itype),
+ _sys_idx(sys_idx)
+{
+}
+
+void Icon::draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const
+{
+ if (_itype == IT_SYSCACHE)
+ ImageList_DrawEx(g_Globals._icon_cache.get_sys_imagelist(), _sys_idx, hdc, x, y, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL);
+ else
+ DrawIconEx(hdc, x, y, _hicon, cx, cy, 0, bk_brush, DI_NORMAL);
+}
+
+HBITMAP Icon::create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const
+{
+ if (_itype == IT_SYSCACHE) {
+ HIMAGELIST himl = g_Globals._icon_cache.get_sys_imagelist();
+
+ int cx, cy;
+ ImageList_GetIconSize(himl, &cx, &cy);
+
+ HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
+ HDC hdc = CreateCompatibleDC(hdc_wnd);
+ HBITMAP hbmp_old = SelectBitmap(hdc, hbmp);
+ ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL);
+ SelectBitmap(hdc, hbmp_old);
+ DeleteDC(hdc);
+
+ return hbmp;
+ } else
+ return create_bitmap_from_icon(_hicon, hbrBkgnd, hdc_wnd);
+}
+
+
+int Icon::add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color, HBRUSH bk_brush) const
+{
+ int ret;
+
+ if (_itype == IT_SYSCACHE) {
+ HIMAGELIST himl = g_Globals._icon_cache.get_sys_imagelist();
+
+ int cx, cy;
+ ImageList_GetIconSize(himl, &cx, &cy);
+
+ HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
+ HDC hdc = CreateCompatibleDC(hdc_wnd);
+ HBITMAP hbmp_old = SelectBitmap(hdc, hbmp);
+ ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL);
+ SelectBitmap(hdc, hbmp_old);
+ DeleteDC(hdc);
+
+ ret = ImageList_Add(himl, hbmp, 0);
+
+ DeleteObject(hbmp);
+ } else
+ ret = ImageList_AddAlphaIcon(himl, _hicon, bk_brush, hdc_wnd);
+
+ return ret;
+}
+
+HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, int icon_size*/)
+{
+ int cx = ICON_SIZE_SMALL;
+ int cy = ICON_SIZE_SMALL;
+ HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
+
+ MemCanvas canvas;
+ BitmapSelection sel(canvas, hbmp);
+
+ RECT rect = {0, 0, cx, cy};
+ FillRect(canvas, &rect, hbrush_bkgnd);
+
+ DrawIconEx(canvas, 0, 0, hIcon, cx, cy, 0, hbrush_bkgnd, DI_NORMAL);
+
+ return hbmp;
+}
+
+HBITMAP create_small_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd)
+{
+ int cx = GetSystemMetrics(SM_CXSMICON);
+ int cy = GetSystemMetrics(SM_CYSMICON);
+ HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
+
+ MemCanvas canvas;
+ BitmapSelection sel(canvas, hbmp);
+
+ RECT rect = {0, 0, cx, cy};
+ FillRect(canvas, &rect, hbrush_bkgnd);
+
+ DrawIconEx(canvas, 0, 0, hIcon, cx, cy, 0, hbrush_bkgnd, DI_NORMAL);
+
+ return hbmp;
+}
+
+int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd)
+{
+ HBITMAP hbmp = create_bitmap_from_icon(hIcon, hbrush_bkgnd, hdc_wnd);
+
+ int ret = ImageList_Add(himl, hbmp, 0);
+
+ DeleteObject(hbmp);
+
+ return ret;
+}
+
+
+int IconCache::s_next_id = ICID_DYNAMIC;
+
+
+void IconCache::init()
+{
+ int icon_size = STARTMENUROOT_ICON_SIZE;
+
+ _icons[ICID_NONE] = Icon(IT_STATIC, ICID_NONE, (HICON)0);
+
+ _icons[ICID_FOLDER] = Icon(ICID_FOLDER, IDI_FOLDER);
+ //_icons[ICID_DOCUMENT] = Icon(ICID_DOCUMENT, IDI_DOCUMENT);
+ _icons[ICID_EXPLORER] = Icon(ICID_EXPLORER, IDI_EXPLORER);
+// _icons[ICID_APP] = Icon(ICID_APP, IDI_APPICON);
+
+ _icons[ICID_CONFIG] = Icon(ICID_CONFIG, IDI_CONFIG, icon_size);
+ _icons[ICID_DOCUMENTS] = Icon(ICID_DOCUMENTS, IDI_DOCUMENTS, icon_size);
+ _icons[ICID_FAVORITES] = Icon(ICID_FAVORITES, IDI_FAVORITES, icon_size);
+ _icons[ICID_INFO] = Icon(ICID_INFO, IDI_INFO, icon_size);
+ _icons[ICID_APPS] = Icon(ICID_APPS, IDI_APPS, icon_size);
+ _icons[ICID_SEARCH] = Icon(ICID_SEARCH, IDI_SEARCH, icon_size);
+ _icons[ICID_ACTION] = Icon(ICID_ACTION, IDI_ACTION, icon_size);
+ _icons[ICID_SEARCH_DOC] = Icon(ICID_SEARCH_DOC, IDI_SEARCH_DOC, icon_size);
+ _icons[ICID_PRINTER] = Icon(ICID_PRINTER, IDI_PRINTER, icon_size);
+ _icons[ICID_NETWORK] = Icon(ICID_NETWORK, IDI_NETWORK, icon_size);
+ _icons[ICID_COMPUTER] = Icon(ICID_COMPUTER, IDI_COMPUTER, icon_size);
+ _icons[ICID_LOGOFF] = Icon(ICID_LOGOFF, IDI_LOGOFF, icon_size);
+ _icons[ICID_SHUTDOWN] = Icon(ICID_SHUTDOWN, IDI_SHUTDOWN, icon_size);
+ _icons[ICID_BOOKMARK] = Icon(ICID_BOOKMARK, IDI_DOT_TRANS, icon_size);
+ _icons[ICID_MINIMIZE] = Icon(ICID_MINIMIZE, IDI_MINIMIZE, icon_size);
+ _icons[ICID_CONTROLPAN] = Icon(ICID_CONTROLPAN, IDI_CONTROLPAN, icon_size);
+ _icons[ICID_DESKSETTING]= Icon(ICID_DESKSETTING,IDI_DESKSETTING,icon_size);
+ _icons[ICID_NETCONNS] = Icon(ICID_NETCONNS, IDI_NETCONNS, icon_size);
+ _icons[ICID_ADMIN] = Icon(ICID_ADMIN, IDI_ADMIN, icon_size);
+ _icons[ICID_RECENT] = Icon(ICID_RECENT, IDI_RECENT, icon_size);
+}
+
+
+const Icon& IconCache::extract(LPCTSTR path, ICONCACHE_FLAGS flags)
+{
+ // search for matching icon with unchanged flags in the cache
+ CacheKey mapkey(path, flags);
+ PathCacheMap::iterator found = _pathCache.find(mapkey);
+
+ if (found != _pathCache.end())
+ return _icons[found->second];
+
+ // search for matching icon with handle
+ CacheKey mapkey_hicon(path, flags|ICF_HICON);
+ if (flags != mapkey_hicon.second) {
+ found = _pathCache.find(mapkey_hicon);
+
+ if (found != _pathCache.end())
+ return _icons[found->second];
+ }
+
+ // search for matching icon in the system image list cache
+ CacheKey mapkey_syscache(path, flags|ICF_SYSCACHE);
+ if (flags != mapkey_syscache.second) {
+ found = _pathCache.find(mapkey_syscache);
+
+ if (found != _pathCache.end())
+ return _icons[found->second];
+ }
+
+ SHFILEINFO sfi;
+
+ int shgfi_flags = 0;
+
+ if (flags & ICF_OPEN)
+ shgfi_flags |= SHGFI_OPENICON;
+
+ if ((flags&(ICF_LARGE|ICF_MIDDLE|ICF_OVERLAYS|ICF_HICON)) && !(flags&ICF_SYSCACHE)) {
+ shgfi_flags |= SHGFI_ICON;
+
+ if (!(flags & (ICF_LARGE|ICF_MIDDLE)))
+ shgfi_flags |= SHGFI_SMALLICON;
+
+ if (flags & ICF_OVERLAYS)
+ shgfi_flags |= SHGFI_ADDOVERLAYS;
+
+ // get small/big icons with/without overlays
+ if (SHGetFileInfo(path, 0, &sfi, sizeof(sfi), shgfi_flags)) {
+ const Icon& icon = add(sfi.hIcon, IT_CACHED);
+
+ ///@todo limit cache size
+ _pathCache[mapkey_hicon] = icon;
+
+ return icon;
+ }
+ } else {
+ assert(!(flags&ICF_OVERLAYS));
+
+ shgfi_flags |= SHGFI_SYSICONINDEX|SHGFI_SMALLICON;
+
+ // use system image list - the "search program dialog" needs it
+ HIMAGELIST himlSys_small = (HIMAGELIST) SHGetFileInfo(path, 0, &sfi, sizeof(sfi), shgfi_flags);
+
+ if (himlSys_small) {
+ _himlSys_small = himlSys_small;
+
+ const Icon& icon = add(sfi.iIcon/*, IT_SYSCACHE*/);
+
+ ///@todo limit cache size
+ _pathCache[mapkey_syscache] = icon;
+
+ return icon;
+ }
+ }
+
+ return _icons[ICID_NONE];
+}
+
+const Icon& IconCache::extract(LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags)
+{
+ IdxCacheKey key(path, make_pair(icon_idx, (flags|ICF_HICON)&~ICF_SYSCACHE));
+
+ key.first.toLower();
+
+ IdxCacheMap::iterator found = _idxCache.find(key);
+
+ if (found != _idxCache.end())
+ return _icons[found->second];
+
+ HICON hIcon;
+
+ if ((int)ExtractIconEx(path, icon_idx, NULL, &hIcon, 1) > 0) {
+ const Icon& icon = add(hIcon, IT_CACHED);
+
+ _idxCache[key] = icon;
+
+ return icon;
+ } else {
+
+ ///@todo retreive "http://.../favicon.ico" format icons
+
+ return _icons[ICID_NONE];
+ }
+}
+
+const Icon& IconCache::extract(IExtractIcon* pExtract, LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags)
+{
+ HICON hIconLarge = 0;
+ HICON hIcon;
+
+ int icon_size = ICON_SIZE_FROM_ICF(flags);
+ HRESULT hr = pExtract->Extract(path, icon_idx, &hIconLarge, &hIcon, MAKELONG(GetSystemMetrics(SM_CXICON), icon_size));
+
+ if (hr == NOERROR) { //@@ oder SUCCEEDED(hr) ?
+ if (icon_size > ICON_SIZE_SMALL) { //@@ OK?
+ if (hIcon)
+ DestroyIcon(hIcon);
+
+ hIcon = hIconLarge;
+ } else {
+ if (hIconLarge)
+ DestroyIcon(hIconLarge);
+ }
+
+ if (hIcon)
+ return add(hIcon); //@@ When do we want not to free this icons?
+ }
+
+ return _icons[ICID_NONE];
+}
+
+const Icon& IconCache::add(HICON hIcon, ICON_TYPE type)
+{
+ int id = ++s_next_id;
+
+ return _icons[id] = Icon(type, id, hIcon);
+}
+
+const Icon& IconCache::add(int sys_idx/*, ICON_TYPE type=IT_SYSCACHE*/)
+{
+ int id = ++s_next_id;
+
+ return _icons[id] = SysCacheIcon(id, sys_idx);
+}
+
+const Icon& IconCache::get_icon(int id)
+{
+ return _icons[id];
+}
+
+void IconCache::free_icon(int icon_id)
+{
+ IconMap::iterator found = _icons.find(icon_id);
+
+ if (found != _icons.end()) {
+ Icon& icon = found->second;
+
+ if (icon.destroy())
+ _icons.erase(found);
+ }
+}
+
+
+ResString::ResString(UINT nid)
+{
+ TCHAR buffer[BUFFER_LEN];
+
+ int len = LoadString(g_Globals._hInstance, nid, buffer, sizeof(buffer)/sizeof(TCHAR));
+
+ super::assign(buffer, len);
+}
+
+
+ResIcon::ResIcon(UINT nid)
+{
+ _hicon = LoadIcon(g_Globals._hInstance, MAKEINTRESOURCE(nid));
+}
+
+SmallIcon::SmallIcon(UINT nid)
+{
+ _hicon = (HICON)LoadImage(g_Globals._hInstance, MAKEINTRESOURCE(nid), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED);
+}
+
+ResIconEx::ResIconEx(UINT nid, int w, int h)
+{
+ _hicon = (HICON)LoadImage(g_Globals._hInstance, MAKEINTRESOURCE(nid), IMAGE_ICON, w, h, LR_SHARED);
+}
+
+
+void SetWindowIcon(HWND hwnd, UINT nid)
+{
+ HICON hIcon = ResIcon(nid);
+ (void)Window_SetIcon(hwnd, ICON_BIG, hIcon);
+
+ HICON hIconSmall = SmallIcon(nid);
+ (void)Window_SetIcon(hwnd, ICON_SMALL, hIconSmall);
+}
+
+
+ResBitmap::ResBitmap(UINT nid)
+{
+ _hBmp = LoadBitmap(g_Globals._hInstance, MAKEINTRESOURCE(nid));
+}
+
+
+#ifndef ROSSHELL
+
+void explorer_show_frame(int cmdShow, LPTSTR lpCmdLine)
+{
+ ExplorerCmd cmd;
+
+ if (g_Globals._hMainWnd) {
+ if (IsIconic(g_Globals._hMainWnd))
+ ShowWindow(g_Globals._hMainWnd, SW_RESTORE);
+ else
+ SetForegroundWindow(g_Globals._hMainWnd);
+
+ return;
+ }
+
+ g_Globals._prescan_nodes = false;
+
+ XMLPos explorer_options = g_Globals.get_cfg("general/explorer");
+ XS_String mdiStr = XMLString(explorer_options, "mdi");
+
+ // If there isn't yet the "mdi" setting in the configuration, display MDI/SDI dialog.
+ if (mdiStr.empty())
+ Dialog::DoModal(IDD_MDI_SDI, WINDOW_CREATOR(MdiSdiDlg), g_Globals._hwndDesktop);
+
+ // Now read the MDI attribute again and interpret it as boolean value.
+ cmd._mdi = XMLBool(explorer_options, "mdi", true);
+
+ cmd._cmdShow = cmdShow;
+
+ // parse command line options, which may overwrite the MDI flag
+ if (lpCmdLine)
+ cmd.ParseCmdLine(lpCmdLine);
+
+ // create main window
+ MainFrameBase::Create(cmd);
+}
+
+bool ExplorerCmd::ParseCmdLine(LPCTSTR lpCmdLine)
+{
+ bool ok = true;
+
+ LPCTSTR b = lpCmdLine;
+ LPCTSTR p = b;
+
+ while(*b) {
+ // remove leading space
+ while(_istspace((unsigned)*b))
+ ++b;
+
+ p = b;
+
+ bool quote = false;
+
+ // options are separated by ','
+ for(; *p; ++p) {
+ if (*p == '"') // Quote characters may appear at any position in the command line.
+ quote = !quote;
+ else if (*p==',' && !quote)
+ break;
+ }
+
+ if (p > b) {
+ int l = p - b;
+
+ // remove trailing space
+ while(l>0 && _istspace((unsigned)b[l-1]))
+ --l;
+
+ if (!EvaluateOption(String(b, l)))
+ ok = false;
+
+ if (*p)
+ ++p;
+
+ b = p;
+ }
+ }
+
+ return ok;
+}
+
+bool ExplorerCmd::EvaluateOption(LPCTSTR option)
+{
+ String opt_str;
+
+ // Remove quote characters, as they are evaluated at this point.
+ for(; *option; ++option)
+ if (*option != '"')
+ opt_str += *option;
+
+ option = opt_str;
+
+ if (option[0] == '/') {
+ ++option;
+
+ // option /e for windows in explorer mode
+ if (!_tcsicmp(option, TEXT("e")))
+ _flags |= OWM_EXPLORE;
+ // option /root for rooted explorer windows
+ else if (!_tcsicmp(option, TEXT("root")))
+ _flags |= OWM_ROOTED;
+ // non-standard options: /mdi, /sdi
+ else if (!_tcsicmp(option, TEXT("mdi")))
+ _mdi = true;
+ else if (!_tcsicmp(option, TEXT("sdi")))
+ _mdi = false;
+ else
+ return false;
+ } else {
+ if (!_path.empty())
+ return false;
+
+ _path = opt_str;
+ }
+
+ return true;
+}
+
+bool ExplorerCmd::IsValidPath() const
+{
+ if (!_path.empty()) {
+ DWORD attribs = GetFileAttributes(_path);
+
+ if (attribs!=INVALID_FILE_ATTRIBUTES && (attribs&FILE_ATTRIBUTE_DIRECTORY))
+ return true; // file system path
+ else if (*_path==':' && _path.at(1)==':')
+ return true; // text encoded IDL
+ }
+
+ return false;
+}
+
+#else
+
+void explorer_show_frame(int cmdShow, LPTSTR lpCmdLine)
+{
+ if (!lpCmdLine)
+ lpCmdLine = TEXT("explorer.exe");
+
+ launch_file(GetDesktopWindow(), lpCmdLine, cmdShow);
+}
+
+#endif
+
+
+PopupMenu::PopupMenu(UINT nid)
+{
+ HMENU hMenu = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(nid));
+ _hmenu = GetSubMenu(hMenu, 0);
+}
+
+
+ /// "About Explorer" Dialog
+struct ExplorerAboutDlg : public
+ CtlColorParent<
+ OwnerDrawParent<Dialog>
+ >
+{
+ typedef CtlColorParent<
+ OwnerDrawParent<Dialog>
+ > super;
+
+ ExplorerAboutDlg(HWND hwnd)
+ : super(hwnd)
+ {
+ SetWindowIcon(hwnd, IDI_REACTOS);
+
+ new FlatButton(hwnd, IDOK);
+
+ _hfont = CreateFont(20, 0, 0, 0, FW_BOLD, TRUE, 0, 0, 0, 0, 0, 0, 0, TEXT("Sans Serif"));
+ new ColorStatic(hwnd, IDC_ROS_EXPLORER, RGB(32,32,128), 0, _hfont);
+
+ new HyperlinkCtrl(hwnd, IDC_WWW);
+
+ FmtString ver_txt(ResString(IDS_EXPLORER_VERSION_STR), (LPCTSTR)ResString(IDS_VERSION_STR));
+ SetWindowText(GetDlgItem(hwnd, IDC_VERSION_TXT), ver_txt);
+
+ HWND hwnd_winver = GetDlgItem(hwnd, IDC_WIN_VERSION);
+ SetWindowText(hwnd_winver, get_windows_version_str());
+ SetWindowFont(hwnd_winver, GetStockFont(DEFAULT_GUI_FONT), FALSE);
+
+ CenterWindow(hwnd);
+ }
+
+ ~ExplorerAboutDlg()
+ {
+ DeleteObject(_hfont);
+ }
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+ {
+ switch(nmsg) {
+ case WM_PAINT:
+ Paint();
+ break;
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+ }
+
+ void Paint()
+ {
+ PaintCanvas canvas(_hwnd);
+
+ HICON hicon = (HICON) LoadImage(g_Globals._hInstance, MAKEINTRESOURCE(IDI_REACTOS_BIG), IMAGE_ICON, 0, 0, LR_SHARED);
+
+ DrawIconEx(canvas, 20, 10, hicon, 0, 0, 0, 0, DI_NORMAL);
+ }
+
+protected:
+ HFONT _hfont;
+};
+
+void explorer_about(HWND hwndParent)
+{
+ Dialog::DoModal(IDD_ABOUT_EXPLORER, WINDOW_CREATOR(ExplorerAboutDlg), hwndParent);
+}
+
+
+static void InitInstance(HINSTANCE hInstance)
+{
+ CONTEXT("InitInstance");
+
+ setlocale(LC_COLLATE, ""); // set collating rules to local settings for compareName
+
+#ifndef ROSSHELL
+ // register frame window class
+ g_Globals._hframeClass = IconWindowClass(CLASSNAME_FRAME,IDI_EXPLORER);
+
+ // register child window class
+ WindowClass(CLASSNAME_CHILDWND, CS_CLASSDC|CS_DBLCLKS|CS_VREDRAW).Register();
+
+ // register tree window class
+ WindowClass(CLASSNAME_WINEFILETREE, CS_CLASSDC|CS_DBLCLKS|CS_VREDRAW).Register();
+#endif
+
+ g_Globals._cfStrFName = RegisterClipboardFormat(CFSTR_FILENAME);
+}
+
+
+int explorer_main(HINSTANCE hInstance, LPTSTR lpCmdLine, int cmdShow)
+{
+ CONTEXT("explorer_main");
+
+ // initialize Common Controls library
+ CommonControlInit usingCmnCtrl;
+
+ try {
+ InitInstance(hInstance);
+ } catch(COMException& e) {
+ HandleException(e, GetDesktopWindow());
+ return -1;
+ }
+
+#ifndef ROSSHELL
+ if (cmdShow != SW_HIDE) {
+/* // don't maximize if being called from the ROS desktop
+ if (cmdShow == SW_SHOWNORMAL)
+ ///@todo read window placement from registry
+ cmdShow = SW_MAXIMIZE;
+*/
+
+ explorer_show_frame(cmdShow, lpCmdLine);
+ }
+#endif
+
+ return Window::MessageLoop();
+}
+
+
+ // MinGW does not provide a Unicode startup routine, so we have to implement an own.
+#if defined(__MINGW32__) && defined(UNICODE)
+
+#define _tWinMain wWinMain
+int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int);
+
+int main(int argc, char* argv[])
+{
+ CONTEXT("main");
+
+ STARTUPINFO startupinfo;
+ int nShowCmd = SW_SHOWNORMAL;
+
+ GetStartupInfo(&startupinfo);
+
+ if (startupinfo.dwFlags & STARTF_USESHOWWINDOW)
+ nShowCmd = startupinfo.wShowWindow;
+
+ LPWSTR cmdline = GetCommandLineW();
+
+ while(*cmdline && !_istspace((unsigned)*cmdline))
+ ++cmdline;
+
+ while(_istspace((unsigned)*cmdline))
+ ++cmdline;
+
+ return wWinMain(GetModuleHandle(NULL), 0, cmdline, nShowCmd);
+}
+
+#endif // __MINGW && UNICODE
+
+
+static bool SetShellReadyEvent(LPCTSTR evtName)
+{
+ HANDLE hEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, evtName);
+ if (!hEvent)
+ return false;
+
+ SetEvent(hEvent);
+ CloseHandle(hEvent);
+
+ return true;
+}
+
+
+int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd)
+{
+ CONTEXT("WinMain()");
+
+ BOOL any_desktop_running = IsAnyDesktopRunning();
+
+ BOOL startup_desktop;
+
+ // strip extended options from the front of the command line
+ String ext_options;
+
+ while(*lpCmdLine == '-') {
+ while(*lpCmdLine && !_istspace((unsigned)*lpCmdLine))
+ ext_options += *lpCmdLine++;
+
+ while(_istspace((unsigned)*lpCmdLine))
+ ++lpCmdLine;
+ }
+
+ // command line option "-install" to replace previous shell application with ROS Explorer
+ if (_tcsstr(ext_options,TEXT("-install"))) {
+ // install ROS Explorer into the registry
+ TCHAR path[MAX_PATH];
+
+ int l = GetModuleFileName(0, path, COUNTOF(path));
+ if (l) {
+ HKEY hkey;
+
+ if (!RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hkey)) {
+
+ ///@todo save previous shell application in config file
+
+ RegSetValueEx(hkey, TEXT("Shell"), 0, REG_SZ, (LPBYTE)path, l*sizeof(TCHAR));
+ RegCloseKey(hkey);
+ }
+
+ if (!RegOpenKey(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hkey)) {
+
+ ///@todo save previous shell application in config file
+
+ RegSetValueEx(hkey, TEXT("Shell"), 0, REG_SZ, (LPBYTE)TEXT(""), l*sizeof(TCHAR));
+ RegCloseKey(hkey);
+ }
+ }
+
+ HWND shellWindow = GetShellWindow();
+
+ if (shellWindow) {
+ DWORD pid;
+
+ // terminate shell process for NT like systems
+ GetWindowThreadProcessId(shellWindow, &pid);
+ HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
+
+ // On Win 9x it's sufficient to destroy the shell window.
+ DestroyWindow(shellWindow);
+
+ if (TerminateProcess(hProcess, 0))
+ WaitForSingleObject(hProcess, INFINITE);
+
+ CloseHandle(hProcess);
+ }
+
+ startup_desktop = TRUE;
+ } else {
+ // create desktop window and task bar only, if there is no other shell and we are
+ // the first explorer instance
+ // MS Explorer looks additionally into the registry entry HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\shell,
+ // to decide wether it is currently configured as shell application.
+ startup_desktop = !any_desktop_running;
+ }
+
+
+ bool autostart = !any_desktop_running;
+
+ // disable autostart if the SHIFT key is pressed
+ if (GetAsyncKeyState(VK_SHIFT) < 0)
+ autostart = false;
+
+#ifdef _DEBUG //MF: disabled for debugging
+ autostart = false;
+#endif
+
+ // If there is given the command line option "-desktop", create desktop window anyways
+ if (_tcsstr(ext_options,TEXT("-desktop")))
+ startup_desktop = TRUE;
+#ifndef ROSSHELL
+ else if (_tcsstr(ext_options,TEXT("-nodesktop")))
+ startup_desktop = FALSE;
+
+ // Don't display cabinet window in desktop mode
+ if (startup_desktop && !_tcsstr(ext_options,TEXT("-explorer")))
+ nShowCmd = SW_HIDE;
+#endif
+
+ if (_tcsstr(ext_options,TEXT("-noautostart")))
+ autostart = false;
+ else if (_tcsstr(ext_options,TEXT("-autostart")))
+ autostart = true;
+
+#ifndef __WINE__
+ if (_tcsstr(ext_options,TEXT("-console"))) {
+ AllocConsole();
+
+ _dup2(_open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_RDONLY), 0);
+ _dup2(_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), 0), 1);
+ _dup2(_open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE), 0), 2);
+
+ g_Globals._log = _fdopen(1, "w");
+ setvbuf(g_Globals._log, 0, _IONBF, 0);
+
+ LOG(TEXT("starting explorer debug log\n"));
+ }
+#endif
+
+
+ if (startup_desktop) {
+ // hide the XP login screen (Credit to Nicolas Escuder)
+ // another undocumented event: "Global\\msgina: ReturnToWelcome"
+ if (!SetShellReadyEvent(TEXT("msgina: ShellReadyEvent")))
+ SetShellReadyEvent(TEXT("Global\\msgina: ShellReadyEvent"));
+ }
+#ifdef ROSSHELL
+ else
+ return 0; // no shell to launch, so exit immediatelly
+#endif
+
+
+ if (!any_desktop_running) {
+ // launch the shell DDE server
+ if (g_SHDOCVW_ShellDDEInit)
+ (*g_SHDOCVW_ShellDDEInit)(TRUE);
+ }
+
+
+ bool use_gdb_stub = false; // !IsDebuggerPresent();
+
+ if (_tcsstr(ext_options,TEXT("-debug")))
+ use_gdb_stub = true;
+
+ if (_tcsstr(ext_options,TEXT("-break"))) {
+ LOG(TEXT("debugger breakpoint"));
+#ifdef _MSC_VER
+ __asm int 3
+#else
+ asm("int3");
+#endif
+ }
+
+ // activate GDB remote debugging stub if no other debugger is running
+ if (use_gdb_stub) {
+ LOG(TEXT("waiting for debugger connection...\n"));
+
+ initialize_gdb_stub();
+ }
+
+ g_Globals.init(hInstance);
+
+ // initialize COM and OLE before creating the desktop window
+ OleInit usingCOM;
+
+ // init common controls library
+ CommonControlInit usingCmnCtrl;
+
+ g_Globals.read_persistent();
+
+ if (startup_desktop) {
+ WaitCursor wait;
+
+ g_Globals._desktops.init();
+
+ g_Globals._hwndDesktop = DesktopWindow::Create();
+#ifdef _USE_HDESK
+ g_Globals._desktops.get_current_Desktop()->_hwndDesktop = g_Globals._hwndDesktop;
+#endif
+ }
+
+ Thread* pSSOThread = NULL;
+
+ if (startup_desktop) {
+ // launch SSO thread to allow message processing independent from the explorer main thread
+ pSSOThread = new SSOThread;
+ pSSOThread->Start();
+ }
+
+ /**TODO launching autostart programs can be moved into a background thread. */
+ if (autostart) {
+ char* argv[] = {"", "s"}; // call startup routine in SESSION_START mode
+ startup(2, argv);
+ }
+
+#ifndef ROSSHELL
+ if (g_Globals._hwndDesktop)
+ g_Globals._desktop_mode = true;
+#endif
+
+
+ int ret = explorer_main(hInstance, lpCmdLine, nShowCmd);
+
+
+ // write configuration file
+ g_Globals.write_persistent();
+
+ if (pSSOThread) {
+ pSSOThread->Stop();
+ delete pSSOThread;
+ }
+
+ if (!any_desktop_running) {
+ // shutdown the shell DDE server
+ if (g_SHDOCVW_ShellDDEInit)
+ (*g_SHDOCVW_ShellDDEInit)(FALSE);
+ }
+
+ return ret;
+}
--- /dev/null
+# Microsoft Developer Studio Project File - Name="explorer" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=explorer - Win32 WineDll\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "explorer.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "explorer.mak" CFG="explorer - Win32 WineDll"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "explorer - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "explorer - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "explorer - Win32 Debug Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "explorer - Win32 Unicode Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "explorer - Win32 Unicode Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "explorer - Win32" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "explorer - Win32 WineRelease" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "explorer - Win32 WineDll" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF "$(CFG)" == "explorer - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c\r
+# ADD BASE RSC /l 0x407 /d "NDEBUG"\r
+# ADD RSC /l 0x407 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF "$(CFG)" == "explorer - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 kernel32.lib shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF "$(CFG)" == "explorer - Win32 Debug Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "DRelease"\r
+# PROP BASE Intermediate_Dir "DRelease"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "DRelease"\r
+# PROP Intermediate_Dir "DRelease"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c\r
+# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /c\r
+# ADD BASE RSC /l 0x407 /d "NDEBUG"\r
+# ADD RSC /l 0x407 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /delayload:oleaut32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "URelease"\r
+# PROP BASE Intermediate_Dir "URelease"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "URelease"\r
+# PROP Intermediate_Dir "URelease"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c\r
+# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c\r
+# ADD BASE RSC /l 0x407 /d "NDEBUG"\r
+# ADD RSC /l 0x407 /d "NDEBUG" /d "UNICODE"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF "$(CFG)" == "explorer - Win32 Unicode Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "UDebug"\r
+# PROP BASE Intermediate_Dir "UDebug"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "UDebug"\r
+# PROP Intermediate_Dir "UDebug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c\r
+# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG" /d "UNICODE"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF "$(CFG)" == "explorer - Win32"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Win32"\r
+# PROP BASE Intermediate_Dir "Win32"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Win32"\r
+# PROP Intermediate_Dir "Win32"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c\r
+# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /FR /Yu"precomp.h" /FD /GZ /c\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+# SUBTRACT BASE LINK32 /pdb:none\r
+# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /out:"Win32/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF "$(CFG)" == "explorer - Win32 WineRelease"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "explorer___Win32_WineRelease"\r
+# PROP BASE Intermediate_Dir "explorer___Win32_WineRelease"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "WineRelease"\r
+# PROP Intermediate_Dir "WineRelease"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FR /YX /FD /GZ /c\r
+# ADD CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r
+# SUBTRACT BASE LINK32 /pdb:none\r
+# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /incremental:no /machine:I386 /out:"WineRelease/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF "$(CFG)" == "explorer - Win32 WineDll"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "explorer___Win32_WineDll"\r
+# PROP BASE Intermediate_Dir "explorer___Win32_WineDll"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "WineDll"\r
+# PROP Intermediate_Dir "WineDll"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MT /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D "_ROS_" /D _WIN32_IE=0x0501 /D _WIN32_WINNT=0x0501 /FD /c\r
+# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /Yu"precomp.h" /FD /c\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib ole32.lib /nologo /subsystem:windows /machine:I386 /pdbtype:sept\r
+# SUBTRACT BASE LINK32 /pdb:none /debug\r
+# ADD LINK32 gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /out:"WineDll/wexplorer.exe" /pdbtype:sept /delayload:oleaut32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "explorer - Win32 Release"\r
+# Name "explorer - Win32 Debug"\r
+# Name "explorer - Win32 Debug Release"\r
+# Name "explorer - Win32 Unicode Release"\r
+# Name "explorer - Win32 Unicode Debug"\r
+# Name "explorer - Win32"\r
+# Name "explorer - Win32 WineRelease"\r
+# Name "explorer - Win32 WineDll"\r
+# Begin Group "utility"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\dragdropimpl.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\dragdropimpl.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\shellbrowserimpl.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\shellbrowserimpl.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\shellclasses.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\shellclasses.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\treedroptarget.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\utility.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\utility.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\window.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\window.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\xmlstorage.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\xmlstorage.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "resources"\r
+\r
+# PROP Default_Filter "bmp,ico"\r
+# Begin Source File\r
+\r
+SOURCE=.\res\action.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\administration.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\appicon.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\apps.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\arrow.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\arrow_dwn.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\arrow_up.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\arrowsel.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\computer.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\config.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\res\control-panel.ico"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\res\desktop-settings.ico"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\documents.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\dot.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\dot_red.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\dot_trans.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\drivebar.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-cz.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-de.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-en.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-es.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-fr.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-hu.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-jp.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-pl.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-pt.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-ro.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-ru.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-sv.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-uk.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\explorer.exe.manifest\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\explorer.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\explorer_intres.rc\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\favorites.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\floating.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\folder.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoali10.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig0.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig1.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig2.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig3.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig4.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig5.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig6.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig7.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig8.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig9.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\images.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\info.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\logoff.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\logov.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\logov16.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\logov256.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\mdi.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\minimize.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\res\network-conns.ico"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\network.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\notify_l.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\notify_r.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\printer.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\reactos.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\res\recent-documents.ico"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\resource.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\res\ros-big.ico"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\sdi.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\res\search-doc.ico"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\search.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\shutdown.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\speaker.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\startmenu.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\toolbar.bmp\r
+# End Source File\r
+# End Group\r
+# Begin Group "taskbar"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\desktopbar.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\desktopbar.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\favorites.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\favorites.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\notifyhook\notifyhook.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\quicklaunch.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\quicklaunch.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\startmenu.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\startmenu.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\taskbar.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\taskbar.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\traynotify.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\traynotify.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "desktop"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\desktop\desktop.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\desktop\desktop.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "doc"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\doc\changes.txt\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\doc\readme.txt\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\doc\TODO.txt\r
+# End Source File\r
+# End Group\r
+# Begin Group "shell"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\entries.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\entries.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\fatfs.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\fatfs.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\filechild.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\filechild.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\mainframe.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\mainframe.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\ntobjfs.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\ntobjfs.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\pane.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\pane.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\regfs.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\regfs.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\shellbrowser.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\shellbrowser.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\shellfs.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\shellfs.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\unixfs.cpp\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\unixfs.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\webchild.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\webchild.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\winfs.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\winfs.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "dialogs"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\dialogs\searchprogram.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\dialogs\searchprogram.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\dialogs\settings.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\dialogs\settings.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "main"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\explorer.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\explorer.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\externals.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\globals.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\i386-stub-win32.c"\r
+# SUBTRACT CPP /YX /Yc /Yu\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\precomp.cpp\r
+# ADD CPP /Yc"precomp.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\precomp.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "services"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\services\shellservices.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\services\shellservices.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\services\startup.c\r
+# SUBTRACT CPP /YX /Yc /Yu\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
--- /dev/null
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r
+\r
+###############################################################################\r
+\r
+Project: "explorer"=.\explorer.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+ Begin Project Dependency\r
+ Project_Dep_Name notifyhook\r
+ End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "make_explorer"=.\make_explorer.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "notifyhook"=.\notifyhook\notifyhook.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\r
+<assemblyIdentity\r
+ version="1.0.0.0"\r
+ processorArchitecture="X86"\r
+ name="ReactOS.Explorer"\r
+ type="win32"\r
+/>\r
+<description>ROS Explorer</description>\r
+<dependency>\r
+ <dependentAssembly>\r
+ <assemblyIdentity\r
+ type="win32"\r
+ name="Microsoft.Windows.Common-Controls"\r
+ version="6.0.0.0"\r
+ processorArchitecture="X86"\r
+ publicKeyToken="6595b64144ccf1df"\r
+ language="*"\r
+ />\r
+ </dependentAssembly>\r
+</dependency>\r
+</assembly>\r
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // explorer.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#define _LIGHT_STARTMENU
+#define _LAZY_ICONEXTRACT
+#define _SINGLE_ICONEXTRACT
+//#define _NO_WIN_FS
+
+
+#include "utility/shellclasses.h"
+
+#include "shell/entries.h"
+
+#ifndef _NO_WIN_FS
+#include "shell/winfs.h"
+#endif
+
+#include "shell/shellfs.h"
+
+#ifndef ROSSHELL
+#include "shell/unixfs.h"
+#endif
+
+#include "utility/window.h"
+
+
+#define IDW_STATUSBAR 0x100
+#define IDW_TOOLBAR 0x101
+#define IDW_EXTRABAR 0x102
+#define IDW_DRIVEBAR 0x103
+#define IDW_ADDRESSBAR 0x104
+#define IDW_COMMANDBAR 0x105
+#define IDW_SIDEBAR 0x106
+#define IDW_FIRST_CHILD 0xC000 /*0x200*/
+
+
+#define PM_GET_FILEWND_PTR (WM_APP+0x05)
+#define PM_GET_SHELLBROWSER_PTR (WM_APP+0x06)
+
+#define PM_GET_CONTROLWINDOW (WM_APP+0x16)
+
+#define PM_RESIZE_CHILDREN (WM_APP+0x17)
+#define PM_GET_WIDTH (WM_APP+0x18)
+
+#define PM_REFRESH (WM_APP+0x1B)
+#define PM_REFRESH_CONFIG (WM_APP+0x1C)
+
+
+#define CLASSNAME_FRAME TEXT("CabinetWClass") // same class name for frame window as in MS Explorer
+
+#define CLASSNAME_CHILDWND TEXT("WFS_Child")
+#define CLASSNAME_WINEFILETREE TEXT("WFS_Tree")
+
+
+#include "shell/pane.h"
+#include "shell/filechild.h"
+#include "shell/shellbrowser.h"
+
+
+#ifndef ROSSHELL
+
+ /// Explorer command line parser
+ // for commands like "/e,/root,c:\"
+ // or "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}" (launch of control panel)
+struct ExplorerCmd
+{
+ ExplorerCmd()
+ : _flags(0),
+ _cmdShow(SW_SHOWNORMAL),
+ _mdi(false),
+ _valid_path(false)
+ {
+ }
+
+ ExplorerCmd(LPCTSTR url, bool mdi)
+ : _path(url),
+ _flags(0),
+ _cmdShow(SW_SHOWNORMAL),
+ _mdi(mdi),
+ _valid_path(true) //@@
+ {
+ }
+
+ bool ParseCmdLine(LPCTSTR lpCmdLine);
+ bool EvaluateOption(LPCTSTR option);
+ bool IsValidPath() const;
+
+ String _path;
+ int _flags; // OPEN_WINDOW_MODE
+ int _cmdShow;
+ bool _mdi;
+ bool _valid_path;
+};
+
+#include "shell/mainframe.h"
+
+#endif
--- /dev/null
+/* $Id: explorer.rc 17951 2005-09-20 19:51:27Z mf $ */
+
+#include "explorer_intres.rc"
+
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Explorer\0"
+#define REACTOS_STR_INTERNAL_NAME "explorer\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "explorer.exe\0"
+#include <reactos/version.rc>
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+#define IDS_VERSION_STR 5000
+#define IDS_EXPLORER_VERSION_STR 5001
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_VERSION_STR REACTOS_STR_PRODUCT_VERSION
+ IDS_EXPLORER_VERSION_STR "ReactOS %s Explorer"
+END
--- /dev/null
+\r
+Microsoft Visual Studio Solution File, Format Version 9.00\r
+# Visual C++ Express 2005\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "explorer", "explorer.vcproj", "{BFBAE588-8C68-4303-9BF6-C830087D8F25}"\r
+ ProjectSection(ProjectDependencies) = postProject\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162} = {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}\r
+ EndProjectSection\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_explorer", "make_explorer.vcproj", "{E132A04B-8BC6-4D18-81F2-F0156B809871}"\r
+EndProject\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "notifyhook", "notifyhook\notifyhook.vcproj", "{F28B575D-7DBA-44DE-AAEF-FA0D065E5162}"\r
+EndProject\r
+Global\r
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+ bjam|Win32 = bjam|Win32\r
+ Debug Release|Win32 = Debug Release|Win32\r
+ Debug|Win32 = Debug|Win32\r
+ doxy docu|Win32 = doxy docu|Win32\r
+ Release|Win32 = Release|Win32\r
+ Unicode Debug|Win32 = Unicode Debug|Win32\r
+ Unicode Release|Win32 = Unicode Release|Win32\r
+ WineDll|Win32 = WineDll|Win32\r
+ WineRelease|Win32 = WineRelease|Win32\r
+ EndGlobalSection\r
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.bjam|Win32.ActiveCfg = WineDll|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.bjam|Win32.Build.0 = WineDll|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug Release|Win32.ActiveCfg = Debug|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug Release|Win32.Build.0 = Debug|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug|Win32.ActiveCfg = Debug|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Debug|Win32.Build.0 = Debug|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.doxy docu|Win32.ActiveCfg = Debug|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.doxy docu|Win32.Build.0 = Debug|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Release|Win32.ActiveCfg = Release|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Release|Win32.Build.0 = Release|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Debug|Win32.ActiveCfg = Unicode Debug|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Debug|Win32.Build.0 = Unicode Debug|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Release|Win32.ActiveCfg = Unicode Release|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.Unicode Release|Win32.Build.0 = Unicode Release|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineDll|Win32.ActiveCfg = WineDll|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineDll|Win32.Build.0 = WineDll|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineRelease|Win32.ActiveCfg = WineRelease|Win32\r
+ {BFBAE588-8C68-4303-9BF6-C830087D8F25}.WineRelease|Win32.Build.0 = WineRelease|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.bjam|Win32.ActiveCfg = bjam|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.bjam|Win32.Build.0 = bjam|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.Debug Release|Win32.ActiveCfg = Debug|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.Debug|Win32.ActiveCfg = Debug|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.doxy docu|Win32.ActiveCfg = doxy docu|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.doxy docu|Win32.Build.0 = doxy docu|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.Release|Win32.ActiveCfg = Release|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.Unicode Debug|Win32.ActiveCfg = Unicode Debug|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.Unicode Release|Win32.ActiveCfg = Unicode Release|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineDll|Win32.ActiveCfg = Debug|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineDll|Win32.Build.0 = Debug|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineRelease|Win32.ActiveCfg = Release|Win32\r
+ {E132A04B-8BC6-4D18-81F2-F0156B809871}.WineRelease|Win32.Build.0 = Release|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.bjam|Win32.ActiveCfg = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.bjam|Win32.Build.0 = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug Release|Win32.ActiveCfg = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug Release|Win32.Build.0 = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug|Win32.ActiveCfg = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Debug|Win32.Build.0 = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.doxy docu|Win32.ActiveCfg = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.doxy docu|Win32.Build.0 = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Release|Win32.ActiveCfg = Release|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Release|Win32.Build.0 = Release|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Debug|Win32.ActiveCfg = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Debug|Win32.Build.0 = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Release|Win32.ActiveCfg = Release|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.Unicode Release|Win32.Build.0 = Release|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineDll|Win32.ActiveCfg = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineDll|Win32.Build.0 = Debug|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineRelease|Win32.ActiveCfg = Release|Win32\r
+ {F28B575D-7DBA-44DE-AAEF-FA0D065E5162}.WineRelease|Win32.Build.0 = Release|Win32\r
+ EndGlobalSection\r
+ GlobalSection(SolutionProperties) = preSolution\r
+ HideSolutionNode = FALSE\r
+ EndGlobalSection\r
+EndGlobal\r
--- /dev/null
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+ ProjectType="Visual C++"\r
+ Version="8,00"\r
+ Name="explorer"\r
+ ProjectGUID="{BFBAE588-8C68-4303-9BF6-C830087D8F25}"\r
+ RootNamespace="explorer"\r
+ >\r
+ <Platforms>\r
+ <Platform\r
+ Name="Win32"\r
+ />\r
+ </Platforms>\r
+ <ToolFiles>\r
+ </ToolFiles>\r
+ <Configurations>\r
+ <Configuration\r
+ Name="Unicode Debug|Win32"\r
+ OutputDirectory=".\UDebug"\r
+ IntermediateDirectory=".\UDebug"\r
+ ConfigurationType="1"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ TypeLibraryName=".\UDebug/explorer.tlb"\r
+ HeaderFileName=""\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ Optimization="0"\r
+ PreprocessorDefinitions="_DEBUG;UNICODE;WIN32;_WIN32_IE=0x0600;_WIN32_WINNT=0x0501,_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT"\r
+ MinimalRebuild="true"\r
+ BasicRuntimeChecks="3"\r
+ RuntimeLibrary="3"\r
+ RuntimeTypeInfo="true"\r
+ UsePrecompiledHeader="2"\r
+ PrecompiledHeaderThrough="precomp.h"\r
+ PrecompiledHeaderFile=".\UDebug/explorer.pch"\r
+ AssemblerListingLocation=".\UDebug/"\r
+ ObjectFile=".\UDebug/"\r
+ ProgramDataBaseFileName=".\UDebug/"\r
+ BrowseInformation="1"\r
+ WarningLevel="3"\r
+ SuppressStartupBanner="true"\r
+ DebugInformationFormat="4"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions="_DEBUG,UNICODE"\r
+ Culture="1031"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ AdditionalDependencies="shell32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib"\r
+ OutputFile=".\UDebug/explorer.exe"\r
+ LinkIncremental="2"\r
+ SuppressStartupBanner="true"\r
+ AdditionalLibraryDirectories="Debug"\r
+ DelayLoadDLLs="oleaut32.dll,wsock32.dll"\r
+ GenerateDebugInformation="true"\r
+ ProgramDatabaseFile=".\UDebug/explorer.pdb"\r
+ SubSystem="2"\r
+ TargetMachine="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ AdditionalManifestFiles="explorer.exe.manifest"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ SuppressStartupBanner="true"\r
+ OutputFile=".\UDebug/explorer.bsc"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebDeploymentTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="Unicode Release|Win32"\r
+ OutputDirectory=".\URelease"\r
+ IntermediateDirectory=".\URelease"\r
+ ConfigurationType="1"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ TypeLibraryName=".\URelease/explorer.tlb"\r
+ HeaderFileName=""\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ Optimization="2"\r
+ InlineFunctionExpansion="1"\r
+ PreprocessorDefinitions="NDEBUG;UNICODE;WIN32;_WIN32_IE=0x0600;_WIN32_WINNT=0x0501,_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT"\r
+ StringPooling="true"\r
+ RuntimeLibrary="2"\r
+ EnableFunctionLevelLinking="true"\r
+ RuntimeTypeInfo="true"\r
+ UsePrecompiledHeader="2"\r
+ PrecompiledHeaderThrough="precomp.h"\r
+ PrecompiledHeaderFile=".\URelease/explorer.pch"\r
+ AssemblerListingLocation=".\URelease/"\r
+ ObjectFile=".\URelease/"\r
+ ProgramDataBaseFileName=".\URelease/"\r
+ WarningLevel="3"\r
+ SuppressStartupBanner="true"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions="NDEBUG,UNICODE"\r
+ Culture="1031"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ AdditionalDependencies="shell32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib"\r
+ OutputFile=".\URelease/explorer.exe"\r
+ LinkIncremental="1"\r
+ SuppressStartupBanner="true"\r
+ AdditionalLibraryDirectories="Release"\r
+ DelayLoadDLLs="oleaut32.dll,wsock32.dll"\r
+ ProgramDatabaseFile=".\URelease/explorer.pdb"\r
+ SubSystem="2"\r
+ TargetMachine="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ AdditionalManifestFiles="explorer.exe.manifest"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ SuppressStartupBanner="true"\r
+ OutputFile=".\URelease/explorer.bsc"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebDeploymentTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="WineRelease|Win32"\r
+ OutputDirectory=".\WineRelease"\r
+ IntermediateDirectory=".\WineRelease"\r
+ ConfigurationType="1"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ TypeLibraryName=".\WineRelease/explorer.tlb"\r
+ HeaderFileName=""\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ Optimization="2"\r
+ InlineFunctionExpansion="1"\r
+ PreprocessorDefinitions="NDEBUG;UNICODE;WIN32;_WIN32_IE=0x0600;_WIN32_WINNT=0x0501"\r
+ StringPooling="true"\r
+ RuntimeLibrary="0"\r
+ EnableFunctionLevelLinking="true"\r
+ RuntimeTypeInfo="true"\r
+ UsePrecompiledHeader="2"\r
+ PrecompiledHeaderThrough="precomp.h"\r
+ PrecompiledHeaderFile=".\WineRelease/explorer.pch"\r
+ AssemblerListingLocation=".\WineRelease/"\r
+ ObjectFile=".\WineRelease/"\r
+ ProgramDataBaseFileName=".\WineRelease/"\r
+ WarningLevel="3"\r
+ SuppressStartupBanner="true"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions="_DEBUG"\r
+ Culture="1031"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ AdditionalDependencies="shell32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib"\r
+ OutputFile="WineRelease/wexplorer.exe"\r
+ LinkIncremental="1"\r
+ SuppressStartupBanner="true"\r
+ DelayLoadDLLs="oleaut32.dll,wsock32.dll"\r
+ ProgramDatabaseFile=".\WineRelease/wexplorer.pdb"\r
+ SubSystem="2"\r
+ TargetMachine="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ AdditionalManifestFiles="explorer.exe.manifest"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ SuppressStartupBanner="true"\r
+ OutputFile=".\WineRelease/explorer.bsc"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebDeploymentTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="Debug Release|Win32"\r
+ OutputDirectory=".\DRelease"\r
+ IntermediateDirectory=".\DRelease"\r
+ ConfigurationType="1"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ TypeLibraryName=".\DRelease/explorer.tlb"\r
+ HeaderFileName=""\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ Optimization="2"\r
+ InlineFunctionExpansion="1"\r
+ PreprocessorDefinitions="NDEBUG;WIN32;_WIN32_IE=0x0600;_WIN32_WINNT=0x0501"\r
+ StringPooling="true"\r
+ RuntimeLibrary="2"\r
+ EnableFunctionLevelLinking="true"\r
+ RuntimeTypeInfo="true"\r
+ UsePrecompiledHeader="2"\r
+ PrecompiledHeaderThrough="precomp.h"\r
+ PrecompiledHeaderFile=".\DRelease/explorer.pch"\r
+ AssemblerListingLocation=".\DRelease/"\r
+ ObjectFile=".\DRelease/"\r
+ ProgramDataBaseFileName=".\DRelease/"\r
+ BrowseInformation="1"\r
+ WarningLevel="3"\r
+ SuppressStartupBanner="true"\r
+ DebugInformationFormat="3"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions="NDEBUG"\r
+ Culture="1031"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ AdditionalDependencies="shell32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib"\r
+ OutputFile=".\DRelease/explorer.exe"\r
+ LinkIncremental="1"\r
+ SuppressStartupBanner="true"\r
+ DelayLoadDLLs="oleaut32.dll,wsock32.dll"\r
+ GenerateDebugInformation="true"\r
+ ProgramDatabaseFile=".\DRelease/explorer.pdb"\r
+ SubSystem="2"\r
+ TargetMachine="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ AdditionalManifestFiles="explorer.exe.manifest"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ SuppressStartupBanner="true"\r
+ OutputFile=".\DRelease/explorer.bsc"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebDeploymentTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="Debug|Win32"\r
+ OutputDirectory=".\Debug"\r
+ IntermediateDirectory=".\Debug"\r
+ ConfigurationType="1"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ TypeLibraryName=".\Debug/explorer.tlb"\r
+ HeaderFileName=""\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ Optimization="0"\r
+ PreprocessorDefinitions="_DEBUG;WIN32;_WIN32_IE=0x0600;_WIN32_WINNT=0x0501,_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT"\r
+ MinimalRebuild="true"\r
+ BasicRuntimeChecks="3"\r
+ RuntimeLibrary="3"\r
+ RuntimeTypeInfo="true"\r
+ UsePrecompiledHeader="2"\r
+ PrecompiledHeaderThrough="precomp.h"\r
+ PrecompiledHeaderFile=".\Debug/explorer.pch"\r
+ AssemblerListingLocation=".\Debug/"\r
+ ObjectFile=".\Debug/"\r
+ ProgramDataBaseFileName=".\Debug/"\r
+ BrowseInformation="1"\r
+ WarningLevel="3"\r
+ SuppressStartupBanner="true"\r
+ DebugInformationFormat="4"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions="_DEBUG"\r
+ Culture="1031"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ AdditionalDependencies="shell32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib"\r
+ OutputFile=".\Debug/explorer.exe"\r
+ LinkIncremental="2"\r
+ SuppressStartupBanner="true"\r
+ AdditionalLibraryDirectories="Debug"\r
+ DelayLoadDLLs="oleaut32.dll,wsock32.dll"\r
+ GenerateDebugInformation="true"\r
+ ProgramDatabaseFile=".\Debug/explorer.pdb"\r
+ SubSystem="2"\r
+ TargetMachine="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ AdditionalManifestFiles="explorer.exe.manifest"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ SuppressStartupBanner="true"\r
+ OutputFile=".\Debug/explorer.bsc"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebDeploymentTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="Release|Win32"\r
+ OutputDirectory=".\Release"\r
+ IntermediateDirectory=".\Release"\r
+ ConfigurationType="1"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ TypeLibraryName=".\Release/explorer.tlb"\r
+ HeaderFileName=""\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ Optimization="1"\r
+ InlineFunctionExpansion="1"\r
+ PreprocessorDefinitions="NDEBUG;WIN32;_WIN32_IE=0x0600;_WIN32_WINNT=0x0501;_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES,_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT"\r
+ StringPooling="true"\r
+ RuntimeLibrary="2"\r
+ EnableFunctionLevelLinking="true"\r
+ RuntimeTypeInfo="true"\r
+ UsePrecompiledHeader="2"\r
+ PrecompiledHeaderThrough="precomp.h"\r
+ PrecompiledHeaderFile=".\Release/explorer.pch"\r
+ AssemblerListingLocation=".\Release/"\r
+ ObjectFile=".\Release/"\r
+ ProgramDataBaseFileName=".\Release/"\r
+ WarningLevel="3"\r
+ SuppressStartupBanner="true"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions="NDEBUG"\r
+ Culture="1031"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ AdditionalDependencies="shell32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib"\r
+ OutputFile=".\Release/explorer.exe"\r
+ LinkIncremental="1"\r
+ SuppressStartupBanner="true"\r
+ AdditionalLibraryDirectories="Release"\r
+ DelayLoadDLLs="oleaut32.dll,wsock32.dll"\r
+ ProgramDatabaseFile=".\Release/explorer.pdb"\r
+ SubSystem="2"\r
+ TargetMachine="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ AdditionalManifestFiles="explorer.exe.manifest"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ SuppressStartupBanner="true"\r
+ OutputFile=".\Release/explorer.bsc"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebDeploymentTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="WineDll|Win32"\r
+ OutputDirectory=".\WineDll"\r
+ IntermediateDirectory=".\WineDll"\r
+ ConfigurationType="1"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ TypeLibraryName=".\WineDll/explorer.tlb"\r
+ HeaderFileName=""\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ Optimization="2"\r
+ InlineFunctionExpansion="1"\r
+ PreprocessorDefinitions="NDEBUG;UNICODE;WIN32;_WIN32_IE=0x0600;_WIN32_WINNT=0x0501"\r
+ StringPooling="true"\r
+ RuntimeLibrary="2"\r
+ EnableFunctionLevelLinking="true"\r
+ RuntimeTypeInfo="true"\r
+ UsePrecompiledHeader="2"\r
+ PrecompiledHeaderThrough="precomp.h"\r
+ PrecompiledHeaderFile=".\WineDll/explorer.pch"\r
+ AssemblerListingLocation=".\WineDll/"\r
+ ObjectFile=".\WineDll/"\r
+ ProgramDataBaseFileName=".\WineDll/"\r
+ WarningLevel="3"\r
+ SuppressStartupBanner="true"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions="_DEBUG"\r
+ Culture="1031"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ AdditionalDependencies="shell32.lib advapi32.lib gdi32.lib user32.lib comctl32.lib"\r
+ OutputFile="WineDll/wexplorer.exe"\r
+ LinkIncremental="2"\r
+ SuppressStartupBanner="true"\r
+ DelayLoadDLLs="oleaut32.dll,wsock32.dll"\r
+ ProgramDatabaseFile=".\WineDll/wexplorer.pdb"\r
+ SubSystem="2"\r
+ TargetMachine="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ AdditionalManifestFiles="explorer.exe.manifest"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ SuppressStartupBanner="true"\r
+ OutputFile=".\WineDll/explorer.bsc"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebDeploymentTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ />\r
+ </Configuration>\r
+ </Configurations>\r
+ <References>\r
+ </References>\r
+ <Files>\r
+ <Filter\r
+ Name="utility"\r
+ >\r
+ <File\r
+ RelativePath="utility\dragdropimpl.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="utility\dragdropimpl.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="utility\shellbrowserimpl.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="utility\shellbrowserimpl.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="utility\shellclasses.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="utility\shellclasses.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="utility\treedroptarget.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="utility\utility.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="utility\utility.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="utility\window.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="utility\window.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="utility\xmlstorage.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="utility\xmlstorage.h"\r
+ >\r
+ </File>\r
+ </Filter>\r
+ <Filter\r
+ Name="resources"\r
+ Filter="bmp,ico"\r
+ >\r
+ <File\r
+ RelativePath="res\action.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\res\administration.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\appicon.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\apps.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\arrow.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\arrow_dwn.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\arrow_up.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\arrowsel.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\computer.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\config.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\res\control-panel.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\res\desktop-settings.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\documents.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\dot.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\dot_red.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\dot_trans.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\drivebar.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="explorer-cz.rc"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="explorer-de.rc"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="explorer-en.rc"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="explorer-es.rc"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="explorer-fr.rc"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="explorer-jp.rc"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="explorer-pt.rc"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="explorer-ro.rc"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="explorer-ru.rc"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="explorer-sv.rc"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="res\explorer.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="explorer_intres.rc"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="res\favorites.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\floating.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\folder.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\icoali10.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\icoalig0.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\icoalig1.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\icoalig2.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\icoalig3.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\icoalig4.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\icoalig5.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\icoalig6.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\icoalig7.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\icoalig8.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\icoalig9.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\images.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\info.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\logoff.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\logov.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\logov16.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\logov256.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\mdi.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\res\minimize.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\res\network-conns.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\network.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\notify_l.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\notify_r.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\printer.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\reactos.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\res\recent-documents.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="resource.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\ros-big.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\sdi.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\search-doc.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\search.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\res\shutdown.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\speaker.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\startmenu.ico"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="res\toolbar.bmp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\res\winefile.ico"\r
+ >\r
+ </File>\r
+ </Filter>\r
+ <Filter\r
+ Name="taskbar"\r
+ >\r
+ <File\r
+ RelativePath="taskbar\desktopbar.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="taskbar\desktopbar.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="taskbar\favorites.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="taskbar\favorites.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="notifyhook\notifyhook.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="taskbar\quicklaunch.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="taskbar\quicklaunch.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="taskbar\startmenu.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="taskbar\startmenu.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="taskbar\taskbar.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="taskbar\taskbar.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="taskbar\traynotify.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="taskbar\traynotify.h"\r
+ >\r
+ </File>\r
+ </Filter>\r
+ <Filter\r
+ Name="desktop"\r
+ >\r
+ <File\r
+ RelativePath="desktop\desktop.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="desktop\desktop.h"\r
+ >\r
+ </File>\r
+ </Filter>\r
+ <Filter\r
+ Name="doc"\r
+ >\r
+ <File\r
+ RelativePath="doc\changes.txt"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="doc\readme.txt"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="doc\TODO.txt"\r
+ >\r
+ </File>\r
+ </Filter>\r
+ <Filter\r
+ Name="shell"\r
+ >\r
+ <File\r
+ RelativePath="shell\entries.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\entries.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="shell\fatfs.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\fatfs.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="shell\filechild.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\filechild.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="shell\mainframe.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\mainframe.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="shell\ntobjfs.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\ntobjfs.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="shell\pane.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\pane.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="shell\regfs.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\regfs.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="shell\shellbrowser.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\shellbrowser.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="shell\shellfs.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\shellfs.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="shell\unixfs.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ ExcludedFromBuild="true"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\unixfs.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="shell\webchild.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\webchild.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="shell\winfs.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="shell\winfs.h"\r
+ >\r
+ </File>\r
+ </Filter>\r
+ <Filter\r
+ Name="dialogs"\r
+ >\r
+ <File\r
+ RelativePath="dialogs\searchprogram.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="dialogs\searchprogram.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="dialogs\settings.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="dialogs\settings.h"\r
+ >\r
+ </File>\r
+ </Filter>\r
+ <Filter\r
+ Name="main"\r
+ >\r
+ <File\r
+ RelativePath="explorer.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="explorer.exe.manifest"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="explorer.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="externals.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="globals.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="i386-stub-win32.c"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="precomp.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="1"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="1"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="1"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="1"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="1"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="1"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="1"\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="precomp.h"\r
+ >\r
+ </File>\r
+ </Filter>\r
+ <Filter\r
+ Name="services"\r
+ >\r
+ <File\r
+ RelativePath="services\shellservices.cpp"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="services\shellservices.h"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="services\startup.c"\r
+ >\r
+ <FileConfiguration\r
+ Name="Unicode Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Unicode Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineRelease|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="WineDll|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ UsePrecompiledHeader="0"\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ </Filter>\r
+ </Files>\r
+ <Globals>\r
+ </Globals>\r
+</VisualStudioProject>\r
--- /dev/null
+<module name="explorer" type="win32gui" installname="explorer.exe" allowwarnings ="true">
+ <linkerflag>-luuid</linkerflag>
+ <linkerflag>-lstdc++</linkerflag>
+ <linkerflag>-fexceptions</linkerflag>
+ <include base="explorer">.</include>
+ <define name="__USE_W32API" />
+ <define name="UNICODE" />
+ <define name="WIN32" />
+ <define name="_ROS_" />
+ <define name="_WIN32_IE">0x0600</define>
+ <define name="_WIN32_WINNT">0x0501</define>
+ <define name="WINVER">0x0500</define>
+ <define name="__WINDRES__" />
+ <library>kernel32</library>
+ <library>gdi32</library>
+ <library>user32</library>
+ <library>ws2_32</library>
+ <library>msimg32</library>
+ <library>comctl32</library>
+ <library>ole32</library>
+ <library>oleaut32</library>
+ <library>shell32</library>
+ <library>expat</library>
+ <library>notifyhook</library>
+ <pch>precomp.h</pch>
+ <directory name="desktop">
+ <file>desktop.cpp</file>
+ </directory>
+ <directory name="dialogs">
+ <file>searchprogram.cpp</file>
+ <file>settings.cpp</file>
+ </directory>
+ <directory name="shell">
+ <file>entries.cpp</file>
+ <file>fatfs.cpp</file>
+ <file>filechild.cpp</file>
+ <file>shellfs.cpp</file>
+ <file>mainframe.cpp</file>
+ <file>ntobjfs.cpp</file>
+ <file>pane.cpp</file>
+ <file>regfs.cpp</file>
+ <file>shellbrowser.cpp</file>
+ <file>unixfs.cpp</file>
+ <file>webchild.cpp</file>
+ <file>winfs.cpp</file>
+ </directory>
+ <directory name="services">
+ <file>shellservices.cpp</file>
+ <file>startup.c</file>
+ </directory>
+ <directory name="taskbar">
+ <file>desktopbar.cpp</file>
+ <file>favorites.cpp</file>
+ <file>taskbar.cpp</file>
+ <file>startmenu.cpp</file>
+ <file>traynotify.cpp</file>
+ <file>quicklaunch.cpp</file>
+ </directory>
+ <directory name="utility">
+ <file>shellclasses.cpp</file>
+ <file>utility.cpp</file>
+ <file>window.cpp</file>
+ <file>dragdropimpl.cpp</file>
+ <file>shellbrowserimpl.cpp</file>
+ <file>xmlstorage.cpp</file>
+ </directory>
+ <file>explorer.cpp</file>
+ <file>i386-stub-win32.c</file>
+ <file>explorer.rc</file>
+</module>
+<installfile base=".">explorer-cfg-template.xml</installfile>
+<directory name="notifyhook">
+ <xi:include href="notifyhook/notifyhook.xml" />
+</directory>
--- /dev/null
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include <windows.h>
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Neutral resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)
+#ifdef _WIN32
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDB_DRIVEBAR BITMAP MOVEABLE PURE "res/drivebar.bmp"
+IDB_LOGOV BITMAP MOVEABLE PURE "res/logov.bmp"
+IDB_LOGOV256 BITMAP MOVEABLE PURE "res/logov256.bmp"
+IDB_LOGOV16 BITMAP MOVEABLE PURE "res/logov16.bmp"
+IDB_ICON_ALIGN_0 BITMAP MOVEABLE PURE "res/icoalig0.bmp"
+IDB_ICON_ALIGN_1 BITMAP MOVEABLE PURE "res/icoalig1.bmp"
+IDB_ICON_ALIGN_2 BITMAP MOVEABLE PURE "res/icoalig2.bmp"
+IDB_ICON_ALIGN_3 BITMAP MOVEABLE PURE "res/icoalig3.bmp"
+IDB_ICON_ALIGN_4 BITMAP MOVEABLE PURE "res/icoalig4.bmp"
+IDB_ICON_ALIGN_5 BITMAP MOVEABLE PURE "res/icoalig5.bmp"
+IDB_ICON_ALIGN_6 BITMAP MOVEABLE PURE "res/icoalig6.bmp"
+IDB_ICON_ALIGN_7 BITMAP MOVEABLE PURE "res/icoalig7.bmp"
+IDB_ICON_ALIGN_8 BITMAP MOVEABLE PURE "res/icoalig8.bmp"
+IDB_ICON_ALIGN_9 BITMAP MOVEABLE PURE "res/icoalig9.bmp"
+IDB_ICON_ALIGN_10 BITMAP MOVEABLE PURE "res/icoali10.bmp"
+IDB_MDI BITMAP MOVEABLE PURE "res/mdi.bmp"
+IDB_SDI BITMAP MOVEABLE PURE "res/sdi.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDA_EXPLORER ACCELERATORS MOVEABLE PURE
+BEGIN
+ "X", ID_FILE_EXIT, VIRTKEY, ALT, NOINVERT
+ "S", ID_VIEW_FULLSCREEN, VIRTKEY, SHIFT, CONTROL,
+ NOINVERT
+END
+
+IDA_SEARCH_PROGRAM ACCELERATORS MOVEABLE PURE
+BEGIN
+ VK_F5, ID_REFRESH, VIRTKEY, NOINVERT
+END
+
+IDA_TRAYNOTIFY ACCELERATORS MOVEABLE PURE
+BEGIN
+ VK_F5, ID_REFRESH, VIRTKEY, NOINVERT
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "#include <windows.h>\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "#ifndef ROSSHELL\r\n"
+ "IDB_IMAGES BITMAP DISCARDABLE ""res/images.bmp""\r\n"
+ "IDB_TOOLBAR BITMAP DISCARDABLE ""res/toolbar.bmp""\r\n"
+ "#endif\r\n"
+ "#ifndef _ROS_\r\n"
+ "LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL\r\n"
+ "STRINGTABLE DISCARDABLE \r\n"
+ "BEGIN\r\n"
+ "IDS_VERSION_STR """"\r\n"
+ "#ifdef UNICODE\r\n"
+ "IDS_EXPLORER_VERSION_STR ""ROS Explorer%0s""\r\n"
+ "#else\r\n"
+ "IDS_EXPLORER_VERSION_STR ""ROS Explorer Ansi%0s""\r\n"
+ "#endif\r\n"
+ "END\r\n"
+ "#endif\r\n"
+ "#ifndef _DEBUG\r\n"
+ "CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST DISCARDABLE PURE ""explorer.exe.manifest""\r\n"
+ "#endif\r\n"
+ "\r\n"
+ "#include ""explorer-en.rc""\r\n"
+ "#include ""explorer-de.rc""\r\n"
+ "#include ""explorer-es.rc""\r\n"
+ "#include ""explorer-sv.rc""\r\n"
+ "#include ""explorer-pl.rc""\r\n"
+ "#include ""explorer-pt.rc""\r\n"
+ "#include ""explorer-cz.rc""\r\n"
+ "#include ""explorer-ro.rc""\r\n"
+ "#include ""explorer-ru.rc""\r\n"
+ "#include ""explorer-jp.rc""\r\n"
+ "#include ""explorer-hu.rc""\r\n"
+ "#include ""explorer-uk.rc""\r\n"
+ "\r\n"
+ "#ifndef __WINDRES__\r\n"
+ "#include ""explorer-cn.rc""\r\n"
+ "#endif\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_REACTOS ICON DISCARDABLE "res/reactos.ico"
+IDI_EXPLORER ICON DISCARDABLE "res/explorer.ico"
+IDI_STARTMENU ICON DISCARDABLE "res/startmenu.ico"
+IDI_LOGOFF ICON DISCARDABLE "res/logoff.ico"
+IDI_SHUTDOWN ICON DISCARDABLE "res/shutdown.ico"
+IDI_ARROW ICON DISCARDABLE "res/arrow.ico"
+IDI_ARROW_SELECTED ICON DISCARDABLE "res/arrowsel.ico"
+IDI_APPICON ICON DISCARDABLE "res/appicon.ico"
+IDI_FLOATING ICON DISCARDABLE "res/floating.ico"
+IDI_REACTOS_BIG ICON DISCARDABLE "res/ros-big.ico"
+IDI_CONFIG ICON DISCARDABLE "res/config.ico"
+IDI_DOCUMENTS ICON DISCARDABLE "res/documents.ico"
+IDI_FAVORITES ICON DISCARDABLE "res/favorites.ico"
+IDI_INFO ICON DISCARDABLE "res/info.ico"
+IDI_APPS ICON DISCARDABLE "res/apps.ico"
+IDI_SEARCH ICON DISCARDABLE "res/search.ico"
+IDI_ACTION ICON DISCARDABLE "res/action.ico"
+IDI_FOLDER ICON DISCARDABLE "res/folder.ico"
+IDI_SEARCH_DOC ICON DISCARDABLE "res/search-doc.ico"
+IDI_PRINTER ICON DISCARDABLE "res/printer.ico"
+IDI_NETWORK ICON DISCARDABLE "res/network.ico"
+IDI_COMPUTER ICON DISCARDABLE "res/computer.ico"
+IDI_SPEAKER ICON DISCARDABLE "res/speaker.ico"
+IDI_DOT ICON DISCARDABLE "res/dot.ico"
+IDI_DOT_TRANS ICON DISCARDABLE "res/dot_trans.ico"
+IDI_DOT_RED ICON DISCARDABLE "res/dot_red.ico"
+IDI_ARROW_UP ICON DISCARDABLE "res/arrow_up.ico"
+IDI_ARROW_DOWN ICON DISCARDABLE "res/arrow_dwn.ico"
+IDI_NOTIFY_L ICON DISCARDABLE "res/notify_l.ico"
+IDI_NOTIFY_R ICON DISCARDABLE "res/notify_r.ico"
+IDI_MINIMIZE ICON DISCARDABLE "res/minimize.ico"
+IDI_CONTROLPAN ICON DISCARDABLE "res/control-panel.ico"
+IDI_DESKSETTING ICON DISCARDABLE "res/desktop-settings.ico"
+IDI_NETCONNS ICON DISCARDABLE "res/network-conns.ico"
+IDI_ADMIN ICON DISCARDABLE "res/administration.ico"
+IDI_RECENT ICON DISCARDABLE "res/recent-documents.ico"
+#endif // Neutral resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+#ifndef ROSSHELL
+IDB_IMAGES BITMAP DISCARDABLE "res/images.bmp"
+IDB_TOOLBAR BITMAP DISCARDABLE "res/toolbar.bmp"
+#endif
+#ifndef _ROS_
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+STRINGTABLE DISCARDABLE
+BEGIN
+IDS_VERSION_STR ""
+#ifdef UNICODE
+IDS_EXPLORER_VERSION_STR "ROS Explorer%0s"
+#else
+IDS_EXPLORER_VERSION_STR "ROS Explorer Ansi%0s"
+#endif
+END
+#endif
+#ifndef _DEBUG
+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST DISCARDABLE PURE "explorer.exe.manifest"
+#endif
+
+#include "explorer-en.rc"
+#include "explorer-de.rc"
+#include "explorer-es.rc"
+#include "explorer-sv.rc"
+#include "explorer-pl.rc"
+#include "explorer-pt.rc"
+#include "explorer-cz.rc"
+#include "explorer-ro.rc"
+#include "explorer-ru.rc"
+#include "explorer-jp.rc"
+#include "explorer-hu.rc"
+#include "explorer-uk.rc"
+
+#ifndef __WINDRES__
+#include "explorer-cn.rc"
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // externals.h
+ //
+ // Martin Fuchs, 07.06.2003
+ //
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+ // explorer main routine
+extern int explorer_main(HINSTANCE hinstance, LPTSTR lpCmdLine, int cmdshow);
+
+ // display explorer/file manager window
+extern void explorer_show_frame(int cmdshow, LPTSTR lpCmdLine=NULL);
+
+ // display explorer "About" dialog
+extern void explorer_about(HWND hwndParent);
+
+ // test for already running desktop instance
+extern BOOL IsAnyDesktopRunning();
+
+ // show shutdown dialog
+extern void ShowExitWindowsDialog(HWND hwndOwner);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // globals.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#include "utility/xmlstorage.h"
+
+using namespace XMLStorage;
+
+#include "taskbar/favorites.h"
+
+
+ /// management of file types
+struct FileTypeInfo {
+ String _classname;
+ String _displayname;
+ bool _neverShowExt;
+};
+
+struct FileTypeManager : public map<String, FileTypeInfo>
+{
+ typedef map<String, FileTypeInfo> super;
+
+ const FileTypeInfo& operator[](String ext);
+
+ static bool is_exe_file(LPCTSTR ext);
+
+ LPCTSTR set_type(struct Entry* entry, bool dont_hide_ext=false);
+};
+
+
+enum ICON_TYPE {
+ IT_STATIC,
+ IT_CACHED,
+ IT_DYNAMIC,
+ IT_SYSCACHE
+};
+
+enum ICON_ID {
+ ICID_UNKNOWN,
+ ICID_NONE,
+
+ ICID_FOLDER,
+ //ICID_DOCUMENT,
+ ICID_APP,
+ ICID_EXPLORER,
+
+ ICID_CONFIG,
+ ICID_DOCUMENTS,
+ ICID_FAVORITES,
+ ICID_INFO,
+ ICID_APPS,
+ ICID_SEARCH,
+ ICID_ACTION,
+ ICID_SEARCH_DOC,
+ ICID_PRINTER,
+ ICID_NETWORK,
+ ICID_COMPUTER,
+ ICID_LOGOFF,
+ ICID_SHUTDOWN,
+ ICID_BOOKMARK,
+ ICID_MINIMIZE,
+ ICID_CONTROLPAN,
+ ICID_DESKSETTING,
+ ICID_NETCONNS,
+ ICID_ADMIN,
+ ICID_RECENT,
+
+ ICID_DYNAMIC
+};
+
+struct Icon {
+ Icon();
+ Icon(ICON_ID id, UINT nid);
+ Icon(ICON_ID id, UINT nid, int icon_size);
+ Icon(ICON_TYPE itype, int id, HICON hIcon);
+ Icon(ICON_TYPE itype, int id, int sys_idx);
+
+ operator ICON_ID() const {return _id;}
+
+ void draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const;
+ HBITMAP create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const;
+ int add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color=GetSysColor(COLOR_WINDOW), HBRUSH bk_brush=GetSysColorBrush(COLOR_WINDOW)) const;
+
+ int get_sysiml_idx() const {return _itype==IT_SYSCACHE? _sys_idx: -1;}
+ HICON get_hicon() const {return _itype!=IT_SYSCACHE? _hicon: 0;}
+
+ bool destroy() {if (_itype == IT_DYNAMIC) {DestroyIcon(_hicon); return true;} else return false;}
+
+protected:
+ ICON_ID _id;
+ ICON_TYPE _itype;
+ HICON _hicon;
+ int _sys_idx;
+};
+
+struct SysCacheIcon : public Icon {
+ SysCacheIcon(int id, int sys_idx)
+ : Icon(IT_SYSCACHE, id, sys_idx) {}
+};
+
+struct IconCache {
+ IconCache() : _himlSys_small(0) {}
+
+ void init();
+
+ const Icon& extract(LPCTSTR path, ICONCACHE_FLAGS flags=ICF_NORMAL);
+ const Icon& extract(LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags=ICF_HICON);
+ const Icon& extract(IExtractIcon* pExtract, LPCTSTR path, int icon_idx, ICONCACHE_FLAGS flags=ICF_HICON);
+
+ const Icon& add(HICON hIcon, ICON_TYPE type=IT_DYNAMIC);
+ const Icon& add(int sys_idx/*, ICON_TYPE type=IT_SYSCACHE*/);
+
+ const Icon& get_icon(int icon_id);
+
+ HIMAGELIST get_sys_imagelist() const {return _himlSys_small;}
+
+ void free_icon(int icon_id);
+
+protected:
+ static int s_next_id;
+
+ typedef map<int, Icon> IconMap;
+ IconMap _icons;
+
+ typedef pair<String,int/*ICONCACHE_FLAGS*/> CacheKey;
+ typedef map<CacheKey, ICON_ID> PathCacheMap;
+ PathCacheMap _pathCache;
+
+ typedef pair<String,pair<int,int/*ICONCACHE_FLAGS*/> > IdxCacheKey;
+ typedef map<IdxCacheKey, ICON_ID> IdxCacheMap;
+ IdxCacheMap _idxCache;
+
+ HIMAGELIST _himlSys_small;
+};
+
+
+#define ICON_SIZE_SMALL 16 // GetSystemMetrics(SM_CXSMICON)
+#define ICON_SIZE_MIDDLE 24 // special size for start menu root icons
+#define ICON_SIZE_LARGE 32 // GetSystemMetrics(SM_CXICON)
+
+#define STARTMENUROOT_ICON_SIZE ICON_SIZE_MIDDLE // ICON_SIZE_LARGE
+
+#define ICON_SIZE_FROM_ICF(flags) (flags&ICF_LARGE? ICON_SIZE_LARGE: flags&ICF_MIDDLE? ICON_SIZE_MIDDLE: ICON_SIZE_SMALL)
+#define ICF_FROM_ICON_SIZE(size) (size>=ICON_SIZE_LARGE? ICF_LARGE: size>=ICON_SIZE_MIDDLE? ICF_MIDDLE: ICF_NORMAL)
+
+
+ /// create a bitmap from an icon
+extern HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd/*, int icon_size*/);
+
+ /// add icon with alpha channel to imagelist using the specified background color
+extern int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd);
+
+ /// retrieve icon from window
+extern HICON get_window_icon_small(HWND hwnd);
+extern HICON get_window_icon_big(HWND hwnd, bool allow_from_class=true);
+
+
+ /// desktop management
+#ifdef _USE_HDESK
+
+typedef auto_ptr<struct DesktopThread> DesktopThreadPtr;
+
+struct Desktop
+{
+ HDESK _hdesktop;
+// HWINSTA _hwinsta;
+ DesktopThreadPtr _pThread;
+ WindowHandle _hwndDesktop;
+
+ Desktop(HDESK hdesktop=0/*, HWINSTA hwinsta=0*/);
+ ~Desktop();
+};
+
+typedef auto_ptr<Desktop> DesktopPtr;
+typedef DesktopPtr DesktopRef;
+
+ /// Thread class for additional desktops
+struct DesktopThread : public Thread
+{
+ DesktopThread(Desktop& desktop)
+ : _desktop(desktop)
+ {
+ }
+
+ int Run();
+
+protected:
+ Desktop& _desktop;
+};
+
+#else
+
+typedef pair<HWND, DWORD> MinimizeStruct;
+
+struct Desktop
+{
+ set<HWND> _windows;
+ WindowHandle _hwndForeground;
+ list<MinimizeStruct> _minimized;
+};
+typedef Desktop DesktopRef;
+
+#endif
+
+
+#define DESKTOP_COUNT 4
+
+struct Desktops : public vector<DesktopRef>
+{
+ Desktops();
+ ~Desktops();
+
+ void init();
+ void SwitchToDesktop(int idx);
+ void ToggleMinimize();
+
+#ifdef _USE_HDESK
+ DesktopRef& get_current_Desktop() {return (*this)[_current_desktop];}
+#endif
+
+ int _current_desktop;
+};
+
+
+ /// structure containing global variables of Explorer
+extern struct ExplorerGlobals
+{
+ ExplorerGlobals();
+
+ void init(HINSTANCE hInstance);
+
+ void read_persistent();
+ void write_persistent();
+
+ XMLPos get_cfg();
+ XMLPos get_cfg(const char* path);
+
+ HINSTANCE _hInstance;
+ UINT _cfStrFName;
+
+#ifndef ROSSHELL
+ ATOM _hframeClass;
+ HWND _hMainWnd;
+ bool _desktop_mode;
+ bool _prescan_nodes;
+#endif
+
+ FILE* _log;
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ DWORD(STDAPICALLTYPE* _SHRestricted)(RESTRICTIONS);
+#endif
+
+ FileTypeManager _ftype_mgr;
+ IconCache _icon_cache;
+
+ HWND _hwndDesktopBar;
+ HWND _hwndShellView;
+ HWND _hwndDesktop;
+
+ Desktops _desktops;
+
+ XMLDoc _cfg;
+ String _cfg_dir;
+ String _cfg_path;
+
+ Favorites _favorites;
+ String _favorites_path;
+} g_Globals;
+
+
+ /// convenient loading of string resources
+struct ResString : public String
+{
+ ResString(UINT nid);
+};
+
+ /// convenient loading of standard (32x32) icon resources
+struct ResIcon
+{
+ ResIcon(UINT nid);
+
+ operator HICON() const {return _hicon;}
+
+protected:
+ HICON _hicon;
+};
+
+ /// convenient loading of small (16x16) icon resources
+struct SmallIcon
+{
+ SmallIcon(UINT nid);
+
+ operator HICON() const {return _hicon;}
+
+protected:
+ HICON _hicon;
+};
+
+ /// convenient loading of icon resources with specified sizes
+struct ResIconEx
+{
+ ResIconEx(UINT nid, int w, int h);
+
+ operator HICON() const {return _hicon;}
+
+protected:
+ HICON _hicon;
+};
+
+ /// set big and small icons out of the resources for a window
+extern void SetWindowIcon(HWND hwnd, UINT nid);
+
+ /// convenient loading of bitmap resources
+struct ResBitmap
+{
+ ResBitmap(UINT nid);
+ ~ResBitmap() {DeleteObject(_hBmp);}
+
+ operator HBITMAP() const {return _hBmp;}
+
+protected:
+ HBITMAP _hBmp;
+};
--- /dev/null
+/****************************************************************************
+
+ THIS SOFTWARE IS NOT COPYRIGHTED
+
+ HP offers the following for use in the public domain. HP makes no
+ warranty with regard to the software or it's performance and the
+ user accepts the software "AS IS" with all faults.
+
+ HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD
+ TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+****************************************************************************/
+
+/****************************************************************************
+ * Header: remcom.c,v 1.34 91/03/09 12:29:49 glenne Exp $
+ *
+ * Module name: remcom.c $
+ * Revision: 1.34 $
+ * Date: 91/03/09 12:29:49 $
+ * Contributor: Lake Stevens Instrument Division$
+ *
+ * Description: low level support for gdb debugger. $
+ *
+ * Considerations: only works on target hardware $
+ *
+ * Written by: Glenn Engel $
+ * ModuleState: Experimental $
+ *
+ * NOTES: See Below $
+ *
+ * Modified for 386 by Jim Kingdon, Cygnus Support.
+ *
+ * To enable debugger support, two things need to happen. One, a
+ * call to set_debug_traps() is necessary in order to allow any breakpoints
+ * or error conditions to be properly intercepted and reported to gdb.
+ * Two, a breakpoint needs to be generated to begin communication. This
+ * is most easily accomplished by a call to breakpoint(). Breakpoint()
+ * simulates a breakpoint by executing a trap #1.
+ *
+ * The external function exceptionHandler() is
+ * used to attach a specific handler to a specific 386 vector number.
+ * It should use the same privilege level it runs at. It should
+ * install it as an interrupt gate so that interrupts are masked
+ * while the handler runs.
+ *
+ * Because gdb will sometimes write to the stack area to execute function
+ * calls, this program cannot rely on using the supervisor stack so it
+ * uses it's own stack area reserved in the int array remcomStack.
+ *
+ *************
+ *
+ * The following gdb commands are supported:
+ *
+ * command function Return value
+ *
+ * g return the value of the CPU registers hex data or ENN
+ * G set the value of the CPU registers OK or ENN
+ *
+ * mAA..AA,LLLL Read LLLL bytes at address AA..AA hex data or ENN
+ * MAA..AA,LLLL: Write LLLL bytes at address AA.AA OK or ENN
+ *
+ * c Resume at current address SNN ( signal NN)
+ * cAA..AA Continue at address AA..AA SNN
+ *
+ * s Step one instruction SNN
+ * sAA..AA Step one instruction from AA..AA SNN
+ *
+ * k kill
+ *
+ * ? What was the last sigval ? SNN (signal NN)
+ *
+ * All commands and responses are sent with a packet which includes a
+ * checksum. A packet consists of
+ *
+ * $<packet info>#<checksum>.
+ *
+ * where
+ * <packet info> :: <characters representing the command or response>
+ * <checksum> :: < two hex digits computed as modulo 256 sum of <packetinfo>>
+ *
+ * When a packet is received, it is first acknowledged with either '+' or '-'.
+ * '+' indicates a successful transfer. '-' indicates a failed transfer.
+ *
+ * Example:
+ *
+ * Host: Reply:
+ * $m0,10#2a +$00010203040506070809101112131415#42
+ *
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+
+#include "utility/utility.h" // for strcpy_s()
+
+/************************************************************************
+ *
+ * external low-level support routines
+ */
+
+extern void putDebugChar(); /* write a single character */
+extern int getDebugChar(); /* read and return a single char */
+extern void exceptionHandler(); /* assign an exception handler */
+
+/************************************************************************/
+/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
+/* at least NUMREGBYTES*2 are needed for register packets */
+#define BUFMAX 400
+
+static char initialized; /* boolean flag. != 0 means we've been initialized */
+
+int remote_debug;
+/* debug > 0 prints ill-formed commands in valid packets & checksum errors */
+
+static const char hexchars[]="0123456789abcdef";
+
+/* Number of registers. */
+#define NUMREGS 16
+
+/* Number of bytes of registers. */
+#define NUMREGBYTES (NUMREGS * 4)
+
+enum regnames {EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI,
+ PC /* also known as eip */,
+ PS /* also known as eflags */,
+ CS, SS, DS, ES, FS, GS};
+
+/*
+ * these should not be static cuz they can be used outside this module
+ */
+int registers[NUMREGS];
+
+#ifndef WIN32 //MF
+
+#define STACKSIZE 10000
+int remcomStack[STACKSIZE/sizeof(int)];
+static int* stackPtr = &remcomStack[STACKSIZE/sizeof(int) - 1];
+
+/*************************** ASSEMBLY CODE MACROS *************************/
+/* */
+
+extern void
+return_to_prog ();
+
+/* Restore the program's registers (including the stack pointer, which
+ means we get the right stack and don't have to worry about popping our
+ return address and any stack frames and so on) and return. */
+asm(".text");
+asm(".globl _return_to_prog");
+asm("_return_to_prog:");
+asm(" movw _registers+44, %ss");
+asm(" movl _registers+16, %esp");
+asm(" movl _registers+4, %ecx");
+asm(" movl _registers+8, %edx");
+asm(" movl _registers+12, %ebx");
+asm(" movl _registers+20, %ebp");
+asm(" movl _registers+24, %esi");
+asm(" movl _registers+28, %edi");
+asm(" movw _registers+48, %ds");
+asm(" movw _registers+52, %es");
+asm(" movw _registers+56, %fs");
+asm(" movw _registers+60, %gs");
+asm(" movl _registers+36, %eax");
+asm(" pushl %eax"); /* saved eflags */
+asm(" movl _registers+40, %eax");
+asm(" pushl %eax"); /* saved cs */
+asm(" movl _registers+32, %eax");
+asm(" pushl %eax"); /* saved eip */
+asm(" movl _registers, %eax");
+
+asm("ret"); //MF
+
+/* use iret to restore pc and flags together so
+ that trace flag works right. */
+asm(" iret");
+
+
+#ifdef WIN32 //MF
+asm(".data"); //MF
+#endif
+
+/* Put the error code here just in case the user cares. */
+int gdb_i386errcode;
+/* Likewise, the vector number here (since GDB only gets the signal
+ number through the usual means, and that's not very specific). */
+int gdb_i386vector = -1;
+
+/* GDB stores segment registers in 32-bit words (that's just the way
+ m-i386v.h is written). So zero the appropriate areas in registers. */
+#define SAVE_REGISTERS1() \
+ asm ("movl %eax, _registers"); \
+ asm ("movl %ecx, _registers+4"); \
+ asm ("movl %edx, _registers+8"); \
+ asm ("movl %ebx, _registers+12"); \
+ asm ("movl %ebp, _registers+20"); \
+ asm ("movl %esi, _registers+24"); \
+ asm ("movl %edi, _registers+28"); \
+ asm ("movw $0, %ax"); \
+ asm ("movw %ds, _registers+48"); \
+ asm ("movw %ax, _registers+50"); \
+ asm ("movw %es, _registers+52"); \
+ asm ("movw %ax, _registers+54"); \
+ asm ("movw %fs, _registers+56"); \
+ asm ("movw %ax, _registers+58"); \
+ asm ("movw %gs, _registers+60"); \
+ asm ("movw %ax, _registers+62");
+#define SAVE_ERRCODE() \
+ asm ("popl %ebx"); \
+ asm ("movl %ebx, _gdb_i386errcode");
+#define SAVE_REGISTERS2() \
+ asm ("popl %ebx"); /* old eip */ \
+ asm ("movl %ebx, _registers+32"); \
+ asm ("popl %ebx"); /* old cs */ \
+ asm ("movl %ebx, _registers+40"); \
+ asm ("movw %ax, _registers+42"); \
+ asm ("popl %ebx"); /* old eflags */ \
+ asm ("movl %ebx, _registers+36"); \
+ /* Now that we've done the pops, we can save the stack pointer."); */ \
+ asm ("movw %ss, _registers+44"); \
+ asm ("movw %ax, _registers+46"); \
+ asm ("movl %esp, _registers+16");
+
+/* See if mem_fault_routine is set, if so just IRET to that address. */
+#define CHECK_FAULT() \
+ asm ("cmpl $0, _mem_fault_routine"); \
+ asm ("jne mem_fault");
+
+asm (".text");
+asm ("mem_fault:");
+/* OK to clobber temp registers; we're just going to end up in set_mem_err. */
+/* Pop error code from the stack and save it. */
+asm (" popl %eax");
+asm (" movl %eax, _gdb_i386errcode");
+
+asm (" popl %eax"); /* eip */
+/* We don't want to return there, we want to return to the function
+ pointed to by mem_fault_routine instead. */
+asm (" movl _mem_fault_routine, %eax");
+asm (" popl %ecx"); /* cs (low 16 bits; junk in hi 16 bits). */
+asm (" popl %edx"); /* eflags */
+
+/* Remove this stack frame; when we do the iret, we will be going to
+ the start of a function, so we want the stack to look just like it
+ would after a "call" instruction. */
+asm (" leave");
+
+/* Push the stuff that iret wants. */
+asm (" pushl %edx"); /* eflags */
+asm (" pushl %ecx"); /* cs */
+asm (" pushl %eax"); /* eip */
+
+/* Zero mem_fault_routine. */
+asm (" movl $0, %eax");
+asm (" movl %eax, _mem_fault_routine");
+
+asm ("iret");
+
+
+#define CALL_HOOK() asm("call _remcomHandler");
+
+/* This function is called when a i386 exception occurs. It saves
+ * all the cpu regs in the _registers array, munges the stack a bit,
+ * and invokes an exception handler (remcom_handler).
+ *
+ * stack on entry: stack on exit:
+ * old eflags vector number
+ * old cs (zero-filled to 32 bits)
+ * old eip
+ *
+ */
+extern void _catchException3();
+asm(".text");
+asm(".globl __catchException3");
+asm("__catchException3:");
+SAVE_REGISTERS1();
+SAVE_REGISTERS2();
+asm ("pushl $3");
+CALL_HOOK();
+
+/* Same thing for exception 1. */
+extern void _catchException1();
+asm(".text");
+asm(".globl __catchException1");
+asm("__catchException1:");
+SAVE_REGISTERS1();
+SAVE_REGISTERS2();
+asm ("pushl $1");
+CALL_HOOK();
+
+/* Same thing for exception 0. */
+extern void _catchException0();
+asm(".text");
+asm(".globl __catchException0");
+asm("__catchException0:");
+SAVE_REGISTERS1();
+SAVE_REGISTERS2();
+asm ("pushl $0");
+CALL_HOOK();
+
+/* Same thing for exception 4. */
+extern void _catchException4();
+asm(".text");
+asm(".globl __catchException4");
+asm("__catchException4:");
+SAVE_REGISTERS1();
+SAVE_REGISTERS2();
+asm ("pushl $4");
+CALL_HOOK();
+
+/* Same thing for exception 5. */
+extern void _catchException5();
+asm(".text");
+asm(".globl __catchException5");
+asm("__catchException5:");
+SAVE_REGISTERS1();
+SAVE_REGISTERS2();
+asm ("pushl $5");
+CALL_HOOK();
+
+/* Same thing for exception 6. */
+extern void _catchException6();
+asm(".text");
+asm(".globl __catchException6");
+asm("__catchException6:");
+SAVE_REGISTERS1();
+SAVE_REGISTERS2();
+asm ("pushl $6");
+CALL_HOOK();
+
+/* Same thing for exception 7. */
+extern void _catchException7();
+asm(".text");
+asm(".globl __catchException7");
+asm("__catchException7:");
+SAVE_REGISTERS1();
+SAVE_REGISTERS2();
+asm ("pushl $7");
+CALL_HOOK();
+
+/* Same thing for exception 8. */
+extern void _catchException8();
+asm(".text");
+asm(".globl __catchException8");
+asm("__catchException8:");
+SAVE_REGISTERS1();
+SAVE_ERRCODE();
+SAVE_REGISTERS2();
+asm ("pushl $8");
+CALL_HOOK();
+
+/* Same thing for exception 9. */
+extern void _catchException9();
+asm(".text");
+asm(".globl __catchException9");
+asm("__catchException9:");
+SAVE_REGISTERS1();
+SAVE_REGISTERS2();
+asm ("pushl $9");
+CALL_HOOK();
+
+/* Same thing for exception 10. */
+extern void _catchException10();
+asm(".text");
+asm(".globl __catchException10");
+asm("__catchException10:");
+SAVE_REGISTERS1();
+SAVE_ERRCODE();
+SAVE_REGISTERS2();
+asm ("pushl $10");
+CALL_HOOK();
+
+/* Same thing for exception 12. */
+extern void _catchException12();
+asm(".text");
+asm(".globl __catchException12");
+asm("__catchException12:");
+SAVE_REGISTERS1();
+SAVE_ERRCODE();
+SAVE_REGISTERS2();
+asm ("pushl $12");
+CALL_HOOK();
+
+/* Same thing for exception 16. */
+extern void _catchException16();
+asm(".text");
+asm(".globl __catchException16");
+asm("__catchException16:");
+SAVE_REGISTERS1();
+SAVE_REGISTERS2();
+asm ("pushl $16");
+CALL_HOOK();
+
+/* For 13, 11, and 14 we have to deal with the CHECK_FAULT stuff. */
+
+/* Same thing for exception 13. */
+extern void _catchException13 ();
+asm (".text");
+asm (".globl __catchException13");
+asm ("__catchException13:");
+CHECK_FAULT();
+SAVE_REGISTERS1();
+SAVE_ERRCODE();
+SAVE_REGISTERS2();
+asm ("pushl $13");
+CALL_HOOK();
+
+/* Same thing for exception 11. */
+extern void _catchException11 ();
+asm (".text");
+asm (".globl __catchException11");
+asm ("__catchException11:");
+CHECK_FAULT();
+SAVE_REGISTERS1();
+SAVE_ERRCODE();
+SAVE_REGISTERS2();
+asm ("pushl $11");
+CALL_HOOK();
+
+/* Same thing for exception 14. */
+extern void _catchException14 ();
+asm (".text");
+asm (".globl __catchException14");
+asm ("__catchException14:");
+CHECK_FAULT();
+SAVE_REGISTERS1();
+SAVE_ERRCODE();
+SAVE_REGISTERS2();
+asm ("pushl $14");
+CALL_HOOK();
+
+/*
+ * remcomHandler is a front end for handle_exception. It moves the
+ * stack pointer into an area reserved for debugger use.
+ */
+asm("_remcomHandler:");
+asm(" popl %eax"); /* pop off return address */
+asm(" popl %eax"); /* get the exception number */
+asm(" movl _stackPtr, %esp"); /* move to remcom stack area */
+asm(" pushl %eax"); /* push exception onto stack */
+asm(" call _handle_exception"); /* this never returns */
+
+
+void
+_returnFromException ()
+{
+ return_to_prog ();
+}
+
+#endif // !WIN32
+
+
+#ifdef _MSC_VER //MF
+#define BREAKPOINT() __asm int 3;
+#else
+#define BREAKPOINT() asm(" int $3");
+#endif
+
+
+#ifdef WIN32 //MF
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+void handle_exception(int exceptionVector);
+
+void win32_exception_handler(EXCEPTION_POINTERS* exc_info)
+{
+ PCONTEXT ctx = exc_info->ContextRecord;
+
+ registers[EAX] = ctx->Eax;
+ registers[ECX] = ctx->Ecx;
+ registers[EDX] = ctx->Edx;
+ registers[EBX] = ctx->Ebx;
+ registers[ESP] = ctx->Esp;
+ registers[EBP] = ctx->Ebp;
+ registers[ESI] = ctx->Esi;
+ registers[EDI] = ctx->Edi;
+ registers[PC] = ctx->Eip;
+ registers[PS] = ctx->EFlags;
+ registers[CS] = ctx->SegCs;
+ registers[SS] = ctx->SegSs;
+ registers[DS] = ctx->SegDs;
+ registers[ES] = ctx->SegEs;
+ registers[FS] = ctx->SegFs;
+ registers[GS] = ctx->SegGs;
+
+ handle_exception(exc_info->ExceptionRecord->ExceptionCode & 0xFFFF);
+
+ ctx->Eax = registers[EAX];
+ ctx->Ecx = registers[ECX];
+ ctx->Edx = registers[EDX];
+ ctx->Ebx = registers[EBX];
+ ctx->Esp = registers[ESP];
+ ctx->Ebp = registers[EBP];
+ ctx->Esi = registers[ESI];
+ ctx->Edi = registers[EDI];
+ ctx->Eip = registers[PC];
+ ctx->EFlags = registers[PS];
+ ctx->SegCs = registers[CS];
+ ctx->SegSs = registers[SS];
+ ctx->SegDs = registers[DS];
+ ctx->SegEs = registers[ES];
+ ctx->SegFs = registers[FS];
+ ctx->SegGs = registers[GS];
+}
+
+#endif // WIN32
+
+
+int
+hex (ch)
+ char ch;
+{
+ if ((ch >= 'a') && (ch <= 'f'))
+ return (ch - 'a' + 10);
+ if ((ch >= '0') && (ch <= '9'))
+ return (ch - '0');
+ if ((ch >= 'A') && (ch <= 'F'))
+ return (ch - 'A' + 10);
+ return (-1);
+}
+
+static char remcomInBuffer[BUFMAX];
+static char remcomOutBuffer[BUFMAX];
+
+/* scan for the sequence $<data>#<checksum> */
+
+char *
+getpacket (void)
+{
+ char *buffer = &remcomInBuffer[0];
+ unsigned char checksum;
+ unsigned char xmitcsum;
+ int count;
+ char ch;
+
+ while (1)
+ {
+ /* wait around for the start character, ignore all other characters */
+ while ((ch = getDebugChar ()) != '$')
+ ;
+
+ retry:
+ checksum = 0;
+ xmitcsum = -1;
+ count = 0;
+
+ /* now, read until a # or end of buffer is found */
+ while (count < BUFMAX)
+ {
+ ch = getDebugChar ();
+ if (ch == '$')
+ goto retry;
+ if (ch == '#')
+ break;
+ checksum = checksum + ch;
+ buffer[count] = ch;
+ count = count + 1;
+ }
+ buffer[count] = 0;
+
+ if (ch == '#')
+ {
+ ch = getDebugChar ();
+ xmitcsum = hex (ch) << 4;
+ ch = getDebugChar ();
+ xmitcsum += hex (ch);
+
+ if (checksum != xmitcsum)
+ {
+ if (remote_debug)
+ {
+ fprintf (stderr,
+ "bad checksum. My count = 0x%x, sent=0x%x. buf=%s\n",
+ checksum, xmitcsum, buffer);
+ }
+ putDebugChar ('-'); /* failed checksum */
+ }
+ else
+ {
+ putDebugChar ('+'); /* successful transfer */
+
+ /* if a sequence char is present, reply the sequence ID */
+ if (buffer[2] == ':')
+ {
+ putDebugChar (buffer[0]);
+ putDebugChar (buffer[1]);
+
+ return &buffer[3];
+ }
+
+ return &buffer[0];
+ }
+ }
+ }
+}
+
+/* send the packet in buffer. */
+
+void
+putpacket (char *buffer)
+{
+ unsigned char checksum;
+ int count;
+ char ch;
+
+ /* $<packet info>#<checksum>. */
+ do
+ {
+ putDebugChar ('$');
+ checksum = 0;
+ count = 0;
+
+ while ((ch = buffer[count]) != 0)
+ {
+ putDebugChar (ch);
+ checksum += ch;
+ count += 1;
+ }
+
+ putDebugChar ('#');
+ putDebugChar (hexchars[checksum >> 4]);
+ putDebugChar (hexchars[checksum % 16]);
+
+ }
+ while (getDebugChar () != '+');
+}
+
+void debug_error (char* format/*, char* parm*/)
+{
+ if (remote_debug)
+ fprintf (stderr, format/*, parm*/);
+}
+
+/* Address of a routine to RTE to if we get a memory fault. */
+static void (*volatile mem_fault_routine) () = NULL;
+
+/* Indicate to caller of mem2hex or hex2mem that there has been an
+ error. */
+static volatile int mem_err = 0;
+
+void
+set_mem_err (void)
+{
+ mem_err = 1;
+}
+
+/* These are separate functions so that they are so short and sweet
+ that the compiler won't save any registers (if there is a fault
+ to mem_fault, they won't get restored, so there better not be any
+ saved). */
+int
+get_char (char *addr)
+{
+ return *addr;
+}
+
+void
+set_char (char *addr, int val)
+{
+ *addr = val;
+}
+
+/* convert the memory pointed to by mem into hex, placing result in buf */
+/* return a pointer to the last char put in buf (null) */
+/* If MAY_FAULT is non-zero, then we should set mem_err in response to
+ a fault; if zero treat a fault like any other fault in the stub. */
+char *
+mem2hex (mem, buf, count, may_fault)
+ char *mem;
+ char *buf;
+ int count;
+ int may_fault;
+{
+ int i;
+ unsigned char ch;
+
+#ifdef WIN32 //MF
+ if (IsBadReadPtr(mem, count))
+ return mem;
+#else
+ if (may_fault)
+ mem_fault_routine = set_mem_err;
+#endif
+ for (i = 0; i < count; i++)
+ {
+ ch = get_char (mem++);
+ if (may_fault && mem_err)
+ return (buf);
+ *buf++ = hexchars[ch >> 4];
+ *buf++ = hexchars[ch % 16];
+ }
+ *buf = 0;
+#ifndef WIN32 //MF
+ if (may_fault)
+ mem_fault_routine = NULL;
+#endif
+ return (buf);
+}
+
+/* convert the hex array pointed to by buf into binary to be placed in mem */
+/* return a pointer to the character AFTER the last byte written */
+char *
+hex2mem (buf, mem, count, may_fault)
+ char *buf;
+ char *mem;
+ int count;
+ int may_fault;
+{
+ int i;
+ unsigned char ch;
+
+#ifdef WIN32 //MF
+ // MinGW does not support structured exception handling, so let's
+ // go safe and make memory writable by default
+ DWORD old_protect;
+
+ VirtualProtect(mem, count, PAGE_EXECUTE_READWRITE, &old_protect);
+#else
+ if (may_fault)
+ mem_fault_routine = set_mem_err;
+#endif
+
+ for (i = 0; i < count; i++)
+ {
+ ch = hex (*buf++) << 4;
+ ch = ch + hex (*buf++);
+ set_char (mem++, ch);
+ if (may_fault && mem_err)
+ return (mem);
+ }
+
+#ifndef WIN32 //MF
+ if (may_fault)
+ mem_fault_routine = NULL;
+#endif
+
+ return (mem);
+}
+
+/* this function takes the 386 exception vector and attempts to
+ translate this number into a unix compatible signal value */
+int
+computeSignal (int exceptionVector)
+{
+ int sigval;
+ switch (exceptionVector)
+ {
+ case 0:
+ sigval = 8;
+ break; /* divide by zero */
+ case 1:
+ sigval = 5;
+ break; /* debug exception */
+ case 3:
+ sigval = 5;
+ break; /* breakpoint */
+ case 4:
+ sigval = 16;
+ break; /* into instruction (overflow) */
+ case 5:
+ sigval = 16;
+ break; /* bound instruction */
+ case 6:
+ sigval = 4;
+ break; /* Invalid opcode */
+ case 7:
+ sigval = 8;
+ break; /* coprocessor not available */
+ case 8:
+ sigval = 7;
+ break; /* double fault */
+ case 9:
+ sigval = 11;
+ break; /* coprocessor segment overrun */
+ case 10:
+ sigval = 11;
+ break; /* Invalid TSS */
+ case 11:
+ sigval = 11;
+ break; /* Segment not present */
+ case 12:
+ sigval = 11;
+ break; /* stack exception */
+ case 13:
+ sigval = 11;
+ break; /* general protection */
+ case 14:
+ sigval = 11;
+ break; /* page fault */
+ case 16:
+ sigval = 7;
+ break; /* coprocessor error */
+ default:
+ sigval = 7; /* "software generated" */
+ }
+ return (sigval);
+}
+
+/**********************************************/
+/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */
+/* RETURN NUMBER OF CHARS PROCESSED */
+/**********************************************/
+int
+hexToInt (char **ptr, int *intValue)
+{
+ int numChars = 0;
+ int hexValue;
+
+ *intValue = 0;
+
+ while (**ptr)
+ {
+ hexValue = hex (**ptr);
+ if (hexValue >= 0)
+ {
+ *intValue = (*intValue << 4) | hexValue;
+ numChars++;
+ }
+ else
+ break;
+
+ (*ptr)++;
+ }
+
+ return (numChars);
+}
+
+/*
+ * This function does all command procesing for interfacing to gdb.
+ */
+void
+handle_exception (int exceptionVector)
+{
+ int sigval, stepping;
+ int addr, length;
+ char *ptr;
+ int newPC;
+
+#ifndef WIN32 //MF
+ gdb_i386vector = exceptionVector;
+#endif
+
+ if (remote_debug)
+ {
+ printf ("vector=%d, sr=0x%x, pc=0x%x\n",
+ exceptionVector, registers[PS], registers[PC]);
+ }
+
+ /* reply to host that an exception has occurred */
+ sigval = computeSignal (exceptionVector);
+
+ ptr = remcomOutBuffer;
+
+ *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */
+ *ptr++ = hexchars[sigval >> 4];
+ *ptr++ = hexchars[sigval & 0xf];
+
+ *ptr++ = hexchars[ESP];
+ *ptr++ = ':';
+ ptr = mem2hex((char *)®isters[ESP], ptr, 4, 0); /* SP */
+ *ptr++ = ';';
+
+ *ptr++ = hexchars[EBP];
+ *ptr++ = ':';
+ ptr = mem2hex((char *)®isters[EBP], ptr, 4, 0); /* FP */
+ *ptr++ = ';';
+
+ *ptr++ = hexchars[PC];
+ *ptr++ = ':';
+ ptr = mem2hex((char *)®isters[PC], ptr, 4, 0); /* PC */
+ *ptr++ = ';';
+
+ *ptr = '\0';
+
+ putpacket (remcomOutBuffer);
+
+ stepping = 0;
+
+ while (1 == 1)
+ {
+ remcomOutBuffer[0] = 0;
+ ptr = getpacket ();
+
+ switch (*ptr++)
+ {
+ case '?':
+ remcomOutBuffer[0] = 'S';
+ remcomOutBuffer[1] = hexchars[sigval >> 4];
+ remcomOutBuffer[2] = hexchars[sigval % 16];
+ remcomOutBuffer[3] = 0;
+ break;
+ case 'd':
+ remote_debug = !(remote_debug); /* toggle debug flag */
+ break;
+ case 'g': /* return the value of the CPU registers */
+ mem2hex ((char *) registers, remcomOutBuffer, NUMREGBYTES, 0);
+ break;
+ case 'G': /* set the value of the CPU registers - return OK */
+ hex2mem (ptr, (char *) registers, NUMREGBYTES, 0);
+ strcpy_s(remcomOutBuffer, BUFMAX, "OK");
+ break;
+ case 'P': /* set the value of a single CPU register - return OK */
+ {
+ int regno;
+
+ if (hexToInt (&ptr, ®no) && *ptr++ == '=')
+ if (regno >= 0 && regno < NUMREGS)
+ {
+ hex2mem (ptr, (char *) ®isters[regno], 4, 0);
+ strcpy_s(remcomOutBuffer, BUFMAX, "OK");
+ break;
+ }
+
+ strcpy_s(remcomOutBuffer, BUFMAX, "E01");
+ break;
+ }
+
+ /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
+ case 'm':
+ /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */
+ if (hexToInt (&ptr, &addr))
+ if (*(ptr++) == ',')
+ if (hexToInt (&ptr, &length))
+ {
+ ptr = 0;
+ mem_err = 0;
+ mem2hex ((char *) addr, remcomOutBuffer, length, 1);
+ if (mem_err)
+ {
+ strcpy_s(remcomOutBuffer, BUFMAX, "E03");
+ debug_error ("memory fault");
+ }
+ }
+
+ if (ptr)
+ {
+ strcpy_s(remcomOutBuffer, BUFMAX, "E01");
+ }
+ break;
+
+ /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
+ case 'M':
+ /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */
+ if (hexToInt (&ptr, &addr))
+ if (*(ptr++) == ',')
+ if (hexToInt (&ptr, &length))
+ if (*(ptr++) == ':')
+ {
+ mem_err = 0;
+ hex2mem (ptr, (char *) addr, length, 1);
+
+ if (mem_err)
+ {
+ strcpy_s(remcomOutBuffer, BUFMAX, "E03");
+ debug_error ("memory fault");
+ }
+ else
+ {
+ strcpy_s(remcomOutBuffer, BUFMAX, "OK");
+ }
+
+ ptr = 0;
+ }
+ if (ptr)
+ {
+ strcpy_s(remcomOutBuffer, BUFMAX, "E02");
+ }
+ break;
+
+ /* cAA..AA Continue at address AA..AA(optional) */
+ /* sAA..AA Step one instruction from AA..AA(optional) */
+ case 's':
+ stepping = 1;
+ case 'c':
+ /* try to read optional parameter, pc unchanged if no parm */
+ if (hexToInt (&ptr, &addr))
+ registers[PC] = addr;
+
+ newPC = registers[PC];
+
+ /* clear the trace bit */
+ registers[PS] &= 0xfffffeff;
+
+ /* set the trace bit if we're stepping */
+ if (stepping)
+ registers[PS] |= 0x100;
+
+#ifdef WIN32 //MF
+ return;
+#else
+ _returnFromException (); /* this is a jump */
+#endif
+ break;
+
+ /* kill the program */
+ case 'k': /* do nothing */
+#if 0
+ /* Huh? This doesn't look like "nothing".
+ m68k-stub.c and sparc-stub.c don't have it. */
+ BREAKPOINT ();
+#endif
+ break;
+ } /* switch */
+
+ /* reply to the request */
+ putpacket (remcomOutBuffer);
+ }
+}
+
+/* this function is used to set up exception handlers for tracing and
+ breakpoints */
+void
+set_debug_traps (void)
+{
+#ifndef WIN32 //MF
+ stackPtr = &remcomStack[STACKSIZE / sizeof (int) - 1];
+
+ exceptionHandler (0, _catchException0);
+ exceptionHandler (1, _catchException1);
+ exceptionHandler (3, _catchException3);
+ exceptionHandler (4, _catchException4);
+ exceptionHandler (5, _catchException5);
+ exceptionHandler (6, _catchException6);
+ exceptionHandler (7, _catchException7);
+ exceptionHandler (8, _catchException8);
+ exceptionHandler (9, _catchException9);
+ exceptionHandler (10, _catchException10);
+ exceptionHandler (11, _catchException11);
+ exceptionHandler (12, _catchException12);
+ exceptionHandler (13, _catchException13);
+ exceptionHandler (14, _catchException14);
+ exceptionHandler (16, _catchException16);
+#endif // WIN32
+
+ initialized = 1;
+}
+
+/* This function will generate a breakpoint exception. It is used at the
+ beginning of a program to sync up with a debugger and can be used
+ otherwise as a quick means to stop program execution and "break" into
+ the debugger. */
+
+void
+breakpoint (void)
+{
+ if (initialized)
+ BREAKPOINT ();
+}
+
+
+
+ //
+ // debugger stub implementation for WIN32 applications
+ // M. Fuchs, 29.11.2003
+ //
+
+#ifdef WIN32
+
+#include <stdlib.h>
+#include <errno.h>
+
+#include "utility/utility.h"
+
+
+int s_initial_breakpoint = 0;
+
+
+#ifdef DEBUG_SERIAL
+
+FILE* ser_port = NULL;
+
+int init_gdb_connect()
+{
+ //TODO: set up connection using serial communication port
+
+ ser_port = fopen("COM1:", "rwb");
+
+ return 1;
+}
+
+int getDebugChar()
+{
+ return fgetc(ser_port);
+}
+
+void putDebugChar(int c)
+{
+ fputc(c, ser_port);
+}
+
+
+#else // DEBUG_SERIAL
+
+
+static LPTOP_LEVEL_EXCEPTION_FILTER s_prev_exc_handler = 0;
+
+
+#define I386_EXCEPTION_CNT 17
+
+LONG WINAPI exc_protection_handler(EXCEPTION_POINTERS* exc_info)
+{
+ int exc_nr = exc_info->ExceptionRecord->ExceptionCode & 0xFFFF;
+
+ if (exc_nr < I386_EXCEPTION_CNT) {
+ //LOG(FmtString(TEXT("exc_protection_handler: Exception %x"), exc_nr));
+
+ if (exc_nr==11 || exc_nr==13 || exc_nr==14) {
+ if (mem_fault_routine)
+ mem_fault_routine();
+ }
+
+ ++exc_info->ContextRecord->Eip;
+ }
+
+ return EXCEPTION_CONTINUE_EXECUTION;
+}
+
+LONG WINAPI exc_handler(EXCEPTION_POINTERS* exc_info)
+{
+ int exc_nr = exc_info->ExceptionRecord->ExceptionCode & 0xFFFF;
+
+ if (exc_nr < I386_EXCEPTION_CNT) {
+ //LOG(FmtString("Exception %x", exc_nr));
+ //LOG(FmtString("EIP=%08X EFLAGS=%08X", exc_info->ContextRecord->Eip, exc_info->ContextRecord->EFlags));
+
+ // step over initial breakpoint
+ if (s_initial_breakpoint) {
+ s_initial_breakpoint = 0;
+ ++exc_info->ContextRecord->Eip;
+ }
+
+ SetUnhandledExceptionFilter(exc_protection_handler);
+
+ win32_exception_handler(exc_info);
+ //LOG(FmtString("EIP=%08X EFLAGS=%08X", exc_info->ContextRecord->Eip, exc_info->ContextRecord->EFlags));
+
+ SetUnhandledExceptionFilter(exc_handler);
+
+ return EXCEPTION_CONTINUE_EXECUTION;
+ }
+
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+
+/* not needed because we use win32_exception_handler() instead of catchExceptionX()
+void exceptionHandler(int exc_nr, void* exc_addr)
+{
+ if (exc_nr>=0 && exc_nr<I386_EXCEPTION_CNT)
+ exc_handlers[exc_nr] = exc_addr;
+}
+*/
+
+void disable_debugging()
+{
+ if (s_prev_exc_handler) {
+ SetUnhandledExceptionFilter(s_prev_exc_handler);
+ s_prev_exc_handler = 0;
+ }
+}
+
+
+#include <winsock.h>
+#ifdef _MSC_VER
+#pragma comment(lib, "wsock32")
+#endif
+
+static int s_rem_fd = -1;
+
+int init_gdb_connect()
+{
+ SOCKADDR_IN srv_addr = {0};
+ SOCKADDR_IN rem_addr;
+ WSADATA wsa_data;
+ int srv_socket, rem_len;
+
+ s_prev_exc_handler = SetUnhandledExceptionFilter(exc_handler);
+
+ if (WSAStartup(MAKEWORD(2,2), &wsa_data)) {
+ fprintf(stderr, "WSAStartup() failed");
+ return 0;
+ }
+
+ srv_addr.sin_family = AF_INET;
+ srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ srv_addr.sin_port = htons(9999);
+
+ srv_socket = socket(PF_INET, SOCK_STREAM, 0);
+ if (srv_socket == -1) {
+ perror("socket()");
+ return 0;
+ }
+
+ if (bind(srv_socket, (struct sockaddr*) &srv_addr, sizeof(srv_addr)) == -1) {
+ perror("bind()");
+ return 0;
+ }
+
+ if (listen(srv_socket, 4) == -1) {
+ perror("listen()");
+ return 0;
+ }
+
+ rem_len = sizeof(rem_addr);
+
+ for(;;) {
+ s_rem_fd = accept(srv_socket, (struct sockaddr*)&rem_addr, &rem_len);
+
+ if (s_rem_fd < 0) {
+ if (errno == EINTR)
+ continue;
+
+ perror("accept()");
+ return 0;
+ }
+
+ break;
+ }
+
+ return 1;
+}
+
+#endif // DEBUG_SERIAL
+
+
+int getDebugChar()
+{
+ char buffer[1024];
+ int r;
+
+ if (s_rem_fd == -1)
+ return EOF;
+
+ r = recv(s_rem_fd, buffer, 1, 0);
+ if (r == -1) {
+ perror("recv()");
+ LOG(TEXT("debugger connection broken"));
+ s_rem_fd = -1;
+ return EOF;
+ }
+
+ if (!r)
+ return EOF;
+
+ return buffer[0];
+}
+
+void putDebugChar(int c)
+{
+ if (s_rem_fd != -1) {
+ const char buffer[] = {c};
+
+ if (!send(s_rem_fd, buffer, 1, 0)) {
+ perror("send()");
+ LOG(TEXT("debugger connection broken"));
+ exit(-1);
+ }
+ }
+}
+
+
+ // start up GDB stub interface
+
+int initialize_gdb_stub()
+{
+ if (!init_gdb_connect())
+ return 0;
+
+ set_debug_traps();
+
+ s_initial_breakpoint = 1;
+ breakpoint();
+
+ return 1;
+}
+
+#endif // WIN32
--- /dev/null
+sed 's/@GEN@/generated on '`date +%d.%m.%Y`/ <doxy-footer.htmt >doxy-footer.html
+doxygen Doxyfile
--- /dev/null
+doxygen Doxyfile
+cmd /c start /b /low /wait hhc doxy-doc\html\index.hhp
+cmd /c move /y doxy-doc\html\index.chm ros-explorer.chm
+
+doxygen Doxyfile-all
+cmd /c start /b /low /wait hhc doxy-doc\html\index.hhp
+cmd /c move /y doxy-doc\html\index.chm ros-explorer-full.chm
--- /dev/null
+# Microsoft Developer Studio Project File - Name="make_explorer" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) External Target" 0x0106\r
+\r
+CFG=make_explorer - Win32 bjam\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "make_explorer.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "make_explorer.mak" CFG="make_explorer - Win32 bjam"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "make_explorer - Win32 Release" (based on "Win32 (x86) External Target")\r
+!MESSAGE "make_explorer - Win32 Debug" (based on "Win32 (x86) External Target")\r
+!MESSAGE "make_explorer - Win32 Unicode Debug" (based on "Win32 (x86) External Target")\r
+!MESSAGE "make_explorer - Win32 Unicode Release" (based on "Win32 (x86) External Target")\r
+!MESSAGE "make_explorer - Win32 doxy docu" (based on "Win32 (x86) External Target")\r
+!MESSAGE "make_explorer - Win32 bjam" (based on "Win32 (x86) External Target")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+\r
+!IF "$(CFG)" == "make_explorer - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Cmd_Line "NMAKE /f make_explorer.mak"\r
+# PROP BASE Rebuild_Opt "/a"\r
+# PROP BASE Target_File "make_explorer.exe"\r
+# PROP BASE Bsc_Name "make_explorer.bsc"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0"\r
+# PROP Rebuild_Opt "clean all"\r
+# PROP Target_File "explorer.exe"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ELSEIF "$(CFG)" == "make_explorer - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Cmd_Line "NMAKE /f make_explorer.mak"\r
+# PROP BASE Rebuild_Opt "/a"\r
+# PROP BASE Target_File "make_explorer.exe"\r
+# PROP BASE Bsc_Name "make_explorer.bsc"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0 DEBUG=1"\r
+# PROP Rebuild_Opt "clean all"\r
+# PROP Target_File "explorer.exe"\r
+# PROP Bsc_Name "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=0 DEBUG=1"\r
+# PROP Target_Dir ""\r
+\r
+!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "UDebug"\r
+# PROP BASE Intermediate_Dir "UDebug"\r
+# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1"\r
+# PROP BASE Rebuild_Opt "clean all"\r
+# PROP BASE Target_File "explorer.exe"\r
+# PROP BASE Bsc_Name ""\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "UDebug"\r
+# PROP Intermediate_Dir "UDebug"\r
+# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1"\r
+# PROP Rebuild_Opt "clean all"\r
+# PROP Target_File "explorer.exe"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "URelease"\r
+# PROP BASE Intermediate_Dir "URelease"\r
+# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1"\r
+# PROP BASE Rebuild_Opt "clean all"\r
+# PROP BASE Target_File "explorer.exe"\r
+# PROP BASE Bsc_Name ""\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "URelease"\r
+# PROP Intermediate_Dir "URelease"\r
+# PROP Cmd_Line "msdevfilt -gcc make -f Makefile.PCH UNICODE=1"\r
+# PROP Rebuild_Opt "clean all"\r
+# PROP Target_File "explorer.exe"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ELSEIF "$(CFG)" == "make_explorer - Win32 doxy docu"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW DEBUG=1"\r
+# PROP BASE Rebuild_Opt "clean all"\r
+# PROP BASE Target_File "explorer.exe"\r
+# PROP BASE Bsc_Name ""\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Cmd_Line "msdevfilt -java make docu"\r
+# PROP Rebuild_Opt "full-docu"\r
+# PROP Target_File "explorer.exe"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ELSEIF "$(CFG)" == "make_explorer - Win32 bjam"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW DEBUG=1"\r
+# PROP BASE Rebuild_Opt "clean all"\r
+# PROP BASE Target_File "explorer.exe"\r
+# PROP BASE Bsc_Name ""\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" bjam"\r
+# PROP Rebuild_Opt "clean&bjam release"\r
+# PROP Target_File "explorer.exe"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "make_explorer - Win32 Release"\r
+# Name "make_explorer - Win32 Debug"\r
+# Name "make_explorer - Win32 Unicode Debug"\r
+# Name "make_explorer - Win32 Unicode Release"\r
+# Name "make_explorer - Win32 doxy docu"\r
+# Name "make_explorer - Win32 bjam"\r
+\r
+!IF "$(CFG)" == "make_explorer - Win32 Release"\r
+\r
+!ELSEIF "$(CFG)" == "make_explorer - Win32 Debug"\r
+\r
+!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Debug"\r
+\r
+!ELSEIF "$(CFG)" == "make_explorer - Win32 Unicode Release"\r
+\r
+!ELSEIF "$(CFG)" == "make_explorer - Win32 doxy docu"\r
+\r
+!ELSEIF "$(CFG)" == "make_explorer - Win32 bjam"\r
+\r
+!ENDIF \r
+\r
+# Begin Source File\r
+\r
+SOURCE=.\Jamfile\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Makefile\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Makefile.MinGW\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Makefile.PCH\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Makefile.Wine\r
+# End Source File\r
+# End Target\r
+# End Project\r
--- /dev/null
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+ ProjectType="Visual C++"\r
+ Version="8,00"\r
+ Name="make_explorer"\r
+ ProjectGUID="{E132A04B-8BC6-4D18-81F2-F0156B809871}"\r
+ Keyword="MakeFileProj"\r
+ >\r
+ <Platforms>\r
+ <Platform\r
+ Name="Win32"\r
+ />\r
+ </Platforms>\r
+ <ToolFiles>\r
+ </ToolFiles>\r
+ <Configurations>\r
+ <Configuration\r
+ Name="Unicode Release|Win32"\r
+ OutputDirectory=".\URelease"\r
+ IntermediateDirectory=".\URelease"\r
+ ConfigurationType="0"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCNMakeTool"\r
+ BuildCommandLine="msdevfilt -gcc make -f Makefile.PCH UNICODE=1"\r
+ ReBuildCommandLine="msdevfilt -gcc make -f Makefile.PCH UNICODE=1 clean all"\r
+ CleanCommandLine=""\r
+ Output="explorer.exe"\r
+ PreprocessorDefinitions=""\r
+ IncludeSearchPath=""\r
+ ForcedIncludes=""\r
+ AssemblySearchPath=""\r
+ ForcedUsingAssemblies=""\r
+ CompileAsManaged=""\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="bjam|Win32"\r
+ OutputDirectory=".\Debug"\r
+ IntermediateDirectory=".\Debug"\r
+ ConfigurationType="0"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCNMakeTool"\r
+ BuildCommandLine="msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" bjam"\r
+ ReBuildCommandLine="msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" bjam clean&bjam release"\r
+ CleanCommandLine=""\r
+ Output="explorer.exe"\r
+ PreprocessorDefinitions=""\r
+ IncludeSearchPath=""\r
+ ForcedIncludes=""\r
+ AssemblySearchPath=""\r
+ ForcedUsingAssemblies=""\r
+ CompileAsManaged=""\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="Release|Win32"\r
+ OutputDirectory=".\Release"\r
+ IntermediateDirectory=".\Release"\r
+ ConfigurationType="0"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCNMakeTool"\r
+ BuildCommandLine="msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0"\r
+ ReBuildCommandLine="msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0 clean all"\r
+ CleanCommandLine=""\r
+ Output="explorer.exe"\r
+ PreprocessorDefinitions=""\r
+ IncludeSearchPath=""\r
+ ForcedIncludes=""\r
+ AssemblySearchPath=""\r
+ ForcedUsingAssemblies=""\r
+ CompileAsManaged=""\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="doxy docu|Win32"\r
+ OutputDirectory=".\Debug"\r
+ IntermediateDirectory=".\Debug"\r
+ ConfigurationType="0"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCNMakeTool"\r
+ BuildCommandLine="msdevfilt -java make docu"\r
+ ReBuildCommandLine="msdevfilt -java make docu full-docu"\r
+ CleanCommandLine=""\r
+ Output="explorer.exe"\r
+ PreprocessorDefinitions=""\r
+ IncludeSearchPath=""\r
+ ForcedIncludes=""\r
+ AssemblySearchPath=""\r
+ ForcedUsingAssemblies=""\r
+ CompileAsManaged=""\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="Unicode Debug|Win32"\r
+ OutputDirectory=".\UDebug"\r
+ IntermediateDirectory=".\UDebug"\r
+ ConfigurationType="0"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCNMakeTool"\r
+ BuildCommandLine="msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1"\r
+ ReBuildCommandLine="msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1 clean all"\r
+ CleanCommandLine=""\r
+ Output="explorer.exe"\r
+ PreprocessorDefinitions=""\r
+ IncludeSearchPath=""\r
+ ForcedIncludes=""\r
+ AssemblySearchPath=""\r
+ ForcedUsingAssemblies=""\r
+ CompileAsManaged=""\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="Debug|Win32"\r
+ OutputDirectory=".\Debug"\r
+ IntermediateDirectory=".\Debug"\r
+ ConfigurationType="0"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCNMakeTool"\r
+ BuildCommandLine="msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0 DEBUG=1"\r
+ ReBuildCommandLine="msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.PCH UNICODE=0 DEBUG=1 clean all"\r
+ CleanCommandLine=""\r
+ Output="explorer.exe"\r
+ PreprocessorDefinitions=""\r
+ IncludeSearchPath=""\r
+ ForcedIncludes=""\r
+ AssemblySearchPath=""\r
+ ForcedUsingAssemblies=""\r
+ CompileAsManaged=""\r
+ />\r
+ </Configuration>\r
+ </Configurations>\r
+ <References>\r
+ </References>\r
+ <Files>\r
+ <File\r
+ RelativePath="msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=0 DEBUG=1"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="Jamfile"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="Makefile"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="Makefile.MinGW"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="Makefile.PCH"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath="Makefile.Wine"\r
+ >\r
+ </File>\r
+ </Files>\r
+ <Globals>\r
+ </Globals>\r
+</VisualStudioProject>\r
--- /dev/null
+# Microsoft Developer Studio Project File - Name="make_rosshell" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) External Target" 0x0106\r
+\r
+CFG=make_rosshell - Win32 Release\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "make_rosshell.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "make_rosshell.mak" CFG="make_rosshell - Win32 Release"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "make_rosshell - Win32 Release" (based on "Win32 (x86) External Target")\r
+!MESSAGE "make_rosshell - Win32 Debug" (based on "Win32 (x86) External Target")\r
+!MESSAGE "make_rosshell - Win32 Unicode Debug" (based on "Win32 (x86) External Target")\r
+!MESSAGE "make_rosshell - Win32 Unicode Release" (based on "Win32 (x86) External Target")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+\r
+!IF "$(CFG)" == "make_rosshell - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Cmd_Line "NMAKE /f make_rosshell.mak"\r
+# PROP BASE Rebuild_Opt "/a"\r
+# PROP BASE Target_File "make_rosshell.exe"\r
+# PROP BASE Bsc_Name "make_rosshell.bsc"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Make-rosshell.MinGW UNICODE=0"\r
+# PROP Rebuild_Opt "clean all"\r
+# PROP Target_File "rosshell.exe"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ELSEIF "$(CFG)" == "make_rosshell - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Cmd_Line "NMAKE /f make_rosshell.mak"\r
+# PROP BASE Rebuild_Opt "/a"\r
+# PROP BASE Target_File "make_rosshell.exe"\r
+# PROP BASE Bsc_Name "make_rosshell.bsc"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Make-rosshell.MinGW UNICODE=0 DEBUG=1"\r
+# PROP Rebuild_Opt "clean all"\r
+# PROP Target_File "rosshell.exe"\r
+# PROP Bsc_Name "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=0 DEBUG=1"\r
+# PROP Target_Dir ""\r
+\r
+!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "UDebug"\r
+# PROP BASE Intermediate_Dir "UDebug"\r
+# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1"\r
+# PROP BASE Rebuild_Opt "clean all"\r
+# PROP BASE Target_File "rosshell.exe"\r
+# PROP BASE Bsc_Name ""\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "UDebug"\r
+# PROP Intermediate_Dir "UDebug"\r
+# PROP Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1 DEBUG=1"\r
+# PROP Rebuild_Opt "clean all"\r
+# PROP Target_File "rosshell.exe"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "URelease"\r
+# PROP BASE Intermediate_Dir "URelease"\r
+# PROP BASE Cmd_Line "msdevfilt -gcc -pipe "perl d:\tools\gSTLFilt.pl" make -f Makefile.MinGW UNICODE=1"\r
+# PROP BASE Rebuild_Opt "clean all"\r
+# PROP BASE Target_File "rosshell.exe"\r
+# PROP BASE Bsc_Name ""\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "URelease"\r
+# PROP Intermediate_Dir "URelease"\r
+# PROP Cmd_Line "msdevfilt -gcc make -f Make-rosshell.MinGW UNICODE=1"\r
+# PROP Rebuild_Opt "clean all"\r
+# PROP Target_File "rosshell.exe"\r
+# PROP Bsc_Name ""\r
+# PROP Target_Dir ""\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "make_rosshell - Win32 Release"\r
+# Name "make_rosshell - Win32 Debug"\r
+# Name "make_rosshell - Win32 Unicode Debug"\r
+# Name "make_rosshell - Win32 Unicode Release"\r
+\r
+!IF "$(CFG)" == "make_rosshell - Win32 Release"\r
+\r
+!ELSEIF "$(CFG)" == "make_rosshell - Win32 Debug"\r
+\r
+!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Debug"\r
+\r
+!ELSEIF "$(CFG)" == "make_rosshell - Win32 Unicode Release"\r
+\r
+!ENDIF \r
+\r
+# Begin Source File\r
+\r
+SOURCE=.\Jamfile\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\Make-rosshell.MinGW"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Makefile\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Makefile.MinGW\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\Makefile.Wine\r
+# End Source File\r
+# End Target\r
+# End Project\r
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // NotifyHook DLL for ROS Explorer
+ //
+ // notifyhook.cpp
+ //
+ // Martin Fuchs, 17.03.2004
+ //
+
+
+#include "../utility/utility.h"
+
+#include "notifyhook.h"
+
+
+static HINSTANCE s_hInstance;
+static UINT WM_GETMODULEPATH;
+static HHOOK s_hNotifyHook;
+
+
+BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID param)
+{
+ switch(dwReason) {
+ case DLL_PROCESS_ATTACH:
+ s_hInstance = hInst;
+ DisableThreadLibraryCalls(hInst);
+ WM_GETMODULEPATH = RegisterWindowMessageA("WM_GETMODULEPATH");
+ break;
+ }
+
+ return TRUE;
+}
+
+
+struct COPYDATA_STRUCT {
+ HWND _hwnd;
+ int _len;
+ char _path[MAX_PATH];
+};
+
+LRESULT CALLBACK NotifyHookProc(int code, WPARAM wparam, LPARAM lparam)
+{
+ MSG* pmsg = (MSG*)lparam;
+
+ if (pmsg->message == WM_GETMODULEPATH) {
+ struct COPYDATA_STRUCT cds;
+ COPYDATASTRUCT data;
+
+ cds._hwnd = pmsg->hwnd;
+ cds._len = GetWindowModuleFileNameA(pmsg->hwnd, cds._path, COUNTOF(cds._path));
+
+ data.dwData = WM_GETMODULEPATH;
+ data.cbData = sizeof(cds);
+ data.lpData = &cds;
+
+ SendMessage((HWND)pmsg->wParam, WM_COPYDATA, (WPARAM)pmsg->hwnd, (LPARAM)&data);
+
+ return 0;
+ }
+
+ return CallNextHookEx(s_hNotifyHook, code, wparam, lparam);
+}
+
+
+UINT InstallNotifyHook()
+{
+ s_hNotifyHook = SetWindowsHookEx(WH_GETMESSAGE, NotifyHookProc, s_hInstance, 0);
+
+ return WM_GETMODULEPATH;
+}
+
+void DeinstallNotifyHook()
+{
+ UnhookWindowsHookEx(s_hNotifyHook);
+ s_hNotifyHook = 0;
+}
+
+
+void GetWindowModulePath(HWND hwnd)
+{
+ SendMessage(hwnd, WM_GETMODULEPATH, 0, 0);
+}
+
+ // retrieve module path by receiving WM_COPYDATA message
+DECL_NOTIFYHOOK int GetWindowModulePathCopyData(LPARAM lparam, HWND* phwnd, LPSTR buffer, int size)
+{
+ PCOPYDATASTRUCT data = (PCOPYDATASTRUCT) lparam;
+
+ if (data->dwData == WM_GETMODULEPATH) {
+ struct COPYDATA_STRUCT* cds = (struct COPYDATA_STRUCT*) data->lpData;
+
+ *phwnd = cds->_hwnd;
+ lstrcpyn(buffer, cds->_path, size);
+
+ return cds->_len;
+ } else
+ return 0;
+}
--- /dev/null
+EXPORTS
+DeinstallNotifyHook
+GetWindowModulePath
+GetWindowModulePathCopyData
+InstallNotifyHook
--- /dev/null
+# Microsoft Developer Studio Project File - Name="notifyhook" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102\r
+\r
+CFG=notifyhook - Win32\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "notifyhook.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "notifyhook.mak" CFG="notifyhook - Win32"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "notifyhook - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")\r
+!MESSAGE "notifyhook - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")\r
+!MESSAGE "notifyhook - Win32" (based on "Win32 (x86) Dynamic-Link Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+MTL=midl.exe\r
+RSC=rc.exe\r
+\r
+!IF "$(CFG)" == "notifyhook - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "shellhook___Win32_Release"\r
+# PROP BASE Intermediate_Dir "shellhook___Win32_Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "..\Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c\r
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FD /c\r
+# SUBTRACT CPP /YX\r
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x407 /d "NDEBUG"\r
+# ADD RSC /l 0x407 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386\r
+# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /machine:I386\r
+\r
+!ELSEIF "$(CFG)" == "notifyhook - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Win32"\r
+# PROP BASE Intermediate_Dir "Win32"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c\r
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c\r
+# SUBTRACT CPP /YX\r
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept\r
+\r
+!ELSEIF "$(CFG)" == "notifyhook - Win32"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Win32"\r
+# PROP BASE Intermediate_Dir "Win32"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Win32"\r
+# PROP Intermediate_Dir "Win32"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c\r
+# SUBTRACT BASE CPP /YX\r
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_NOTIFYHOOK_IMPL" /FR /FD /GZ /c\r
+# SUBTRACT CPP /YX\r
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 user32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "notifyhook - Win32 Release"\r
+# Name "notifyhook - Win32 Debug"\r
+# Name "notifyhook - Win32"\r
+# Begin Source File\r
+\r
+SOURCE=.\notifyhook.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\notifyhook.h\r
+# End Source File\r
+# End Target\r
+# End Project\r
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // NotifyHook DLL for ROS Explorer
+ //
+ // notifyhook.h
+ //
+ // Martin Fuchs, 17.03.2004
+ //
+
+
+#ifdef _NOTIFYHOOK_IMPL
+#define DECL_NOTIFYHOOK __declspec(dllexport)
+#else
+#define DECL_NOTIFYHOOK __declspec(dllimport)
+#ifdef _MSC_VER
+#pragma comment(lib, "notifyhook")
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DECL_NOTIFYHOOK UINT InstallNotifyHook();
+DECL_NOTIFYHOOK void DeinstallNotifyHook();
+
+DECL_NOTIFYHOOK void GetWindowModulePath(HWND hwnd);
+DECL_NOTIFYHOOK int GetWindowModulePathCopyData(LPARAM lparam, HWND* phwnd, LPSTR buffer, int size);
+
+#ifdef __cplusplus
+};
+#endif
--- /dev/null
+/* $Id$ */
+
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "NotifyHook DLL for ROS Explorer\0"
+#define REACTOS_STR_INTERNAL_NAME "notifyhook\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "notifyhook.dll\0"
+#include <reactos/version.rc>
+
+/* EOF */
--- /dev/null
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+ ProjectType="Visual C++"\r
+ Version="8,00"\r
+ Name="notifyhook"\r
+ ProjectGUID="{F28B575D-7DBA-44DE-AAEF-FA0D065E5162}"\r
+ >\r
+ <Platforms>\r
+ <Platform\r
+ Name="Win32"\r
+ />\r
+ </Platforms>\r
+ <ToolFiles>\r
+ </ToolFiles>\r
+ <Configurations>\r
+ <Configuration\r
+ Name="Release|Win32"\r
+ OutputDirectory=".\..\Release"\r
+ IntermediateDirectory=".\Release"\r
+ ConfigurationType="2"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ PreprocessorDefinitions="NDEBUG"\r
+ MkTypLibCompatible="true"\r
+ SuppressStartupBanner="true"\r
+ TargetEnvironment="1"\r
+ TypeLibraryName=".\..\Release/notifyhook.tlb"\r
+ HeaderFileName=""\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ Optimization="2"\r
+ InlineFunctionExpansion="1"\r
+ PreprocessorDefinitions="NDEBUG;WIN32;_NOTIFYHOOK_IMPL"\r
+ StringPooling="true"\r
+ RuntimeLibrary="0"\r
+ EnableFunctionLevelLinking="true"\r
+ PrecompiledHeaderFile=".\Release/notifyhook.pch"\r
+ AssemblerListingLocation=".\Release/"\r
+ ObjectFile=".\Release/"\r
+ ProgramDataBaseFileName=".\Release/"\r
+ WarningLevel="3"\r
+ SuppressStartupBanner="true"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions="NDEBUG"\r
+ Culture="1031"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ AdditionalDependencies="user32.lib"\r
+ OutputFile=".\..\Release/notifyhook.dll"\r
+ LinkIncremental="1"\r
+ SuppressStartupBanner="true"\r
+ ProgramDatabaseFile=".\..\Release/notifyhook.pdb"\r
+ SubSystem="2"\r
+ ImportLibrary=".\..\Release/notifyhook.lib"\r
+ TargetMachine="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ SuppressStartupBanner="true"\r
+ OutputFile=".\..\Release/notifyhook.bsc"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebDeploymentTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ />\r
+ </Configuration>\r
+ <Configuration\r
+ Name="Debug|Win32"\r
+ OutputDirectory=".\..\Debug"\r
+ IntermediateDirectory=".\Debug"\r
+ ConfigurationType="2"\r
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
+ UseOfMFC="0"\r
+ ATLMinimizesCRunTimeLibraryUsage="false"\r
+ >\r
+ <Tool\r
+ Name="VCPreBuildEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCCustomBuildTool"\r
+ />\r
+ <Tool\r
+ Name="VCXMLDataGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebServiceProxyGeneratorTool"\r
+ />\r
+ <Tool\r
+ Name="VCMIDLTool"\r
+ PreprocessorDefinitions="_DEBUG"\r
+ MkTypLibCompatible="true"\r
+ SuppressStartupBanner="true"\r
+ TargetEnvironment="1"\r
+ TypeLibraryName=".\..\Debug/notifyhook.tlb"\r
+ HeaderFileName=""\r
+ />\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ Optimization="0"\r
+ PreprocessorDefinitions="_DEBUG;WIN32;_NOTIFYHOOK_IMPL"\r
+ MinimalRebuild="true"\r
+ BasicRuntimeChecks="3"\r
+ RuntimeLibrary="1"\r
+ PrecompiledHeaderFile=".\Debug/notifyhook.pch"\r
+ AssemblerListingLocation=".\Debug/"\r
+ ObjectFile=".\Debug/"\r
+ ProgramDataBaseFileName=".\Debug/"\r
+ BrowseInformation="1"\r
+ WarningLevel="3"\r
+ SuppressStartupBanner="true"\r
+ DebugInformationFormat="4"\r
+ />\r
+ <Tool\r
+ Name="VCManagedResourceCompilerTool"\r
+ />\r
+ <Tool\r
+ Name="VCResourceCompilerTool"\r
+ PreprocessorDefinitions="_DEBUG"\r
+ Culture="1031"\r
+ />\r
+ <Tool\r
+ Name="VCPreLinkEventTool"\r
+ />\r
+ <Tool\r
+ Name="VCLinkerTool"\r
+ AdditionalDependencies="user32.lib"\r
+ OutputFile=".\..\Debug/notifyhook.dll"\r
+ LinkIncremental="2"\r
+ SuppressStartupBanner="true"\r
+ GenerateDebugInformation="true"\r
+ ProgramDatabaseFile=".\..\Debug/notifyhook.pdb"\r
+ SubSystem="2"\r
+ ImportLibrary=".\..\Debug/notifyhook.lib"\r
+ TargetMachine="1"\r
+ />\r
+ <Tool\r
+ Name="VCALinkTool"\r
+ />\r
+ <Tool\r
+ Name="VCManifestTool"\r
+ />\r
+ <Tool\r
+ Name="VCXDCMakeTool"\r
+ />\r
+ <Tool\r
+ Name="VCBscMakeTool"\r
+ SuppressStartupBanner="true"\r
+ OutputFile=".\..\Debug/notifyhook.bsc"\r
+ />\r
+ <Tool\r
+ Name="VCFxCopTool"\r
+ />\r
+ <Tool\r
+ Name="VCAppVerifierTool"\r
+ />\r
+ <Tool\r
+ Name="VCWebDeploymentTool"\r
+ />\r
+ <Tool\r
+ Name="VCPostBuildEventTool"\r
+ />\r
+ </Configuration>\r
+ </Configurations>\r
+ <References>\r
+ </References>\r
+ <Files>\r
+ <File\r
+ RelativePath="notifyhook.c"\r
+ >\r
+ <FileConfiguration\r
+ Name="Release|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ <FileConfiguration\r
+ Name="Debug|Win32"\r
+ >\r
+ <Tool\r
+ Name="VCCLCompilerTool"\r
+ PreprocessorDefinitions=""\r
+ />\r
+ </FileConfiguration>\r
+ </File>\r
+ <File\r
+ RelativePath="notifyhook.h"\r
+ >\r
+ </File>\r
+ </Files>\r
+ <Globals>\r
+ </Globals>\r
+</VisualStudioProject>\r
--- /dev/null
+<module name="notifyhook" type="win32dll" baseaddress="${BASEADDRESS_NOTIFYHOOK}" installbase="system32" installname="notifyhook.dll">
+ <importlibrary definition="notifyhook.def" />
+ <include base="notifyhook">.</include>
+ <define name="__USE_W32API" />
+ <define name="_WIN32_IE">0x0600</define>
+ <define name="_NOTIFYHOOK_IMPL" />
+ <library>kernel32</library>
+ <file>notifyhook.c</file>
+ <file>notifyhook.rc</file>
+</module>
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone - precompiled header support
+ //
+ // precomp.h
+ //
+ // Martin Fuchs, 17.05.2004
+ //
+
+#include "precomp.h"
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone - precompiled header support
+ //
+ // precomp.h
+ //
+ // Martin Fuchs, 17.05.2004
+ //
+
+#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
+#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1
+
+#include "utility/utility.h"
+
+#include "explorer.h"
+#include "desktop/desktop.h"
+
+#include "globals.h"
+#include "externals.h"
--- /dev/null
+import type ;
+import generators ;
+import feature ;
+
+type.register RC : rc ;
+
+rule init ( )
+{
+}
+
+rule resource-compile ( target : sources * : properties * )
+{
+# local OS = [ feature.get-values <os> : $(properties) ] ;
+ resource-compile-mingw $(target) : $(sources[1]) ;
+# switch $(OS)
+# {
+# case "NT" :
+# resource-compile-nt $(target) : $(sources[1]) ;
+# case "CYGWIN" :
+# resource-compile-cygwin $(target) : $(sources[1]) ;
+# case "FREEBSD" :
+# create-empty-object $(target) : $(sources[1]) ;
+# case "*" :
+# errors.error "Cannot process RC files for OS=$(OS)" ;
+# }
+}
+
+
+actions quietly resource-compile-nt
+{
+ rc /i "$(>:D)" /fo "$(<)" "$(>)"
+}
+
+actions quietly resource-compile-mingw
+{
+ windres -D__WINDRES__ -o "$(<)" -i "$(>)"
+}
+
+actions quietly resource-compile-cygwin
+{
+ windres -D__WINDRES__ --include-dir "$(>:D)" -o "$(<)" -i "$(>)"
+}
+
+actions quietly create-empty-object
+{
+ as /dev/null -o "$(<)"
+}
+
+# Since it's a common practice to write
+# exe hello : hello.cpp hello.rc
+# we change the name of object created from RC file, to
+# avoid conflict with hello.cpp.
+generators.register-standard rc-mingw.resource-compile : RC : OBJ(%_res) ;
--- /dev/null
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by explorer_intres.rc
+//
+#define IDS_TITLE 1
+#define MANIFEST_RESOURCE_ID 1
+#define IDS_START 2
+#define IDS_LOGOFF 3
+#define IDS_SHUTDOWN 4
+#define IDS_LAUNCH 5
+#define IDS_START_HELP 6
+#define IDS_SEARCH_FILES 7
+#define IDS_DOCUMENTS 8
+#define IDS_FAVORITES 9
+#define IDS_PROGRAMS 10
+#define IDS_SETTINGS 11
+#define IDS_EXPLORE 12
+#define IDS_EMPTY 13
+#define IDS_RECENT 14
+#define IDS_ADMIN 15
+#define IDS_NETWORK 16
+#define IDS_CONNECTIONS 17
+#define IDS_DRIVES 18
+#define IDS_SEARCH_COMPUTER 19
+#define IDS_SETTINGS_MENU 20
+#define IDS_CONTROL_PANEL 21
+#define IDS_PRINTERS 22
+#define IDS_BROWSE 23
+#define IDS_SEARCH_PRG 24
+#define IDS_ALL_USERS 25
+#define IDS_SEARCH 26
+#define IDS_ABOUT_EXPLORER 27
+#define IDS_LAUNCH_MANY_PROGRAMS 28
+#define IDS_DESKTOPBAR_SETTINGS 29
+#define IDS_DESKTOP 30
+#define IDS_TASKBAR 31
+#define IDS_STARTMENU 32
+#define IDS_MINIMIZE_ALL 33
+#define IDS_DESKTOP_NUM 34
+#define IDS_VOLUME 35
+#define IDS_ITEMS_CUR 36
+#define IDS_ITEMS_CONFIGURED 37
+#define IDS_ITEMS_VISIBLE 38
+#define IDS_ITEMS_HIDDEN 39
+#define IDS_NOTIFY_SHOW 40
+#define IDS_NOTIFY_HIDE 41
+#define IDS_NOTIFY_AUTOHIDE 42
+#define IDS_SHOW_HIDDEN_ICONS 43
+#define IDS_HIDE_ICONS 44
+#define IDS_TERMINATE 45
+#define IDI_REACTOS 100
+#define IDI_EXPLORER 101
+#define IDI_STARTMENU 102
+#define IDB_TOOLBAR 103
+#define IDA_EXPLORER 104
+#define ID_ACTIVATE 105
+#define IDD_SEARCH_PROGRAM 105
+#define IDB_DRIVEBAR 106
+#define IDD_DESKBAR_DESKTOP 106
+#define IDB_IMAGES 107
+#define IDD_EXECUTE 108
+#define IDR_MAINFRAME 109
+#define IDM_MDIFRAME 110
+#define ID_EXECUTE 111
+#define IDM_SDIFRAME 113
+#define IDI_LOGOFF 124
+#define IDI_FOLDERARROW 125
+#define IDI_ARROW 125
+#define IDI_ARROW_SELECTED 126
+#define IDI_SHUTDOWN 127
+#define IDB_LOGOV 129
+#define IDB_LOGOV256 130
+#define IDA_SEARCH_PROGRAM 133
+#define IDI_APPICON 134
+#define IDA_TRAYNOTIFY 134
+#define IDI_FLOATING 135
+#define IDD_ABOUT_EXPLORER 135
+#define IDI_REACTOS_BIG 137
+#define IDI_DOCUMENTS 138
+#define IDI_CONFIG 139
+#define IDI_FAVORITES 140
+#define IDI_INFO 141
+#define IDI_APPS 142
+#define IDI_SEARCH 143
+#define IDI_ACTION 144
+#define IDI_FOLDER 145
+#define IDI_SEARCH_DOC 146
+#define IDI_PRINTER 147
+#define IDI_NETWORK 148
+#define IDI_COMPUTER 149
+#define IDM_DESKTOPBAR 150
+#define IDM_VOLUME 151
+#define IDM_NOTIFYAREA 152
+#define IDD_DESKBAR_TASKBAR 153
+#define IDB_ICON_ALIGN_0 153
+#define IDD_DESKBAR_STARTMENU 154
+#define IDB_ICON_ALIGN_1 154
+#define IDB_ICON_ALIGN_2 155
+#define IDD_NOTIFYAREA 155
+#define IDB_ICON_ALIGN_3 156
+#define IDD_MDI_SDI 156
+#define IDB_ICON_ALIGN_4 157
+#define IDB_ICON_ALIGN_5 158
+#define IDB_ICON_ALIGN_6 159
+#define IDB_ICON_ALIGN_7 160
+#define IDB_ICON_ALIGN_8 161
+#define IDB_ICON_ALIGN_9 162
+#define IDI_SPEAKER 162
+#define IDB_ICON_ALIGN_10 163
+#define IDI_DOT 163
+#define IDB_LOGOV16 164
+#define IDI_DOT_TRANS 164
+#define IDI_DOT_RED 165
+#define IDI_ARROW_UP 166
+#define IDI_ARROW_DOWN 167
+#define IDI_NOTIFY_L 168
+#define IDI_NOTIFY_R 169
+#define IDB_MDI 170
+#define IDB_SDI 171
+#define IDI_MINIMIZE 172
+#define IDI_CONTROLPAN 173
+#define IDI_DESKSETTING 174
+#define IDI_NETCONNS 175
+#define IDI_ADMIN 176
+#define IDI_RECENT 178
+#define ID_VIEW_NAME 401
+#define ID_VIEW_ALL_ATTRIBUTES 402
+#define ID_VIEW_SELECTED_ATTRIBUTES 403
+#define ID_VIEW_STATUSBAR 503
+#define ID_VIEW_DRIVE_BAR 507
+#define ID_VIEW_TOOL_BAR 508
+#define ID_VIEW_EXTRA_BAR 509
+#define ID_VIEW_SIDE_BAR 510
+#define IDC_ROS_EXPLORER 1000
+#define IDC_ICON_ALIGN_0 1002
+#define IDC_ICON_ALIGN_1 1003
+#define IDC_NOTIFY_ICONS 1003
+#define IDC_ICON_ALIGN_2 1004
+#define IDC_ICON_ALIGN_3 1005
+#define IDC_ICON_ALIGN_4 1006
+#define IDC_NOTIFY_TOOLTIP 1006
+#define IDC_ICON_ALIGN_5 1007
+#define IDC_NOTIFY_TITLE 1007
+#define IDC_ICON_ALIGN_6 1008
+#define IDC_NOTIFY_MODULE 1008
+#define IDC_ICON_ALIGN_7 1009
+#define IDC_LABEL1 1009
+#define IDC_ICON_ALIGN_8 1010
+#define IDC_LABEL2 1010
+#define IDC_ICON_ALIGN_9 1011
+#define IDC_LABEL3 1011
+#define IDC_ICON_ALIGN_10 1012
+#define IDC_WWW 1012
+#define IDC_LABEL6 1012
+#define IDC_ICON_ALIGN_11 1013
+#define IDC_LAST_CHANGE 1013
+#define IDC_FILTER 1017
+#define IDC_PROGRAMS_FOUND 1018
+#define IDC_PICTURE 1019
+#define IDC_NOTIFY_SHOW 1020
+#define IDC_NOTIFY_HIDE 1021
+#define IDC_NOTIFY_AUTOHIDE 1022
+#define IDC_LABEL4 1023
+#define ID_HIDE_INACTIVE_ICONS 1025
+#define ID_SHOW_CLOCK 1026
+#define ID_DESKTOP_VERSION 1027
+#define IDC_BUTTON1 1028
+#define IDC_CHECK_ENTRIES 1028
+#define IDC_VERSION_TXT 1029
+#define IDC_WIN_VERSION 1030
+#define IDC_MDI 1030
+#define IDC_SDI 1031
+#define IDC_SEPARATE_SUBFOLDERS 1034
+#define ID_REFRESH 1704
+#define IDS_VERSION_STR 5000
+#define IDS_EXPLORER_VERSION_STR 5001
+#define IDC_FILETREE 10001
+#define ID_EXPLORER_FAQ 10002
+#define ID_WEB_WINDOW 10003
+#define ID_WINDOW_AUTOSORT 0x8003
+#define ID_VIEW_FULLSCREEN 0x8004
+#define ID_PREFERED_SIZES 0x8005
+#define ID_DRIVE_DESKTOP 0x9000
+#define ID_DRIVE_SHELL_NS 0x9001
+#define ID_DRIVE_UNIX_FS 0x9002
+#define ID_DRIVE_NTOBJ_NS 0x9003
+#define ID_DRIVE_REGISTRY 0x9004
+#define ID_DRIVE_FAT 0x9005
+#define ID_DRIVE_FIRST 0x9006
+#define ID_ABOUT_WINDOWS 40002
+#define ID_ABOUT_EXPLORER 40003
+#define ID_DESKTOPBAR_SETTINGS 40004
+#define ID_GO_BACK 40005
+#define ID_GO_FORWARD 40006
+#define ID_GO_HOME 40007
+#define ID_GO_SEARCH 40008
+#define ID_GO_UP 40009
+#define ID_STOP 40010
+#define ID_MINIMIZE_ALL 40011
+#define ID_EXPLORE 40012
+#define ID_TASKMGR 40013
+#define ID_TRAY_VOLUME 40014
+#define ID_VOLUME_PROPERTIES 40015
+#define ID_SHOW_HIDDEN_ICONS 40016
+#define ID_CONFIG_NOTIFYAREA 40017
+#define ID_CONFIG_TIME 40018
+#define ID_VIEW_MDI 40019
+#define ID_VIEW_SDI 40020
+#define ID_TOOLS_OPTIONS 40021
+#define ID_SHOW_ICON_BUTTON 40023
+#define ID_SWITCH_DESKTOP_1 50000
+#define ID_WINDOW_NEW 0xE130
+#define ID_WINDOW_ARRANGE 0xE131
+#define ID_WINDOW_CASCADE 0xE132
+#define ID_WINDOW_TILE_HORZ 0xE133
+#define ID_WINDOW_TILE_VERT 0xE134
+#define ID_WINDOW_SPLIT 0xE135
+#define ID_EDIT_PROPERTIES 57656
+#define ID_FILE_EXIT 0xE141
+#define ID_HELP_USING 0xE144
+#define ID_HELP 0xE146
+#define IDC_STATIC -1
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 169
+#define _APS_NEXT_COMMAND_VALUE 40024
+#define _APS_NEXT_CONTROL_VALUE 1035
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
--- /dev/null
+# Microsoft Developer Studio Project File - Name="rosshell" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=rosshell - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "rosshell.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "rosshell.mak" CFG="rosshell - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "rosshell - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "rosshell - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "rosshell - Win32 Debug Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "rosshell - Win32 Unicode Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "rosshell - Win32 Unicode Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF "$(CFG)" == "rosshell - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /nologo /MD /W3 /GR /GX /O1 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /Yu"precomp.h" /FD /c\r
+# ADD BASE RSC /l 0x407 /d "NDEBUG"\r
+# ADD RSC /l 0x407 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF "$(CFG)" == "rosshell - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /FR /Yu"precomp.h" /FD /GZ /c\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 kernel32.lib shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF "$(CFG)" == "rosshell - Win32 Debug Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "DRelease"\r
+# PROP BASE Intermediate_Dir "DRelease"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "DRelease"\r
+# PROP Intermediate_Dir "DRelease"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_ROS_" /YX /FD /c\r
+# ADD CPP /nologo /MD /W3 /GR /GX /Zi /O2 /D "NDEBUG" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /FR /Yu"precomp.h" /FD /c\r
+# ADD BASE RSC /l 0x407 /d "NDEBUG"\r
+# ADD RSC /l 0x407 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /delayload:oleaut32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF "$(CFG)" == "rosshell - Win32 Unicode Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "URelease"\r
+# PROP BASE Intermediate_Dir "URelease"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "URelease"\r
+# PROP Intermediate_Dir "URelease"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /YX /FD /c\r
+# ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /Yu"precomp.h" /FD /c\r
+# ADD BASE RSC /l 0x407 /d "NDEBUG"\r
+# ADD RSC /l 0x407 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /machine:I386 /libpath:"Release" /delayload:oleaut32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ELSEIF "$(CFG)" == "rosshell - Win32 Unicode Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "UDebug"\r
+# PROP BASE Intermediate_Dir "UDebug"\r
+# PROP BASE Ignore_Export_Lib 0\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "UDebug"\r
+# PROP Intermediate_Dir "UDebug"\r
+# PROP Ignore_Export_Lib 0\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "UNICODE" /D "_ROS_" /FR /YX /FD /GZ /c\r
+# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "UNICODE" /D "WIN32" /D _WIN32_IE=0x0600 /D _WIN32_WINNT=0x0501 /D "ROSSHELL" /FR /Yu"precomp.h" /FD /GZ /c\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib comctl32.lib shell32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 shell32.lib comctl32.lib gdi32.lib user32.lib advapi32.lib ole32.lib delayimp.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"Debug" /delayload:oleaut32.dll /delayload:wsock32.dll\r
+# SUBTRACT LINK32 /pdb:none\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "rosshell - Win32 Release"\r
+# Name "rosshell - Win32 Debug"\r
+# Name "rosshell - Win32 Debug Release"\r
+# Name "rosshell - Win32 Unicode Release"\r
+# Name "rosshell - Win32 Unicode Debug"\r
+# Begin Group "utility"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\dragdropimpl.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\dragdropimpl.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\shellbrowserimpl.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\shellbrowserimpl.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\shellclasses.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\shellclasses.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\treedroptarget.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\utility.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\utility.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\window.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\window.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\xmlstorage.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\utility\xmlstorage.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "resources"\r
+\r
+# PROP Default_Filter "bmp,ico"\r
+# Begin Source File\r
+\r
+SOURCE=.\res\action.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\appicon.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\apps.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\arrow.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\arrow_dwn.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\arrow_up.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\arrowsel.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\computer.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\config.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\documents.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\dot.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\dot_red.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\dot_trans.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\drivebar.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\explorer-jp.rc"\r
+# PROP Exclude_From_Build 1\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\explorer.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\resource.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\explorer_intres.rc\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\favorites.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\floating.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\folder.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoali10.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig0.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig1.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig2.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig3.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig4.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig5.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig6.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig7.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig8.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\icoalig9.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\images.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\info.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\logoff.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\logov.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\logov16.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\logov256.bmp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\network.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\notify_l.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\notify_r.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\printer.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\reactos.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\res\ros-big.ico"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\res\search-doc.ico"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\search.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\speaker.ico\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\res\startmenu.ico\r
+# End Source File\r
+# End Group\r
+# Begin Group "taskbar"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\desktopbar.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\desktopbar.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\favorites.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\favorites.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\notifyhook\notifyhook.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\quicklaunch.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\quicklaunch.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\startmenu.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\startmenu.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\taskbar.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\taskbar.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\traynotify.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\taskbar\traynotify.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "desktop"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\desktop\desktop.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\desktop\desktop.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "shell"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\entries.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\entries.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\filechild.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\pane.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\pane.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\shellbrowser.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\shellfs.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\shellfs.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\winfs.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shell\winfs.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "dialogs"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\dialogs\searchprogram.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\dialogs\searchprogram.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\dialogs\settings.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\dialogs\settings.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "main"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\explorer.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\explorer.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\externals.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\globals.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\i386-stub-win32.c"\r
+# SUBTRACT CPP /YX /Yc /Yu\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\precomp.cpp\r
+# ADD CPP /Yc"precomp.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\precomp.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "services"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=.\services\shellservices.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\services\shellservices.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\services\startup.c\r
+# SUBTRACT CPP /YX /Yc /Yu\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
--- /dev/null
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r
+\r
+###############################################################################\r
+\r
+Project: "rosshell"=.\rosshell.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+ Begin Project Dependency\r
+ Project_Dep_Name notifyhook\r
+ End Project Dependency\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "make_rosshell"=.\make_rosshell.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Project: "notifyhook"=.\notifyhook\notifyhook.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
--- /dev/null
+/*
+ * Copyright 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // shellservices.cpp
+ //
+ // Martin Fuchs, 28.03.2005
+ //
+
+
+#include <precomp.h>
+
+#include "shellservices.h"
+
+
+int SSOThread::Run()
+{
+ ComInit usingCOM(COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE|COINIT_SPEED_OVER_MEMORY);
+
+ HKEY hkey;
+ CLSID clsid;
+ WCHAR name[MAX_PATH], value[MAX_PATH];
+
+ typedef vector<SIfacePtr<IOleCommandTarget>*> SSOVector;
+ SSOVector sso_ptrs;
+
+ if (!RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad"), &hkey)) {
+ for(int idx=0; ; ++idx) {
+ DWORD name_len = MAX_PATH;
+ DWORD value_len = sizeof(value);
+
+ if (RegEnumValueW(hkey, idx, name, &name_len, 0, NULL, (LPBYTE)&value, &value_len))
+ break;
+
+ if (!_alive)
+ break;
+
+ SIfacePtr<IOleCommandTarget>* sso_ptr = new SIfacePtr<IOleCommandTarget>;
+
+ if (CLSIDFromString(value, &clsid) == NOERROR) {
+ if (SUCCEEDED(sso_ptr->CreateInstance(clsid, IID_IOleCommandTarget))) {
+ if (SUCCEEDED((*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_NEW, OLECMDEXECOPT_DODEFAULT, NULL, NULL)))
+ sso_ptrs.push_back(sso_ptr);
+ }
+ }
+ }
+
+ RegCloseKey(hkey);
+ }
+
+ if (!sso_ptrs.empty()) {
+ MSG msg;
+
+ while(_alive) {
+ if (MsgWaitForMultipleObjects(1, &_evtFinish, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0+0)
+ break; // _evtFinish has been set.
+
+ while(_alive) {
+ if (!PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
+ break;
+
+ if (msg.message == WM_QUIT)
+ break;
+
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ }
+
+ // shutdown all running Shell Service Objects
+ for(SSOVector::iterator it=sso_ptrs.begin(); it!=sso_ptrs.end(); ++it) {
+ SIfacePtr<IOleCommandTarget>* sso_ptr = *it;
+ (*sso_ptr)->Exec(&CGID_ShellServiceObject, OLECMDID_SAVE, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
+ delete sso_ptr;
+ }
+ }
+
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // shellservices.h
+ //
+ // Martin Fuchs, 28.03.2005
+ //
+
+
+ // launch start programs
+extern "C" int startup(int argc, char *argv[]);
+
+ // load Shell Service Objects (volume control, printer/network icons, ...)
+struct SSOThread : public Thread
+{
+ int Run();
+};
--- /dev/null
+/*
+ * Copyright (C) 2002 Andreas Mohr
+ * Copyright (C) 2002 Shachar Shemesh
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* Based on the Wine "bootup" handler application
+ *
+ * This app handles the various "hooks" windows allows for applications to perform
+ * as part of the bootstrap process. Theses are roughly devided into three types.
+ * Knowledge base articles that explain this are 137367, 179365, 232487 and 232509.
+ * Also, 119941 has some info on grpconv.exe
+ * The operations performed are (by order of execution):
+ *
+ * Preboot (prior to fully loading the Windows kernel):
+ * - wininit.exe (rename operations left in wininit.ini - Win 9x only)
+ * - PendingRenameOperations (rename operations left in the registry - Win NT+ only)
+ *
+ * Startup (before the user logs in)
+ * - Services (NT, ?semi-synchronous?, not implemented yet)
+ * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce (9x, asynch)
+ * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices (9x, asynch)
+ *
+ * After log in
+ * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce (all, synch)
+ * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run (all, asynch)
+ * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (all, asynch)
+ * - Startup folders (all, ?asynch?, no imp)
+ * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce (all, asynch)
+ *
+ * Somewhere in there is processing the RunOnceEx entries (also no imp)
+ *
+ * Bugs:
+ * - If a pending rename registry does not start with \??\ the entry is
+ * processed anyways. I'm not sure that is the Windows behaviour.
+ * - Need to check what is the windows behaviour when trying to delete files
+ * and directories that are read-only
+ * - In the pending rename registry processing - there are no traces of the files
+ * processed (requires translations from Unicode to Ansi).
+ */
+
+#include <stdio.h>
+#include <windows.h>
+#include <ctype.h>
+
+/**
+ * Performs the rename operations dictated in %SystemRoot%\Wininit.ini.
+ * Returns FALSE if there was an error, or otherwise if all is ok.
+ */
+static BOOL wininit()
+{
+ return TRUE;
+}
+
+static BOOL pendingRename()
+{
+ static const WCHAR ValueName[] = {'P','e','n','d','i','n','g',
+ 'F','i','l','e','R','e','n','a','m','e',
+ 'O','p','e','r','a','t','i','o','n','s',0};
+ static const WCHAR SessionW[] = { 'S','y','s','t','e','m','\\',
+ 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+ 'C','o','n','t','r','o','l','\\',
+ 'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r',0};
+ WCHAR *buffer=NULL;
+ const WCHAR *src=NULL, *dst=NULL;
+ DWORD dataLength=0;
+ HKEY hSession=NULL;
+ DWORD res;
+
+ printf("Entered\n");
+
+ if ((res=RegOpenKeyExW(HKEY_LOCAL_MACHINE, SessionW, 0, KEY_ALL_ACCESS, &hSession))
+ !=ERROR_SUCCESS)
+ {
+ if (res==ERROR_FILE_NOT_FOUND)
+ {
+ printf("The key was not found - skipping\n");
+ res=TRUE;
+ }
+ else
+ {
+ printf("Couldn't open key, error %ld\n", res);
+ res=FALSE;
+ }
+
+ goto end;
+ }
+
+ res=RegQueryValueExW(hSession, ValueName, NULL, NULL /* The value type does not really interest us, as it is not
+ truely a REG_MULTI_SZ anyways */,
+ NULL, &dataLength);
+ if (res==ERROR_FILE_NOT_FOUND)
+ {
+ /* No value - nothing to do. Great! */
+ printf("Value not present - nothing to rename\n");
+ res=TRUE;
+ goto end;
+ }
+
+ if (res!=ERROR_SUCCESS)
+ {
+ printf("Couldn't query value's length (%ld)\n", res);
+ res=FALSE;
+ goto end;
+ }
+
+ buffer=malloc(dataLength);
+ if (buffer==NULL)
+ {
+ printf("Couldn't allocate %lu bytes for the value\n", dataLength);
+ res=FALSE;
+ goto end;
+ }
+
+ res=RegQueryValueExW(hSession, ValueName, NULL, NULL, (LPBYTE)buffer, &dataLength);
+ if (res!=ERROR_SUCCESS)
+ {
+ printf("Couldn't query value after successfully querying before (%lu),\n"
+ "please report to wine-devel@winehq.org\n", res);
+ res=FALSE;
+ goto end;
+ }
+
+ /* Make sure that the data is long enough and ends with two NULLs. This
+ * simplifies the code later on.
+ */
+ if (dataLength<2*sizeof(buffer[0]) ||
+ buffer[dataLength/sizeof(buffer[0])-1]!='\0' ||
+ buffer[dataLength/sizeof(buffer[0])-2]!='\0')
+ {
+ printf("Improper value format - doesn't end with NULL\n");
+ res=FALSE;
+ goto end;
+ }
+
+ for(src=buffer; (src-buffer)*sizeof(src[0])<dataLength && *src!='\0';
+ src=dst+lstrlenW(dst)+1)
+ {
+ DWORD dwFlags=0;
+
+ printf("processing next command\n");
+
+ dst=src+lstrlenW(src)+1;
+
+ /* We need to skip the \??\ header */
+ if (src[0]=='\\' && src[1]=='?' && src[2]=='?' && src[3]=='\\')
+ src+=4;
+
+ if (dst[0]=='!')
+ {
+ dwFlags|=MOVEFILE_REPLACE_EXISTING;
+ dst++;
+ }
+
+ if (dst[0]=='\\' && dst[1]=='?' && dst[2]=='?' && dst[3]=='\\')
+ dst+=4;
+
+ if (*dst!='\0')
+ {
+ /* Rename the file */
+ MoveFileExW(src, dst, dwFlags);
+ } else
+ {
+ /* Delete the file or directory */
+ res = GetFileAttributesW (src);
+ if (res != (DWORD)-1)
+ {
+ if ((res&FILE_ATTRIBUTE_DIRECTORY)==0)
+ {
+ /* It's a file */
+ DeleteFileW(src);
+ } else
+ {
+ /* It's a directory */
+ RemoveDirectoryW(src);
+ }
+ } else
+ {
+ printf("couldn't get file attributes (%ld)\n", GetLastError());
+ }
+ }
+ }
+
+ if ((res=RegDeleteValueW(hSession, ValueName))!=ERROR_SUCCESS)
+ {
+ printf("Error deleting the value (%lu)\n", GetLastError());
+ res=FALSE;
+ } else
+ res=TRUE;
+
+end:
+ if (buffer!=NULL)
+ free(buffer);
+
+ if (hSession!=NULL)
+ RegCloseKey(hSession);
+
+ return res;
+}
+
+enum runkeys {
+ RUNKEY_RUN, RUNKEY_RUNONCE, RUNKEY_RUNSERVICES, RUNKEY_RUNSERVICESONCE
+};
+
+const WCHAR runkeys_names[][30]=
+{
+ {'R','u','n',0},
+ {'R','u','n','O','n','c','e',0},
+ {'R','u','n','S','e','r','v','i','c','e','s',0},
+ {'R','u','n','S','e','r','v','i','c','e','s','O','n','c','e',0}
+};
+
+#define INVALID_RUNCMD_RETURN -1
+/**
+ * This function runs the specified command in the specified dir.
+ * [in,out] cmdline - the command line to run. The function may change the passed buffer.
+ * [in] dir - the dir to run the command in. If it is NULL, then the current dir is used.
+ * [in] wait - whether to wait for the run program to finish before returning.
+ * [in] minimized - Whether to ask the program to run minimized.
+ *
+ * Returns:
+ * If running the process failed, returns INVALID_RUNCMD_RETURN. Use GetLastError to get the error code.
+ * If wait is FALSE - returns 0 if successful.
+ * If wait is TRUE - returns the program's return value.
+ */
+static int runCmd(LPWSTR cmdline, LPCWSTR dir, BOOL wait, BOOL minimized)
+{
+ STARTUPINFOW si;
+ PROCESS_INFORMATION info;
+ DWORD exit_code=0;
+
+ memset(&si, 0, sizeof(si));
+ si.cb=sizeof(si);
+ if (minimized)
+ {
+ si.dwFlags=STARTF_USESHOWWINDOW;
+ si.wShowWindow=SW_MINIMIZE;
+ }
+ memset(&info, 0, sizeof(info));
+
+ if (!CreateProcessW(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, dir, &si, &info))
+ {
+ printf("Failed to run command (%ld)\n", GetLastError());
+
+ return INVALID_RUNCMD_RETURN;
+ }
+
+ printf("Successfully ran command\n"); //%s - Created process handle %p\n",
+ //wine_dbgstr_w(cmdline), info.hProcess);
+
+ if (wait)
+ { /* wait for the process to exit */
+ WaitForSingleObject(info.hProcess, INFINITE);
+ GetExitCodeProcess(info.hProcess, &exit_code);
+ }
+
+ CloseHandle(info.hProcess);
+
+ return exit_code;
+}
+
+/**
+ * Process a "Run" type registry key.
+ * hkRoot is the HKEY from which "Software\Microsoft\Windows\CurrentVersion" is
+ * opened.
+ * szKeyName is the key holding the actual entries.
+ * bDelete tells whether we should delete each value right before executing it.
+ * bSynchronous tells whether we should wait for the prog to complete before
+ * going on to the next prog.
+ */
+static BOOL ProcessRunKeys(HKEY hkRoot, LPCWSTR szKeyName, BOOL bDelete,
+ BOOL bSynchronous)
+{
+ static const WCHAR WINKEY_NAME[]={'S','o','f','t','w','a','r','e','\\',
+ 'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\',
+ 'C','u','r','r','e','n','t','V','e','r','s','i','o','n',0};
+ HKEY hkWin=NULL, hkRun=NULL;
+ LONG res=ERROR_SUCCESS;
+ DWORD i, nMaxCmdLine=0, nMaxValue=0;
+ WCHAR *szCmdLine=NULL;
+ WCHAR *szValue=NULL;
+
+ if (hkRoot==HKEY_LOCAL_MACHINE)
+ wprintf(L"processing %s entries under HKLM\n", szKeyName);
+ else
+ wprintf(L"processing %s entries under HKCU\n", szKeyName);
+
+ if ((res=RegOpenKeyExW(hkRoot, WINKEY_NAME, 0, KEY_READ, &hkWin))!=ERROR_SUCCESS)
+ {
+ printf("RegOpenKey failed on Software\\Microsoft\\Windows\\CurrentVersion (%ld)\n",
+ res);
+
+ goto end;
+ }
+
+ if ((res=RegOpenKeyExW(hkWin, szKeyName, 0, bDelete?KEY_ALL_ACCESS:KEY_READ, &hkRun))!=
+ ERROR_SUCCESS)
+ {
+ if (res==ERROR_FILE_NOT_FOUND)
+ {
+ printf("Key doesn't exist - nothing to be done\n");
+
+ res=ERROR_SUCCESS;
+ }
+ else
+ printf("RegOpenKey failed on run key (%ld)\n", res);
+
+ goto end;
+ }
+
+ if ((res=RegQueryInfoKeyW(hkRun, NULL, NULL, NULL, NULL, NULL, NULL, &i, &nMaxValue,
+ &nMaxCmdLine, NULL, NULL))!=ERROR_SUCCESS)
+ {
+ printf("Couldn't query key info (%ld)\n", res);
+
+ goto end;
+ }
+
+ if (i==0)
+ {
+ printf("No commands to execute.\n");
+
+ res=ERROR_SUCCESS;
+ goto end;
+ }
+
+ if ((szCmdLine=malloc(nMaxCmdLine))==NULL)
+ {
+ printf("Couldn't allocate memory for the commands to be executed\n");
+
+ res=ERROR_NOT_ENOUGH_MEMORY;
+ goto end;
+ }
+
+ if ((szValue=malloc((++nMaxValue)*sizeof(*szValue)))==NULL)
+ {
+ printf("Couldn't allocate memory for the value names\n");
+
+ res=ERROR_NOT_ENOUGH_MEMORY;
+ goto end;
+ }
+
+ while(i>0)
+ {
+ DWORD nValLength=nMaxValue, nDataLength=nMaxCmdLine;
+ DWORD type;
+
+ --i;
+
+ if ((res=RegEnumValueW(hkRun, i, szValue, &nValLength, 0, &type,
+ (LPBYTE)szCmdLine, &nDataLength))!=ERROR_SUCCESS)
+ {
+ printf("Couldn't read in value %ld - %ld\n", i, res);
+
+ continue;
+ }
+
+ if (bDelete && (res=RegDeleteValueW(hkRun, szValue))!=ERROR_SUCCESS)
+ {
+ printf("Couldn't delete value - %ld, %ld. Running command anyways.\n", i, res);
+ }
+
+ if (type!=REG_SZ)
+ {
+ printf("Incorrect type of value #%ld (%ld)\n", i, type);
+
+ continue;
+ }
+
+ if ((res=runCmd(szCmdLine, NULL, bSynchronous, FALSE))==INVALID_RUNCMD_RETURN)
+ {
+ printf("Error running cmd #%ld (%ld)\n", i, GetLastError());
+ }
+
+ printf("Done processing cmd #%ld\n", i);
+ }
+
+ res=ERROR_SUCCESS;
+
+end:
+ if (hkRun!=NULL)
+ RegCloseKey(hkRun);
+ if (hkWin!=NULL)
+ RegCloseKey(hkWin);
+
+ printf("done\n");
+
+ return res==ERROR_SUCCESS?TRUE:FALSE;
+}
+
+ /// structure holding startup flags
+struct op_mask {
+ BOOL w9xonly; /* Perform only operations done on Windows 9x */
+ BOOL ntonly; /* Perform only operations done on Windows NT */
+ BOOL startup; /* Perform the operations that are performed every boot */
+ BOOL preboot; /* Perform file renames typically done before the system starts */
+ BOOL prelogin; /* Perform the operations typically done before the user logs in */
+ BOOL postlogin; /* Operations done after login */
+};
+
+static const struct op_mask
+ SESSION_START = {FALSE, FALSE, TRUE, TRUE, TRUE, TRUE},
+ SETUP = {FALSE, FALSE, FALSE, TRUE, TRUE, TRUE};
+#define DEFAULT SESSION_START
+
+int startup(int argc, char *argv[])
+{
+ struct op_mask ops; /* Which of the ops do we want to perform? */
+ /* First, set the current directory to SystemRoot */
+ TCHAR gen_path[MAX_PATH];
+ DWORD res;
+
+ res = GetWindowsDirectory(gen_path, sizeof(gen_path));
+
+ if (res==0)
+ {
+ printf("Couldn't get the windows directory - error %ld\n",
+ GetLastError());
+
+ return 100;
+ }
+
+ if (res>=sizeof(gen_path))
+ {
+ printf("Windows path too long (%ld)\n", res);
+
+ return 100;
+ }
+
+ if (!SetCurrentDirectory(gen_path))
+ {
+ wprintf(L"Cannot set the dir to %s (%ld)\n", gen_path, GetLastError());
+
+ return 100;
+ }
+
+ if (argc>1)
+ {
+ switch(argv[1][0])
+ {
+ case 'r': /* Restart */
+ ops=SETUP;
+ break;
+ case 's': /* Full start */
+ ops=SESSION_START;
+ break;
+ default:
+ ops=DEFAULT;
+ break;
+ }
+ } else
+ ops=DEFAULT;
+
+ /* Perform the ops by order, stopping if one fails, skipping if necessary */
+ /* Shachar: Sorry for the perl syntax */
+ res=(ops.ntonly || !ops.preboot || wininit()) &&
+ (ops.w9xonly || !ops.preboot || pendingRename()) &&
+ (ops.ntonly || !ops.prelogin ||
+ ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNSERVICESONCE], TRUE, FALSE)) &&
+ (ops.ntonly || !ops.prelogin || !ops.startup ||
+ ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNSERVICES], FALSE, FALSE)) &&
+ (!ops.postlogin ||
+ ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNONCE], TRUE, TRUE)) &&
+ (!ops.postlogin || !ops.startup ||
+ ProcessRunKeys(HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUN], FALSE, FALSE)) &&
+ (!ops.postlogin || !ops.startup ||
+ ProcessRunKeys(HKEY_CURRENT_USER, runkeys_names[RUNKEY_RUN], FALSE, FALSE));
+
+ printf("Operation done\n");
+
+ return res?0:101;
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // entries.cpp
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#include <precomp.h>
+
+//#include "entries.h"
+
+
+ // allocate and initialise a directory entry
+Entry::Entry(ENTRY_TYPE etype)
+ : _etype(etype)
+{
+ _up = NULL;
+ _next = NULL;
+ _down = NULL;
+ _expanded = false;
+ _scanned = false;
+ _bhfi_valid = false;
+ _level = 0;
+ _icon_id = ICID_UNKNOWN;
+ _display_name = _data.cFileName;
+ _type_name = NULL;
+ _content = NULL;
+}
+
+Entry::Entry(Entry* parent, ENTRY_TYPE etype)
+ : _up(parent),
+ _etype(etype)
+{
+ _next = NULL;
+ _down = NULL;
+ _expanded = false;
+ _scanned = false;
+ _bhfi_valid = false;
+ _level = 0;
+ _icon_id = ICID_UNKNOWN;
+ _shell_attribs = 0;
+ _display_name = _data.cFileName;
+ _type_name = NULL;
+ _content = NULL;
+}
+
+Entry::Entry(const Entry& other)
+{
+ _next = NULL;
+ _down = NULL;
+ _up = NULL;
+
+ assert(!other._next);
+ assert(!other._down);
+ assert(!other._up);
+
+ _expanded = other._expanded;
+ _scanned = other._scanned;
+ _level = other._level;
+
+ _data = other._data;
+
+ _shell_attribs = other._shell_attribs;
+ _display_name = other._display_name==other._data.cFileName? _data.cFileName: _tcsdup(other._display_name);
+ _type_name = other._type_name? _tcsdup(other._type_name): NULL;
+ _content = other._content? _tcsdup(other._content): NULL;
+
+ _etype = other._etype;
+ _icon_id = other._icon_id;
+
+ _bhfi = other._bhfi;
+ _bhfi_valid = other._bhfi_valid;
+}
+
+ // free a directory entry
+Entry::~Entry()
+{
+ if (_icon_id > ICID_NONE)
+ g_Globals._icon_cache.free_icon(_icon_id);
+
+ if (_display_name != _data.cFileName)
+ free(_display_name);
+
+ if (_type_name)
+ free(_type_name);
+
+ if (_content)
+ free(_content);
+}
+
+
+ // read directory tree and expand to the given location
+Entry* Entry::read_tree(const void* path, SORT_ORDER sortOrder, int scan_flags)
+{
+ CONTEXT("Entry::read_tree()");
+
+ WaitCursor wait;
+
+ Entry* entry = this;
+
+ for(const void*p=path; p && entry; ) {
+ entry->smart_scan(sortOrder, scan_flags);
+
+ if (entry->_down)
+ entry->_expanded = true;
+
+ Entry* found = entry->find_entry(p);
+ p = entry->get_next_path_component(p);
+
+ entry = found;
+ }
+
+ return entry;
+}
+
+
+void Entry::read_directory_base(SORT_ORDER sortOrder, int scan_flags)
+{
+ CONTEXT("Entry::read_directory_base()");
+
+ // call into subclass
+ read_directory(scan_flags);
+
+#ifndef ROSSHELL
+ if (g_Globals._prescan_nodes) { //@todo _prescan_nodes should not be used for reading the start menu.
+ for(Entry*entry=_down; entry; entry=entry->_next)
+ if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ entry->read_directory(scan_flags);
+ entry->sort_directory(sortOrder);
+ }
+ }
+#endif
+
+ sort_directory(sortOrder);
+}
+
+
+Root::Root()
+{
+ memset(this, 0, sizeof(Root));
+}
+
+Root::~Root()
+{
+ if (_entry) {
+ _entry->free_subentries();
+ delete _entry;
+ }
+}
+
+
+ // sort order for different directory/file types
+enum TYPE_ORDER {
+ TO_DIR,
+ TO_DOT,
+ TO_DOTDOT,
+ TO_OTHER_DIR,
+ TO_VIRTUAL_FOLDER,
+ TO_FILE
+};
+
+ // distinguish between ".", ".." and any other directory names
+static TYPE_ORDER TypeOrderFromDirname(LPCTSTR name)
+{
+ if (name[0] == '.') {
+ if (name[1] == '\0')
+ return TO_DOT; // "."
+
+ if (name[1]=='.' && name[2]=='\0')
+ return TO_DOTDOT; // ".."
+ }
+
+ return TO_OTHER_DIR; // any other directory
+}
+
+ // directories first...
+static int compareType(const Entry* entry1, const Entry* entry2)
+{
+ const WIN32_FIND_DATA* fd1 = &entry1->_data;
+ const WIN32_FIND_DATA* fd2 = &entry2->_data;
+
+ TYPE_ORDER order1 = fd1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY? TO_DIR: TO_FILE;
+ TYPE_ORDER order2 = fd2->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY? TO_DIR: TO_FILE;
+
+ // Handle "." and ".." as special case and move them at the very first beginning.
+ if (order1==TO_DIR && order2==TO_DIR) {
+ order1 = TypeOrderFromDirname(fd1->cFileName);
+ order2 = TypeOrderFromDirname(fd2->cFileName);
+
+ // Move virtual folders after physical folders
+ if (!(entry1->_shell_attribs & SFGAO_FILESYSTEM))
+ order1 = TO_VIRTUAL_FOLDER;
+
+ if (!(entry2->_shell_attribs & SFGAO_FILESYSTEM))
+ order2 = TO_VIRTUAL_FOLDER;
+ }
+
+ return order2==order1? 0: order1<order2? -1: 1;
+}
+
+
+static int compareNothing(const void* arg1, const void* arg2)
+{
+ return -1;
+}
+
+static int compareName(const void* arg1, const void* arg2)
+{
+ const Entry* entry1 = *(const Entry**)arg1;
+ const Entry* entry2 = *(const Entry**)arg2;
+
+ int cmp = compareType(entry1, entry2);
+ if (cmp)
+ return cmp;
+
+ return lstrcmpi(entry1->_data.cFileName, entry2->_data.cFileName);
+}
+
+static int compareExt(const void* arg1, const void* arg2)
+{
+ const Entry* entry1 = *(const Entry**)arg1;
+ const Entry* entry2 = *(const Entry**)arg2;
+ const TCHAR *name1, *name2, *ext1, *ext2;
+
+ int cmp = compareType(entry1, entry2);
+ if (cmp)
+ return cmp;
+
+ name1 = entry1->_data.cFileName;
+ name2 = entry2->_data.cFileName;
+
+ ext1 = _tcsrchr(name1, TEXT('.'));
+ ext2 = _tcsrchr(name2, TEXT('.'));
+
+ if (ext1)
+ ++ext1;
+ else
+ ext1 = TEXT("");
+
+ if (ext2)
+ ++ext2;
+ else
+ ext2 = TEXT("");
+
+ cmp = lstrcmpi(ext1, ext2);
+ if (cmp)
+ return cmp;
+
+ return lstrcmpi(name1, name2);
+}
+
+static int compareSize(const void* arg1, const void* arg2)
+{
+ const Entry* entry1 = *(const Entry**)arg1;
+ const Entry* entry2 = *(const Entry**)arg2;
+
+ int cmp = compareType(entry1, entry2);
+ if (cmp)
+ return cmp;
+
+ cmp = entry2->_data.nFileSizeHigh - entry1->_data.nFileSizeHigh;
+
+ if (cmp < 0)
+ return -1;
+ else if (cmp > 0)
+ return 1;
+
+ cmp = entry2->_data.nFileSizeLow - entry1->_data.nFileSizeLow;
+
+ return cmp<0? -1: cmp>0? 1: 0;
+}
+
+static int compareDate(const void* arg1, const void* arg2)
+{
+ const Entry* entry1 = *(const Entry**)arg1;
+ const Entry* entry2 = *(const Entry**)arg2;
+
+ int cmp = compareType(entry1, entry2);
+ if (cmp)
+ return cmp;
+
+ return CompareFileTime(&entry2->_data.ftLastWriteTime, &entry1->_data.ftLastWriteTime);
+}
+
+
+static int (*sortFunctions[])(const void* arg1, const void* arg2) = {
+ compareNothing, // SORT_NONE
+ compareName, // SORT_NAME
+ compareExt, // SORT_EXT
+ compareSize, // SORT_SIZE
+ compareDate // SORT_DATE
+};
+
+
+void Entry::sort_directory(SORT_ORDER sortOrder)
+{
+ if (sortOrder != SORT_NONE) {
+ Entry* entry = _down;
+ Entry** array, **p;
+ int len;
+
+ len = 0;
+ for(entry=_down; entry; entry=entry->_next)
+ ++len;
+
+ if (len) {
+ array = (Entry**) alloca(len*sizeof(Entry*));
+
+ p = array;
+ for(entry=_down; entry; entry=entry->_next)
+ *p++ = entry;
+
+ // call qsort with the appropriate compare function
+ qsort(array, len, sizeof(array[0]), sortFunctions[sortOrder]);
+
+ _down = array[0];
+
+ for(p=array; --len; p++)
+ (*p)->_next = p[1];
+
+ (*p)->_next = 0;
+ }
+ }
+}
+
+
+void Entry::smart_scan(SORT_ORDER sortOrder, int scan_flags)
+{
+ CONTEXT("Entry::smart_scan()");
+
+ if (!_scanned) {
+ free_subentries();
+ read_directory_base(sortOrder, scan_flags); ///@todo We could use IShellFolder2::GetDefaultColumn to determine sort order.
+ }
+}
+
+
+
+int Entry::extract_icon(ICONCACHE_FLAGS flags)
+{
+ TCHAR path[MAX_PATH];
+
+ ICON_ID icon_id = ICID_NONE;
+
+ if (_etype!=ET_SHELL && get_path(path, COUNTOF(path))) // not for ET_SHELL to display the correct desktop icon
+ if (!(flags & ICF_MIDDLE)) // not for ICF_MIDDLE to extract 24x24 icons because SHGetFileInfo() doesn't support this icon size
+ icon_id = g_Globals._icon_cache.extract(path, flags);
+
+ if (icon_id == ICID_NONE) {
+ if (!(flags & ICF_OVERLAYS)) {
+ IExtractIcon* pExtract;
+ if (SUCCEEDED(GetUIObjectOf(0, IID_IExtractIcon, (LPVOID*)&pExtract))) {
+ unsigned gil_flags;
+ int idx;
+
+ if (flags & ICF_OPEN)
+ gil_flags |= GIL_OPENICON;
+
+ if (SUCCEEDED(pExtract->GetIconLocation(GIL_FORSHELL, path, COUNTOF(path), &idx, &gil_flags))) {
+ if (gil_flags & GIL_NOTFILENAME)
+ icon_id = g_Globals._icon_cache.extract(pExtract, path, idx, flags);
+ else {
+ if (idx == -1)
+ idx = 0; // special case for some control panel applications ("System")
+
+ icon_id = g_Globals._icon_cache.extract(path, idx, flags);
+ }
+
+ /* using create_absolute_pidl() [see below] results in more correct icons for some control panel applets (NVidia display driver).
+ if (icon_id == ICID_NONE) {
+ SHFILEINFO sfi;
+
+ if (SHGetFileInfo(path, 0, &sfi, sizeof(sfi), SHGFI_ICON|SHGFI_SMALLICON))
+ icon_id = g_Globals._icon_cache.add(sfi.hIcon)._id;
+ } */
+ /*
+ if (icon_id == ICID_NONE) {
+ LPBYTE b = (LPBYTE) alloca(0x10000);
+ SHFILEINFO sfi;
+
+ FILE* file = fopen(path, "rb");
+ if (file) {
+ int l = fread(b, 1, 0x10000, file);
+ fclose(file);
+
+ if (l)
+ icon_id = g_Globals._icon_cache.add(CreateIconFromResourceEx(b, l, TRUE, 0x00030000, 16, 16, LR_DEFAULTCOLOR));
+ }
+ } */
+ }
+ }
+ }
+
+ if (icon_id == ICID_NONE) {
+ SHFILEINFO sfi;
+
+ const ShellPath& pidl_abs = create_absolute_pidl();
+ LPCITEMIDLIST pidl = pidl_abs;
+
+ int shgfi_flags = SHGFI_PIDL;
+
+ if (!(flags & (ICF_LARGE|ICF_MIDDLE)))
+ shgfi_flags |= SHGFI_SMALLICON;
+
+ if (flags & ICF_OPEN)
+ shgfi_flags |= SHGFI_OPENICON;
+
+ if (flags & ICF_SYSCACHE) {
+ assert(!(flags&ICF_OVERLAYS));
+
+ HIMAGELIST himlSys = (HIMAGELIST) SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX|shgfi_flags);
+ if (himlSys)
+ icon_id = g_Globals._icon_cache.add(sfi.iIcon);
+ } else {
+ if (flags & ICF_OVERLAYS)
+ shgfi_flags |= SHGFI_ADDOVERLAYS;
+
+ if (SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_ICON|shgfi_flags))
+ icon_id = g_Globals._icon_cache.add(sfi.hIcon);
+ }
+ }
+ }
+
+ return icon_id;
+}
+
+int Entry::safe_extract_icon(ICONCACHE_FLAGS flags)
+{
+ try {
+ return extract_icon(flags);
+ } catch(COMException&) {
+ // ignore unexpected exceptions while extracting icons
+ }
+
+ return ICID_NONE;
+}
+
+
+BOOL Entry::launch_entry(HWND hwnd, UINT nCmdShow)
+{
+ TCHAR cmd[MAX_PATH];
+
+ if (!get_path(cmd, COUNTOF(cmd)))
+ return FALSE;
+
+ // add path to the recent file list
+ SHAddToRecentDocs(SHARD_PATH, cmd);
+
+ // start program, open document...
+ return launch_file(hwnd, cmd, nCmdShow);
+}
+
+
+ // local replacement implementation for SHBindToParent()
+ // (derived from http://www.geocities.com/SiliconValley/2060/articles/shell-helpers.html)
+static HRESULT my_SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, VOID** ppv, LPCITEMIDLIST* ppidlLast)
+{
+ HRESULT hr;
+
+ if (!ppv)
+ return E_POINTER;
+
+ // There must be at least one item ID.
+ if (!pidl || !pidl->mkid.cb)
+ return E_INVALIDARG;
+
+ // Get the desktop folder as root.
+ ShellFolder desktop;
+/* IShellFolderPtr desktop;
+ hr = SHGetDesktopFolder(&desktop);
+ if (FAILED(hr))
+ return hr; */
+
+ // Walk to the penultimate item ID.
+ LPCITEMIDLIST marker = pidl;
+ for (;;)
+ {
+ LPCITEMIDLIST next = reinterpret_cast<LPCITEMIDLIST>(
+ marker->mkid.abID - sizeof(marker->mkid.cb) + marker->mkid.cb);
+ if (!next->mkid.cb)
+ break;
+ marker = next;
+ }
+
+ if (marker == pidl)
+ {
+ // There was only a single item ID, so bind to the root folder.
+ hr = desktop->QueryInterface(riid, ppv);
+ }
+ else
+ {
+ // Copy the ID list, truncating the last item.
+ int length = marker->mkid.abID - pidl->mkid.abID;
+ if (LPITEMIDLIST parent_id = reinterpret_cast<LPITEMIDLIST>(
+ malloc(length + sizeof(pidl->mkid.cb))))
+ {
+ LPBYTE raw_data = reinterpret_cast<LPBYTE>(parent_id);
+ memcpy(raw_data, pidl, length);
+ memset(raw_data + length, 0, sizeof(pidl->mkid.cb));
+ hr = desktop->BindToObject(parent_id, 0, riid, ppv);
+ free(parent_id);
+ }
+ else
+ return E_OUTOFMEMORY;
+ }
+
+ // Return a pointer to the last item ID.
+ if (ppidlLast)
+ *ppidlLast = marker;
+
+ return hr;
+}
+#define USE_MY_SHBINDTOPARENT
+
+HRESULT Entry::do_context_menu(HWND hwnd, const POINT& pos, CtxMenuInterfaces& cm_ifs)
+{
+ ShellPath shell_path = create_absolute_pidl();
+ LPCITEMIDLIST pidl_abs = shell_path;
+
+ if (!pidl_abs)
+ return S_FALSE; // no action for registry entries, etc.
+
+#ifdef USE_MY_SHBINDTOPARENT
+ IShellFolder* parentFolder;
+ LPCITEMIDLIST pidlLast;
+
+ // get and use the parent folder to display correct context menu in all cases -> correct "Properties" dialog for directories, ...
+ HRESULT hr = my_SHBindToParent(pidl_abs, IID_IShellFolder, (LPVOID*)&parentFolder, &pidlLast);
+
+ if (SUCCEEDED(hr)) {
+ hr = ShellFolderContextMenu(parentFolder, hwnd, 1, &pidlLast, pos.x, pos.y, cm_ifs);
+
+ parentFolder->Release();
+ }
+
+ return hr;
+#else
+ static DynamicFct<HRESULT(WINAPI*)(LPCITEMIDLIST, REFIID, LPVOID*, LPCITEMIDLIST*)> SHBindToParent(TEXT("SHELL32"), "SHBindToParent");
+
+ if (SHBindToParent) {
+ IShellFolder* parentFolder;
+ LPCITEMIDLIST pidlLast;
+
+ // get and use the parent folder to display correct context menu in all cases -> correct "Properties" dialog for directories, ...
+ HRESULT hr = (*SHBindToParent)(pidl_abs, IID_IShellFolder, (LPVOID*)&parentFolder, &pidlLast);
+
+ if (SUCCEEDED(hr)) {
+ hr = ShellFolderContextMenu(parentFolder, hwnd, 1, &pidlLast, pos.x, pos.y, cm_ifs);
+
+ parentFolder->Release();
+ }
+
+ return hr;
+ } else {
+ /**@todo use parent folder instead of desktop folder
+ Entry* dir = _up;
+
+ ShellPath parent_path;
+
+ if (dir)
+ parent_path = dir->create_absolute_pidl();
+ else
+ parent_path = DesktopFolderPath();
+
+ ShellPath shell_path = create_relative_pidl(parent_path);
+ LPCITEMIDLIST pidl = shell_path;
+
+ ShellFolder parent_folder = parent_path;
+ return ShellFolderContextMenu(parent_folder, hwnd, 1, &pidl, pos.x, pos.y);
+ */
+ return ShellFolderContextMenu(GetDesktopFolder(), hwnd, 1, &pidl_abs, pos.x, pos.y, cm_ifs);
+ }
+#endif
+}
+
+
+HRESULT Entry::GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut)
+{
+ TCHAR path[MAX_PATH];
+/*
+ if (!get_path(path, COUNTOF(path)))
+ return E_FAIL;
+
+ ShellPath shell_path(path);
+
+ IShellFolder* pFolder;
+ LPCITEMIDLIST pidl_last = NULL;
+
+ static DynamicFct<HRESULT(WINAPI*)(LPCITEMIDLIST, REFIID, LPVOID*, LPCITEMIDLIST*)> SHBindToParent(TEXT("SHELL32"), "SHBindToParent");
+
+ if (!SHBindToParent)
+ return E_NOTIMPL;
+
+ HRESULT hr = (*SHBindToParent)(shell_path, IID_IShellFolder, (LPVOID*)&pFolder, &pidl_last);
+ if (FAILED(hr))
+ return hr;
+
+ ShellFolder shell_folder(pFolder);
+
+ shell_folder->Release();
+
+ return shell_folder->GetUIObjectOf(hWnd, 1, &pidl_last, riid, NULL, ppvOut);
+*/
+ if (!_up)
+ return E_INVALIDARG;
+
+ if (!_up->get_path(path, COUNTOF(path)))
+ return E_FAIL;
+
+ ShellPath shell_path(path);
+ ShellFolder shell_folder(shell_path);
+
+#ifdef UNICODE
+ LPWSTR wname = _data.cFileName;
+#else
+ WCHAR wname[MAX_PATH];
+ MultiByteToWideChar(CP_ACP, 0, _data.cFileName, -1, wname, COUNTOF(wname));
+#endif
+
+ LPITEMIDLIST pidl_last = NULL;
+ HRESULT hr = shell_folder->ParseDisplayName(hWnd, NULL, wname, NULL, &pidl_last, NULL);
+
+ if (FAILED(hr))
+ return hr;
+
+ hr = shell_folder->GetUIObjectOf(hWnd, 1, (LPCITEMIDLIST*)&pidl_last, riid, NULL, ppvOut);
+
+ ShellMalloc()->Free((void*)pidl_last);
+
+ return hr;
+}
+
+
+ // get full path of specified directory entry
+bool Entry::get_path_base ( PTSTR path, size_t path_count, ENTRY_TYPE etype ) const
+{
+ int level = 0;
+ size_t len = 0;
+ size_t l = 0;
+ LPCTSTR name = NULL;
+ TCHAR buffer[MAX_PATH];
+
+ if (!path || path_count==0)
+ return false;
+
+ const Entry* entry;
+ if ( path_count > 1 )
+ {
+ for(entry=this; entry; level++) {
+ l = 0;
+
+ if (entry->_etype == etype) {
+ name = entry->_data.cFileName;
+
+ for(LPCTSTR s=name; *s && *s!=TEXT('/') && *s!=TEXT('\\'); s++)
+ ++l;
+
+ if (!entry->_up)
+ break;
+ } else {
+ if (entry->get_path(buffer, COUNTOF(buffer))) {
+ l = _tcslen(buffer);
+ name = buffer;
+
+ /* special handling of drive names */
+ if (l>0 && buffer[l-1]=='\\' && path[0]=='\\')
+ --l;
+
+ if ( len+l >= path_count )
+ {
+ if ( l + 1 > path_count )
+ len = 0;
+ else
+ len = path_count - l - 1;
+ }
+ memmove(path+l, path, len*sizeof(TCHAR));
+ if ( l+1 >= path_count )
+ l = path_count - 1;
+ memcpy(path, name, l*sizeof(TCHAR));
+ len += l;
+ }
+
+ entry = NULL;
+ break;
+ }
+
+ if (l > 0) {
+ if ( len+l+1 >= path_count )
+ {
+ /* compare to 2 here because of terminator plus the '\\' we prepend */
+ if ( l + 2 > path_count )
+ len = 0;
+ else
+ len = path_count - l - 2;
+ }
+ memmove(path+l+1, path, len*sizeof(TCHAR));
+ /* compare to 2 here because of terminator plus the '\\' we prepend */
+ if ( l+2 >= path_count )
+ l = path_count - 2;
+ memcpy(path+1, name, l*sizeof(TCHAR));
+ len += l+1;
+
+#ifndef _NO_WIN_FS
+ if (etype == ET_WINDOWS && entry->_up && !(entry->_up->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // a NTFS stream?
+ path[0] = TEXT(':');
+ else
+#endif
+ path[0] = TEXT('\\');
+ }
+
+ entry = entry->_up;
+ }
+
+ if (entry) {
+ if ( len+l >= path_count )
+ {
+ if ( l + 1 > path_count )
+ len = 0;
+ else
+ len = path_count - l - 1;
+ }
+ memmove(path+l, path, len*sizeof(TCHAR));
+ if ( l+1 >= path_count )
+ l = path_count - 1;
+ memcpy(path, name, l*sizeof(TCHAR));
+ len += l;
+ }
+
+ if ( !level && (len+1 < path_count) )
+ path[len++] = TEXT('\\');
+ }
+
+ path[len] = TEXT('\0');
+
+ return true;
+}
+
+ // recursively free all child entries
+void Entry::free_subentries()
+{
+ Entry *entry, *next=_down;
+
+ if (next) {
+ _down = 0;
+
+ do {
+ entry = next;
+ next = entry->_next;
+
+ entry->free_subentries();
+ delete entry;
+ } while(next);
+ }
+}
+
+
+Entry* Root::read_tree(LPCTSTR path, int scan_flags)
+{
+ Entry* entry;
+
+ if (path && *path)
+ entry = _entry->read_tree(path, _sort_order);
+ else {
+ entry = _entry->read_tree(NULL, _sort_order);
+
+ _entry->smart_scan();
+
+ if (_entry->_down)
+ _entry->_expanded = true;
+ }
+
+ return entry;
+}
+
+
+Entry* Root::read_tree(LPCITEMIDLIST pidl, int scan_flags)
+{
+ return _entry->read_tree(pidl, _sort_order);
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // entries.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+enum ENTRY_TYPE {
+ ET_UNKNOWN,
+#ifndef _NO_WIN_FS
+ ET_WINDOWS,
+#endif
+#ifdef __WINE__
+ ET_UNIX,
+#endif
+ ET_SHELL,
+ ET_NTOBJS,
+ ET_REGISTRY,
+ ET_FAT,
+ ET_WEB
+};
+
+enum SORT_ORDER {
+ SORT_NONE,
+ SORT_NAME,
+ SORT_EXT,
+ SORT_SIZE,
+ SORT_DATE
+};
+
+enum SCAN_FLAGS {
+ SCAN_DONT_EXTRACT_ICONS = 1,
+ SCAN_DONT_ACCESS = 2,
+ SCAN_NO_FILESYSTEM = 4
+};
+
+#ifndef ATTRIBUTE_SYMBOLIC_LINK
+#define ATTRIBUTE_LONGNAME 0x08000000
+#define ATTRIBUTE_VOLNAME 0x10000000
+#define ATTRIBUTE_ERASED 0x20000000
+#define ATTRIBUTE_SYMBOLIC_LINK 0x40000000
+#define ATTRIBUTE_EXECUTABLE 0x80000000
+#endif
+
+enum ICONCACHE_FLAGS {
+ ICF_NORMAL = 0,
+ ICF_MIDDLE = 1,
+ ICF_LARGE = 2,
+ ICF_OPEN = 4,
+ ICF_OVERLAYS = 8,
+ ICF_HICON = 16,
+ ICF_SYSCACHE = 32
+};
+
+#ifndef SHGFI_ADDOVERLAYS // missing in MinGW (as of 28.12.2005)
+#define SHGFI_ADDOVERLAYS 0x000000020
+#endif
+
+
+ /// base of all file and directory entries
+struct Entry
+{
+protected:
+ Entry(ENTRY_TYPE etype);
+ Entry(Entry* parent, ENTRY_TYPE etype);
+ Entry(const Entry&);
+
+public:
+ virtual ~Entry();
+
+ Entry* _next;
+ Entry* _down;
+ Entry* _up;
+
+ bool _expanded;
+ bool _scanned;
+ int _level;
+
+ WIN32_FIND_DATA _data;
+
+ SFGAOF _shell_attribs;
+ LPTSTR _display_name;
+ LPTSTR _type_name;
+ LPTSTR _content;
+
+ ENTRY_TYPE _etype;
+ int /*ICON_ID*/ _icon_id;
+
+ BY_HANDLE_FILE_INFORMATION _bhfi;
+ bool _bhfi_valid;
+
+ void free_subentries();
+
+ void read_directory_base(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0);
+ Entry* read_tree(const void* path, SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0);
+ void sort_directory(SORT_ORDER sortOrder);
+ void smart_scan(SORT_ORDER sortOrder=SORT_NAME, int scan_flags=0);
+ int extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL);
+ int safe_extract_icon(ICONCACHE_FLAGS flags=ICF_NORMAL);
+
+ virtual void read_directory(int scan_flags=0) {}
+ virtual const void* get_next_path_component(const void*) const {return NULL;}
+ virtual Entry* find_entry(const void*) {return NULL;}
+ virtual bool get_path(PTSTR path, size_t path_count) const = 0;
+ virtual ShellPath create_absolute_pidl() const {return (LPCITEMIDLIST)NULL;}
+ virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut);
+ virtual ShellFolder get_shell_folder() const;
+ virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL);
+ virtual HRESULT do_context_menu(HWND hwnd, const POINT& pos, CtxMenuInterfaces& cm_ifs);
+
+protected:
+ bool get_path_base(PTSTR path, size_t path_count, ENTRY_TYPE etype) const;
+};
+
+
+ /// base for all directory entries
+struct Directory {
+protected:
+ Directory() : _path(NULL) {}
+ virtual ~Directory() {}
+
+ void* _path;
+};
+
+
+ /// root entry for file system trees
+struct Root {
+ Root();
+ ~Root();
+
+ Entry* _entry;
+ TCHAR _path[MAX_PATH];
+ TCHAR _volname[_MAX_FNAME];
+ TCHAR _fs[_MAX_DIR];
+ DWORD _drive_type;
+ DWORD _fs_flags;
+ SORT_ORDER _sort_order;
+
+ Entry* read_tree(LPCTSTR path, int scan_flags=0);
+ Entry* read_tree(LPCITEMIDLIST pidl, int scan_flags=0);
+};
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // fatfs.cpp
+ //
+ // Martin Fuchs, 01.02.2004
+ //
+
+
+#include <precomp.h>
+
+#include "fatfs.h"
+
+
+static union DEntry* link_dir_entries(struct dirent* dir, struct Kette* K, int cnt)
+{
+ union DEntry* Ent = (union DEntry*) dir;
+ struct Kette* L = NULL;
+
+ for(; cnt; cnt--) {
+ K->Rueck = L;
+ (L=K)->Ent = Ent;
+ AddP(K, sizeof(struct Kette));
+ L->Vorw = K;
+ AddP(Ent, sizeof(union DEntry));
+ }
+
+ L->Vorw = NULL;
+
+ return Ent;
+}
+
+void FATDirectory::read_directory(int scan_flags)
+{
+ CONTEXT("FATDirectory::read_directory()");
+
+ read_dir();
+
+ union DEntry* p = (union DEntry*) _dir;
+ int i = 0;
+
+ do {
+/* if (!IS_LNAME(p->E.attr) && p->E.name[0]!=FAT_DEL_CHAR)
+ gesBytes += p->E.size;
+*/
+
+ AddP(p, sizeof(union DEntry));
+ } while(++i<_ents && p->E.name[0]);
+
+ _alloc = (struct Kette*) malloc((size_t)((_ents=i)+8)*sizeof(struct Kette));
+ if (!_alloc)
+ return;
+
+ link_dir_entries(_dir, _alloc, i);
+
+ Entry* first_entry = NULL;
+ int level = _level + 1;
+
+ Entry* last = NULL;
+
+ WIN32_FIND_DATA w32fd;
+ FAT_attribute attr;
+ String long_name;
+
+ TCHAR buffer[MAX_PATH];
+
+ _tcscpy(buffer, (LPCTSTR)_path);
+ LPTSTR pname = buffer + _tcslen(buffer);
+ int plen = COUNTOF(buffer) - _tcslen(buffer);
+
+ *pname++ = '\\';
+ --plen;
+
+ for(Kette*p=_alloc; p; p=p->Vorw) {
+ memset(&w32fd, 0, sizeof(WIN32_FIND_DATA));
+
+ DEntry_E& e = p->Ent->E;
+
+ // get file/directory attributes
+ attr.b = e.attr;
+
+ if (attr.b & (_A_DELETED | _A_ILLEGAL))
+ attr.b |= _A_ILLEGAL;
+
+ const char* s = e.name;
+ LPTSTR d = w32fd.cFileName;
+
+ if (!IS_LNAME(attr.b) || e.name[0]==FAT_DEL_CHAR) {
+ if (e.name[0] == FAT_DEL_CHAR)
+ w32fd.dwFileAttributes |= ATTRIBUTE_ERASED;
+ else if (IS_LNAME(attr.b))
+ w32fd.dwFileAttributes |= ATTRIBUTE_LONGNAME;
+ else if (attr.a.directory)
+ w32fd.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+ else if (attr.a.volume)
+ w32fd.dwFileAttributes |= ATTRIBUTE_VOLNAME; //@@ -> in Volume-Name der Root kopieren
+
+ // get file name
+ *d++ = *s==FAT_DEL_CHAR? '?': *s;
+ ++s;
+
+ for(i=0; i<7; ++i)
+ *d++ = *s++;
+
+ while(d>w32fd.cFileName && d[-1]==' ')
+ --d;
+
+ *d++ = '.';
+
+ for(; i<10; ++i)
+ *d++ = *s++;
+
+ while(d>w32fd.cFileName && d[-1]==' ')
+ --d;
+
+ if (d>w32fd.cFileName && d[-1]=='.')
+ --d;
+
+ *d = '\0';
+ } else {
+ // read long file name
+ TCHAR lname[] = {s[1], s[3], s[5], s[7], s[9], s[14], s[16], s[18], s[20], s[22], s[24], s[28], s[30]};
+
+ long_name = String(lname, 13) + long_name;
+ }
+
+ if (!IS_LNAME(attr.b) && !attr.a.volume) {
+ // get file size
+ w32fd.nFileSizeLow = e.size;
+
+ // convert date/time attribute into FILETIME
+ const fdate& date = e.date;
+ const ftime& time = e.time;
+ SYSTEMTIME stime;
+ FILETIME ftime;
+
+ stime.wYear = date.year + 1980;
+ stime.wMonth = date.month;
+ stime.wDayOfWeek = (WORD)-1;
+ stime.wDay = date.day;
+ stime.wHour = time.hour;
+ stime.wMinute = time.min;
+ stime.wSecond = time.sec2 * 2;
+ stime.wMilliseconds = 0;
+
+ if (SystemTimeToFileTime(&stime, &ftime))
+ LocalFileTimeToFileTime(&ftime, &w32fd.ftLastWriteTime);
+
+ if (!(w32fd.dwFileAttributes & ATTRIBUTE_ERASED)) { //@@
+ Entry* entry;
+
+ if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ _tcscpy_s(pname, plen, w32fd.cFileName);
+ entry = new FATDirectory(_drive, this, buffer, e.fclus);
+ } else
+ entry = new FATEntry(this, e.fclus);
+
+ memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA));
+
+ if (!long_name.empty()) {
+ entry->_content = _tcsdup(long_name);
+ long_name.erase();
+ }
+
+ if (!first_entry)
+ first_entry = entry;
+
+ if (last)
+ last->_next = entry;
+
+ entry->_level = level;
+
+ last = entry;
+ }
+ }
+ }
+
+ if (last)
+ last->_next = NULL;
+
+ _down = first_entry;
+ _scanned = true;
+}
+
+
+const void* FATDirectory::get_next_path_component(const void* p) const
+{
+ LPCTSTR s = (LPCTSTR) p;
+
+ while(*s && *s!=TEXT('\\') && *s!=TEXT('/'))
+ ++s;
+
+ while(*s==TEXT('\\') || *s==TEXT('/'))
+ ++s;
+
+ if (!*s)
+ return NULL;
+
+ return s;
+}
+
+
+Entry* FATDirectory::find_entry(const void* p)
+{
+ LPCTSTR name = (LPCTSTR)p;
+
+ for(Entry*entry=_down; entry; entry=entry->_next) {
+ LPCTSTR p = name;
+ LPCTSTR q = entry->_data.cFileName;
+
+ do {
+ if (!*p || *p==TEXT('\\') || *p==TEXT('/'))
+ return entry;
+ } while(tolower(*p++) == tolower(*q++));
+
+ p = name;
+ q = entry->_data.cAlternateFileName;
+
+ do {
+ if (!*p || *p==TEXT('\\') || *p==TEXT('/'))
+ return entry;
+ } while(tolower(*p++) == tolower(*q++));
+ }
+
+ return NULL;
+}
+
+
+ // get full path of specified directory entry
+bool FATEntry::get_path(PTSTR path, size_t path_count) const
+{
+ return get_path_base ( path, path_count, ET_FAT );
+}
+
+ShellPath FATEntry::create_absolute_pidl() const
+{
+ CONTEXT("WinEntry::create_absolute_pidl()");
+
+ return (LPCITEMIDLIST)NULL;
+/* prepend root path if the drive is currently actually mounted in the file system -> return working PIDL
+ TCHAR path[MAX_PATH];
+
+ if (get_path(path, COUNTOF(path)))
+ return ShellPath(path);
+
+ return ShellPath();
+*/
+}
+
+
+FATDirectory::FATDirectory(FATDrive& drive, LPCTSTR root_path)
+ : FATEntry(),
+ _drive(drive)
+{
+ _path = _tcsdup(root_path);
+
+ _secarr = NULL;
+ _cur_bufs = 0;
+ _ents = 0;
+ _dir = NULL;
+ _cluster = 0;
+}
+
+FATDirectory::FATDirectory(FATDrive& drive, Entry* parent, LPCTSTR path, unsigned cluster)
+ : FATEntry(parent, cluster),
+ _drive(drive)
+{
+ _path = _tcsdup(path);
+
+ _secarr = NULL;
+ _cur_bufs = 0;
+ _ents = 0;
+ _dir = NULL;
+}
+
+FATDirectory::~FATDirectory()
+{
+ free(_path);
+ _path = NULL;
+}
+
+bool FATDirectory::read_dir()
+{
+ int i;
+
+ if (_cluster == 0) {
+ if (!_drive._boot_sector.SectorsPerFAT) { // FAT32? [boot_sector32->reserved0==0]
+ BootSector32* boot_sector32 = (BootSector32*) &_drive._boot_sector;
+ DWORD sect = _drive._boot_sector.ReservedSectors + _drive._boot_sector.NumberFATs*boot_sector32->SectorsPerFAT32; // lese Root-Directory ein
+ int RootEntries = boot_sector32->RootSectors * 32; //@@
+
+ _secarr = (struct dirsecz*)malloc(sizeof(DWORD) * (_cur_bufs = (int)((_ents=RootEntries)/_drive._bufents)));
+
+ for(i=0; i<_cur_bufs; i++)
+ _secarr->s[i] = sect+i;
+
+ _dir = (struct dirent*)malloc((size_t)(_ents+16)*sizeof(union DEntry));
+ if (!_dir)
+ return false;
+
+ if (!(_drive.read_sector(*_secarr->s,(Buffer*)_dir,_cur_bufs)))
+ return false;
+ } else {
+ DWORD sect = _drive._boot_sector.ReservedSectors + _drive._boot_sector.NumberFATs*_drive._boot_sector.SectorsPerFAT; // read in root directory
+
+ _secarr = (struct dirsecz*)malloc(sizeof(DWORD) * (_cur_bufs = (int)((_ents=_drive._boot_sector.RootEntries)/_drive._bufents)));
+
+ for(i=0; i<_cur_bufs; i++)
+ _secarr->s[i] = sect+i;
+
+ _dir = (struct dirent*)malloc((size_t)(_ents+16)*sizeof(union DEntry));
+ if (!_dir)
+ return false;
+
+ if (!_drive.read_sector(*_secarr->s,(Buffer*)_dir,_cur_bufs))
+ return false;
+ }
+ } else {
+ Buffer* buf;
+ bool ok;
+
+ DWORD h = _cluster;
+
+ _cur_bufs = 0;
+
+ do {
+ h = _drive.read_FAT(h, ok);
+
+ if (!ok)
+ return false;
+
+ _cur_bufs++;
+ } while (h<0x0ffffff0 && h);
+
+ _secarr = (struct dirsecz*) malloc(sizeof(DWORD) * _cur_bufs);
+
+ if (!_secarr)
+ return false;
+
+ _ents = _drive._bufents * (size_t)_cur_bufs * _drive._SClus;
+
+ if ((buf=(Buffer*)(_dir=(struct dirent*)malloc((size_t) (_ents+16)*sizeof(union DEntry)))) == NULL)
+ return false;
+
+ h = _cluster;
+
+ DWORD fdatsec;
+
+ if (!_drive._boot_sector.SectorsPerFAT) { // FAT32 ?
+ BootSector32* boot_sector32 = (BootSector32*) &_drive._boot_sector;
+ //int RootEntries = boot_sector32->RootSectors * 32; //@@
+ //fdatsec = _drive._boot_sector.ReservedSectors + _drive._boot_sector.NumberFATs*boot_sector32->SectorsPerFAT32 + RootEntries*sizeof(DEntry)/_drive._boot_sector.BytesPerSector; // dpb.fdirsec
+ fdatsec = _drive._boot_sector.ReservedSectors +
+ _drive._boot_sector.NumberFATs*boot_sector32->SectorsPerFAT32 + boot_sector32->RootSectors;
+ } else
+ fdatsec = _drive._boot_sector.ReservedSectors +
+ _drive._boot_sector.NumberFATs*_drive._boot_sector.SectorsPerFAT +
+ _drive._boot_sector.RootEntries*sizeof(DEntry)/_drive._boot_sector.BytesPerSector; // dpb.fdirsec
+
+ for(i=0; i<_cur_bufs; i++) {
+ _secarr->s[i] = fdatsec + (DWORD)_drive._SClus*(h-2);
+
+ h = _drive.read_FAT(h, ok);
+
+ if (!ok)
+ return false;
+ }
+
+ for(i=0; i<_cur_bufs; i++) {
+ if ((ok = (_drive.read_sector(_secarr->s[i], buf, _drive._SClus))) == true)
+ AddP(buf, _drive._bufl*_drive._SClus)
+ else {
+ //@@FPara = _secarr->s[i];
+ return false;
+ }
+ }
+
+ buf->dat[0] = 0; // Endekennzeichen für Rekurs setzen
+ }
+
+ return true;
+}
+
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4355)
+#endif
+
+FATDrive::FATDrive(LPCTSTR path)
+ : FATDirectory(*this, TEXT("\\"))
+{
+ _bufl = 0;
+ _bufents = 0;
+ _SClus = 0;
+ _FATCache = NULL;
+ _CacheCount = 0;
+ _CacheSec = NULL;
+ _CacheCnt = NULL;
+ _CacheDty = NULL;
+ _Caches = 0;
+
+ _hDrive = CreateFile(path, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
+
+ if (_hDrive != INVALID_HANDLE_VALUE) {
+ _boot_sector.BytesPerSector = 512;
+
+ if (read_sector(0, (Buffer*)&_boot_sector, 1)) {
+ _bufl = _boot_sector.BytesPerSector;
+ _SClus = _boot_sector.SectorsPerCluster;
+ _bufents = _bufl / sizeof(union DEntry);
+ }
+
+ small_cache();
+ }
+}
+
+FATDrive::~FATDrive()
+{
+ if (_hDrive != INVALID_HANDLE_VALUE)
+ CloseHandle(_hDrive);
+
+ free(_path);
+ _path = NULL;
+}
+
+void FATDrive::small_cache()
+{
+ if (_FATCache)
+ free(_FATCache);
+
+ if (_CacheSec) {
+ free(_CacheSec), _CacheSec = NULL;
+ free(_CacheCnt);
+ free(_CacheDty);
+ }
+
+ _Caches = CACHE_SIZE_LOW;
+ _FATCache = (struct Cache *) malloc((_Caches+1) * _drive._bufl);
+
+ reset_cache();
+}
+
+void FATDrive::reset_cache() // mark cache as empty
+{
+ int i;
+
+ if (!_CacheSec) {
+ _CacheSec = (DWORD*) malloc(_Caches * sizeof(DWORD));
+ _CacheCnt = (int*) malloc(_Caches * sizeof(int));
+ _CacheDty = (bool*) malloc(_Caches * sizeof(bool));
+ } else {
+ _CacheSec = (DWORD*) realloc(_CacheSec, _Caches * sizeof(DWORD));
+ _CacheCnt = (int*) realloc(_CacheCnt, _Caches * sizeof(int));
+ _CacheDty = (bool*) realloc(_CacheDty, _Caches * sizeof(bool));
+ }
+
+ for(i=0; i<_Caches; i++)
+ _CacheSec[i] = 0;
+
+ _read_ahead = (_Caches+1) / 2;
+}
+
+bool FATDrive::read_sector(DWORD sec, Buffer* buf, int len)
+{
+ sec += 63; //@@ jump to first partition
+
+ if (SetFilePointer(_hDrive, sec*_drive._boot_sector.BytesPerSector, 0, 0) == INVALID_SET_FILE_POINTER)
+ return false;
+
+ DWORD read;
+
+ if (!ReadFile(_hDrive, buf, len*_drive._boot_sector.BytesPerSector, &read, 0))
+ return false;
+
+ return true;
+}
+
+DWORD FATDrive::read_FAT(DWORD cluster, bool& ok) //@@ use exception handling
+{
+ DWORD nClus;
+ Buffer* FATBuf;
+
+ DWORD nclus = (_boot_sector.Sectors32? _boot_sector.Sectors32: _boot_sector.Sectors16) / _boot_sector.SectorsPerCluster; ///@todo cache result
+
+ if (cluster > nclus) {
+ ok = false;
+ return (DWORD)-1;
+ }
+
+ if (nclus >= 65536) { // FAT32
+ DWORD FATsec = cluster / (_boot_sector.BytesPerSector/4);
+ DWORD z = (cluster - _boot_sector.BytesPerSector/4 * FATsec)*4;
+ FATsec += _boot_sector.ReservedSectors;
+ if (!read_cache(FATsec, &FATBuf))
+ ok = false;
+ nClus = dpeek(&FATBuf->dat[z]);
+ } else if (nclus >= 4096) { // 16 Bit-FAT
+ DWORD FATsec = cluster / (_boot_sector.BytesPerSector/2);
+ DWORD z = (cluster - _boot_sector.BytesPerSector/2 * FATsec)*2;
+ FATsec += _boot_sector.ReservedSectors;
+ if (!read_cache(FATsec, &FATBuf))
+ ok = false;
+ nClus = wpeek(&FATBuf->dat[z]);
+
+ if (nClus >= 0xfff0)
+ nClus |= 0x0fff0000;
+ } else { // 12 Bit-FAT
+ DWORD FATsec = cluster*3 / (_boot_sector.BytesPerSector*2);
+ DWORD z = (cluster*3 - _boot_sector.BytesPerSector*2*FATsec)/2;
+ FATsec += _boot_sector.ReservedSectors;
+ if (!read_cache(FATsec,&FATBuf))
+ ok = false;
+ BYTE a = FATBuf->dat[z++];
+
+ if (z >= _boot_sector.BytesPerSector)
+ if (!read_cache(FATsec+1,&FATBuf))
+ ok = false;
+ z = 0;
+
+ BYTE b = FATBuf->dat[z];
+
+ if (cluster & 1)
+ nClus = (a>>4) | (b<<4);
+ else
+ nClus = a | ((b & 0xf)<<8);
+
+ if (nClus >= 0xff0)
+ nClus |= 0x0ffff000;
+ }
+
+ return nClus;
+}
+
+bool FATDrive::read_cache(DWORD sec, Buffer** bufptr)
+{
+ int i, C, anz;
+
+ if (_boot_sector.BytesPerSector != BufLen) // no standard sector size?
+ return read_sector(sec, *bufptr=(Buffer*)&_FATCache[0], 1);
+
+ _CacheCount++;
+
+ for(i=0; _CacheSec[i]!=sec && i<_Caches; )
+ ++i;
+
+ if (i < _Caches)
+ {
+ *bufptr = (Buffer*) &_FATCache[i]; // FAT-Sektor schon gepuffert
+ _CacheCnt[i]++;
+ return true;
+ }
+
+ i = get_cache_buffer();
+
+ if (_cache_empty) // von get_cache_buffer() gesetzt
+ {
+ C = _CacheCount-1;
+ anz = _boot_sector.SectorsPerFAT*_boot_sector.NumberFATs - sec;
+
+ if (anz > _read_ahead)
+ anz = _read_ahead;
+
+ for(i=0; i<anz; i++) {
+ _CacheSec[i] = sec++;
+ _CacheCnt[i] = C;
+ _CacheDty[i] = 0;
+ }
+
+ _CacheCnt[0] = _CacheCount;
+
+ return read_sector(_CacheSec[0], *bufptr=(Buffer*) &_FATCache[0], anz);
+ }
+ else
+ {
+ _CacheDty[i] = 0;
+ _CacheCnt[i] = _CacheCount;
+
+ return read_sector(_CacheSec[i]=sec, *bufptr=(Buffer*) &_FATCache[i], 1);
+ }
+}
+
+int FATDrive::get_cache_buffer() // search for free cache buffer
+{
+ int i, j, minCnt;
+
+ for(i=0; i<_Caches; i++)
+ if (_CacheSec[i])
+ break;
+
+ _cache_empty = i==_Caches? true: false;
+
+ for(i=0; _CacheSec[i] && i<_Caches; )
+ ++i;
+
+ if (i < _Caches)
+ j = i;
+ else
+ {
+ minCnt = 0; // search for least used buffer
+
+ for(j=i=0; i<_Caches; i++)
+ if (minCnt < _CacheCnt[i]) {
+ minCnt = _CacheCnt[i];
+ j = i;
+ }
+
+/**@todo enable write back
+ if (CacheDty[j]) // Dirty-Flag gesetzt?
+ if (writesec(_CacheSec[j], (Buffer*) &_FATCache[j], 1))
+ FPara = _CacheSec[j], Frag(SecWriteErr);
+*/
+ }
+
+ return j;
+}
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // fatfs.h
+ //
+ // Martin Fuchs, 01.02.2004
+ //
+
+
+ /// FAT file system file-entry
+struct FATEntry : public Entry
+{
+ FATEntry(Entry* parent, unsigned cluster) : Entry(parent, ET_FAT), _cluster(cluster) {}
+
+protected:
+ FATEntry() : Entry(ET_FAT) {}
+
+ virtual bool get_path(PTSTR path, size_t path_count) const;
+ virtual ShellPath create_absolute_pidl() const;
+
+ DWORD _cluster;
+};
+
+
+struct FATDrive;
+
+ /// FAT file system directory-entry
+struct FATDirectory : public FATEntry, public Directory
+{
+ FATDirectory(FATDrive& drive, LPCTSTR root_path);
+ FATDirectory(FATDrive& drive, Entry* parent, LPCTSTR path, unsigned cluster);
+ ~FATDirectory();
+
+ virtual void read_directory(int scan_flags=0);
+ virtual const void* get_next_path_component(const void*) const;
+ virtual Entry* find_entry(const void*);
+
+protected:
+ FATDrive& _drive;
+
+ struct dirsecz* _secarr;
+ int _cur_bufs;
+ int _ents;
+ struct dirent* _dir;
+ struct Kette* _alloc;
+
+ bool read_dir();
+};
+
+
+#pragma pack(push, 1)
+
+struct BootSector {
+ BYTE jmp[3];
+ char OEM[8];
+ WORD BytesPerSector; // dpb.bsec
+ BYTE SectorsPerCluster; // dpb.sclus + 1
+ WORD ReservedSectors; // dpb.ffatsec
+ BYTE NumberFATs;
+ WORD RootEntries; // dpb.ndir
+ WORD Sectors16;
+ BYTE MediaDescr;
+ WORD SectorsPerFAT;
+ WORD SectorsPerTrack;
+ WORD Heads;
+ DWORD HiddenSectors;
+ DWORD Sectors32;
+ BYTE DriveUnit;
+ WORD ExtBootFlag;
+ DWORD SerialNr;
+ char Label[11];
+ char FileSystem[8];
+ BYTE BootCode[448];
+ BYTE BootSignature[2];
+};
+
+struct BootSector32 {
+ BYTE jmp[3];
+ char OEM[8];
+ WORD BytesPerSector;
+ BYTE SectorsPerCluster;
+ WORD ReservedSectors;
+ BYTE NumberFATs;
+ WORD reserved1; // immer 0 für FAT32
+ WORD Sectors16;
+ BYTE MediaDescr;
+ WORD reserved2; // immer 0 für FAT32
+ WORD SectorsPerTrack;
+ WORD Heads;
+ DWORD HiddenSectors;
+ DWORD Sectors32;
+ DWORD SectorsPerFAT32;
+ DWORD unknown1;
+ DWORD RootSectors; // correct?
+ char unknown2[6];
+ char FileSystem[8];
+ BYTE BootCode[448];
+ BYTE BootSignature[2];
+};
+
+
+struct ftime {
+ WORD sec2 : 5;
+ WORD min : 6;
+ WORD hour : 5;
+};
+
+struct fdate {
+ WORD day : 5;
+ WORD month : 4;
+ WORD year : 7;
+};
+
+typedef struct {
+ unsigned readonly : 1;
+ unsigned hidden : 1;
+ unsigned system : 1;
+ unsigned volume : 1;
+ unsigned directory : 1;
+ unsigned archived : 1;
+ unsigned deleted : 1;
+} fattr;
+
+typedef union {
+ char b;
+ fattr a;
+} FAT_attribute;
+
+struct DEntry_E {
+ char name[8];
+ char ext[3];
+ char attr;
+ char rsrvd[10];
+ struct ftime time;
+ struct fdate date;
+ WORD fclus;
+ DWORD size;
+};
+
+union DEntry {
+ DEntry_E E;
+ BYTE B[8+3+1+10+sizeof(struct ftime)+sizeof(struct fdate)+sizeof(WORD)+sizeof(DWORD)];
+};
+
+#pragma pack(pop)
+
+
+#define BufLen 512
+
+struct Buffer {
+ BYTE dat[BufLen];
+};
+
+struct Cache {
+ BYTE dat[BufLen];
+};
+
+struct dskrwblk {
+ DWORD sec;
+ WORD anz;
+ struct buffer far *buf;
+};
+
+#define RONLY 0x01
+#define HIDDEN 0x02
+#define SYSTEM 0x04
+#define VOLUME 0x08
+#define DIRENT 0x10
+#define ARCHIVE 0x20
+
+#define _A_DELETED 0x40
+#define _A_ILLEGAL 0x80
+#define IS_LNAME(a) ((a&0xFF)==0x0F) // "& 0xFF" correct?
+
+#define FAT_DEL_CHAR (char)0xe5
+
+#define AddP(p,s) {(int&)p += s;}
+
+struct dirent {
+ union DEntry ent[1];
+};
+
+struct dirsecz {
+ DWORD s[32]; // 32 only as placeholder
+};
+
+struct Kette {
+ struct Kette* Vorw;
+ struct Kette* Rueck;
+ union DEntry* Ent;
+};
+
+
+#define MK_P(ofs) ((void*) ((size_t)(ofs)))
+#define MK_LONG(l,h) ((DWORD)WORD(l)|((DWORD)WORD(h)<<16))
+
+#define spoke(ofs,w) (*((BYTE*)MK_P(ofs)) = (BYTE)(w))
+#define wpoke(ofs,w) (*((WORD*)MK_P(ofs)) = (WORD)(w))
+#define dpoke(ofs,w) (*((DWORD*)MK_P(ofs)) = (DWORD)(w))
+#define speek(ofs) (*((BYTE*)MK_P(ofs)))
+#define wpeek(ofs) (*((WORD*)MK_P(ofs)))
+#define dpeek(p) (*((DWORD*)MK_P(p)))
+
+
+ /// FAT drive root entry
+struct FATDrive : public FATDirectory
+{
+ FATDrive(LPCTSTR path);
+/*
+ FATDrive(Entry* parent, LPCTSTR path)
+ : FATEntry(parent)
+ {
+ _path = _tcsdup(path);
+ }
+*/
+ ~FATDrive();
+
+ HANDLE _hDrive;
+ BootSector _boot_sector;
+ int _bufl;
+ int _bufents;
+ int _SClus;
+
+#define CACHE_SIZE_LOW 32
+ Cache* _FATCache;
+ int _CacheCount;
+ DWORD* _CacheSec; // numbers of buffered cache sectors
+ int* _CacheCnt; // counters for cache usage
+ bool* _CacheDty; // dirty flags for cache
+ int _Caches;
+ bool _cache_empty;
+ int _read_ahead;
+
+ bool read_sector(DWORD sec, Buffer* buf, int len);
+ DWORD read_FAT(DWORD Clus, bool& ok);
+
+ void small_cache();
+ void reset_cache();
+ bool read_cache(DWORD sec, Buffer** bufptr);
+ int get_cache_buffer();
+};
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // filechild.cpp
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#include <precomp.h>
+
+#include "ntobjfs.h"
+#include "regfs.h"
+#include "fatfs.h"
+
+#include "../resource.h"
+
+
+FileChildWndInfo::FileChildWndInfo(HWND hmdiclient, LPCTSTR path, ENTRY_TYPE etype)
+ : super(hmdiclient),
+ _etype(etype)
+{
+#ifndef _NO_WIN_FS
+ if (etype == ET_UNKNOWN)
+#ifdef __WINE__
+ if (*path == '/')
+ _etype = ET_UNIX;
+ else
+#endif
+ _etype = ET_WINDOWS;
+#endif
+
+ _path = path;
+
+ _pos.length = sizeof(WINDOWPLACEMENT);
+ _pos.flags = 0;
+ _pos.showCmd = SW_SHOWNORMAL;
+ _pos.rcNormalPosition.left = CW_USEDEFAULT;
+ _pos.rcNormalPosition.top = CW_USEDEFAULT;
+ _pos.rcNormalPosition.right = CW_USEDEFAULT;
+ _pos.rcNormalPosition.bottom = CW_USEDEFAULT;
+
+ _open_mode = OWM_EXPLORE|OWM_DETAILS;
+}
+
+
+ShellChildWndInfo::ShellChildWndInfo(HWND hmdiclient, LPCTSTR path, const ShellPath& root_shell_path)
+ : FileChildWndInfo(hmdiclient, path, ET_SHELL),
+ _shell_path(path&&*path? path: root_shell_path),
+ _root_shell_path(root_shell_path)
+{
+}
+
+
+NtObjChildWndInfo::NtObjChildWndInfo(HWND hmdiclient, LPCTSTR path)
+ : FileChildWndInfo(hmdiclient, path, ET_NTOBJS)
+{
+}
+
+
+RegistryChildWndInfo::RegistryChildWndInfo(HWND hmdiclient, LPCTSTR path)
+ : FileChildWndInfo(hmdiclient, path, ET_REGISTRY)
+{
+}
+
+
+FATChildWndInfo::FATChildWndInfo(HWND hmdiclient, LPCTSTR path)
+ : FileChildWndInfo(hmdiclient, path, ET_FAT)
+{
+}
+
+
+WebChildWndInfo::WebChildWndInfo(HWND hmdiclient, LPCTSTR url)
+ : FileChildWndInfo(hmdiclient, url, ET_WEB)
+{
+}
+
+
+INT_PTR CALLBACK ExecuteDialog::WndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ static struct ExecuteDialog* dlg;
+
+ switch(nmsg) {
+ case WM_INITDIALOG:
+ dlg = (struct ExecuteDialog*) lparam;
+ return 1;
+
+ case WM_COMMAND: {
+ int id = (int)wparam;
+
+ if (id == IDOK) {
+ GetWindowText(GetDlgItem(hwnd, 201), dlg->cmd, COUNTOF(dlg->cmd));
+ dlg->cmdshow = Button_GetState(GetDlgItem(hwnd,214))&BST_CHECKED?
+ SW_SHOWMINIMIZED: SW_SHOWNORMAL;
+ EndDialog(hwnd, id);
+ } else if (id == IDCANCEL)
+ EndDialog(hwnd, id);
+
+ return 1;}
+ }
+
+ return 0;
+}
+
+
+ // FileChildWindow
+
+FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info)
+ : super(hwnd, info)
+{
+ CONTEXT("FileChildWindow::FileChildWindow()");
+
+ TCHAR drv[_MAX_DRIVE+1];
+ Entry* entry = NULL;
+
+ _left = NULL;
+ _right = NULL;
+
+ switch(info._etype) {
+#ifdef __WINE__
+ case ET_UNIX:
+ _root._drive_type = GetDriveType(info._path);
+ _root._sort_order = SORT_NAME;
+
+ _tsplitpath(info._path, drv, NULL, NULL, NULL);
+ lstrcat(drv, TEXT("/"));
+ lstrcpy(_root._volname, TEXT("root fs"));
+ _root._fs_flags = 0;
+ lstrcpy(_root._fs, TEXT("unixfs"));
+ lstrcpy(_root._path, TEXT("/"));
+ _root._entry = new UnixDirectory(_root._path);
+ entry = _root.read_tree(info._path+_tcslen(_root._path));
+ break;
+#endif
+
+ case ET_NTOBJS:
+ _root._drive_type = DRIVE_UNKNOWN;
+ _root._sort_order = SORT_NAME;
+
+ _tsplitpath_s(info._path, drv, COUNTOF(drv), NULL, 0, NULL, 0, NULL, 0);
+ lstrcat(drv, TEXT("\\"));
+ lstrcpy(_root._volname, TEXT("NT Object Namespace"));
+ lstrcpy(_root._fs, TEXT("NTOBJ"));
+ lstrcpy(_root._path, drv);
+ _root._entry = new NtObjDirectory(_root._path);
+ entry = _root.read_tree(info._path+_tcslen(_root._path));
+ break;
+
+ case ET_REGISTRY:
+ _root._drive_type = DRIVE_UNKNOWN;
+ _root._sort_order = SORT_NONE;
+
+ _tsplitpath_s(info._path, drv, COUNTOF(drv), NULL, 0, NULL, 0, NULL, 0);
+ lstrcat(drv, TEXT("\\"));
+ lstrcpy(_root._volname, TEXT("Registry"));
+ lstrcpy(_root._fs, TEXT("Registry"));
+ lstrcpy(_root._path, drv);
+ _root._entry = new RegistryRoot();
+ entry = _root.read_tree(info._path+_tcslen(_root._path));
+ break;
+
+ case ET_FAT: {
+ _root._drive_type = DRIVE_UNKNOWN;
+ _root._sort_order = SORT_NONE;
+
+ _tsplitpath_s(info._path, drv, COUNTOF(drv), NULL, 0, NULL, 0, NULL, 0);
+ lstrcat(drv, TEXT("\\"));
+ lstrcpy(_root._volname, TEXT("FAT XXX")); //@@
+ lstrcpy(_root._fs, TEXT("FAT"));
+ lstrcpy(_root._path, drv);
+ FATDrive* drive = new FATDrive(TEXT("c:/reactos-emu/c.img")); //TEXT("\\\\.\\F:")); //@@
+
+ if (drive->_hDrive != INVALID_HANDLE_VALUE) {
+ _root._entry = drive;
+ entry = _root.read_tree(info._path+_tcslen(_root._path));
+ }
+ break;}
+
+#ifndef _NO_WIN_FS
+ default: // ET_WINDOWS
+ _root._drive_type = GetDriveType(info._path);
+ _root._sort_order = SORT_NAME;
+
+ _tsplitpath_s(info._path, drv, COUNTOF(drv), NULL, 0, NULL, 0, NULL, 0);
+ lstrcat(drv, TEXT("\\"));
+ GetVolumeInformation(drv, _root._volname, _MAX_FNAME, 0, 0, &_root._fs_flags, _root._fs, COUNTOF(_root._fs));
+ lstrcpy(_root._path, drv);
+ _root._entry = new WinDirectory(_root._path);
+ entry = _root.read_tree(info._path+_tcslen(_root._path));
+ break;
+#else
+ default:
+#endif
+
+ case ET_SHELL: { //@@ separate FileChildWindow into ShellChildWindow, WinChildWindow, UnixChildWindow ?
+ _root._drive_type = DRIVE_UNKNOWN;
+ _root._sort_order = SORT_NAME;
+
+ lstrcpy(drv, TEXT("\\"));
+ lstrcpy(_root._volname, TEXT("Desktop"));
+ _root._fs_flags = 0;
+ lstrcpy(_root._fs, TEXT("Shell"));
+
+ _root._entry = new ShellDirectory(GetDesktopFolder(), DesktopFolderPath(), hwnd);
+ const ShellChildWndInfo& shell_info = static_cast<const ShellChildWndInfo&>(info);
+ entry = _root.read_tree(&*shell_info._shell_path);
+ break;}
+ }
+
+ if (_root._entry) {
+ if (info._etype != ET_SHELL)
+ wsprintf(_root._entry->_data.cFileName, TEXT("%s - %s"), drv, _root._fs);
+ /*@@else
+ lstrcpy(_root._entry->_data.cFileName, TEXT("GetDesktopFolder"));*/
+
+ _root._entry->_data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
+
+
+ ///@todo use OWM_ROOTED flag
+
+ if (info._open_mode & OWM_EXPLORE) ///@todo Is not-explore-mode for FileChildWindow completely implemented?
+ _left_hwnd = *(_left=new Pane(_hwnd, IDW_TREE_LEFT, IDW_HEADER_LEFT, _root._entry, true, COL_CONTENT));
+
+ _right_hwnd = *(_right=new Pane(_hwnd, IDW_TREE_RIGHT, IDW_HEADER_RIGHT, NULL, false,
+ COL_TYPE|COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_INDEX|COL_LINKS|COL_CONTENT));
+ }
+
+ _header_wdths_ok = false;
+
+ if (entry)
+ set_curdir(entry);
+ else
+ set_curdir(_root._entry);
+
+ if (_left_hwnd) {
+ int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), _left->_cur);
+ ListBox_SetCurSel(_left_hwnd, idx);
+ //SetFocus(_left_hwnd);
+ }
+
+ // store path into history
+ if (info._path && *info._path)
+ _url_history.push(info._path);
+}
+
+
+void FileChildWindow::set_curdir(Entry* entry)
+{
+ CONTEXT("FileChildWindow::set_curdir()");
+
+ _path[0] = TEXT('\0');
+
+ _left->_cur = entry;
+ _right->_root = entry&&entry->_down? entry->_down: entry;
+ _right->_cur = entry;
+
+ if (entry) {
+ WaitCursor wait;
+
+ if (!entry->_scanned)
+ scan_entry(entry);
+ else {
+ HiddenWindow hide(_right_hwnd);
+
+ ListBox_ResetContent(_right_hwnd);
+ _right->insert_entries(entry->_down);
+
+ _right->calc_widths(false); ///@todo make configurable (This call takes really _very_ long compared to all other processing!)
+
+ _right->set_header();
+ }
+
+ entry->get_path(_path, COUNTOF(_path));
+ }
+
+ if (_hwnd) // only change window title if the window already exists
+ SetWindowText(_hwnd, _path);
+
+ if (_path[0])
+ if (SetCurrentDirectory(_path))
+ set_url(_path); //set_url(FmtString(TEXT("file://%s"), _path));
+ else
+ _path[0] = TEXT('\0');
+}
+
+
+ // expand a directory entry
+
+bool FileChildWindow::expand_entry(Entry* dir)
+{
+ int idx;
+ Entry* p;
+
+ if (!dir || dir->_expanded || !dir->_down)
+ return false;
+
+ p = dir->_down;
+
+ if (p->_data.cFileName[0]=='.' && p->_data.cFileName[1]=='\0' && p->_next) {
+ p = p->_next;
+
+ if (p->_data.cFileName[0]=='.' && p->_data.cFileName[1]=='.' &&
+ p->_data.cFileName[2]=='\0' && p->_next)
+ p = p->_next;
+ }
+
+ // no subdirectories ?
+ if (!(p->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && // not a directory?
+ !p->_down) // not a file with NTFS sub-streams?
+ return FALSE;
+
+ idx = ListBox_FindItemData(_left_hwnd, 0, dir);
+
+ dir->_expanded = true;
+
+ // insert entries in left pane
+ HiddenWindow hide(_left_hwnd);
+
+ _left->insert_entries(p, idx);
+
+ if (!_header_wdths_ok) {
+ if (_left->calc_widths(false)) {
+ _left->set_header();
+
+ _header_wdths_ok = true;
+ }
+ }
+
+ return true;
+}
+
+
+void FileChildWindow::collapse_entry(Pane* pane, Entry* dir)
+{
+ int idx = ListBox_FindItemData(*pane, 0, dir);
+
+ SendMessage(*pane, WM_SETREDRAW, FALSE, 0); //ShowWindow(*pane, SW_HIDE);
+
+ // hide sub entries
+ for(;;) {
+ LRESULT res = ListBox_GetItemData(*pane, idx+1);
+ Entry* sub = (Entry*) res;
+
+ if (res==LB_ERR || !sub || sub->_level<=dir->_level)
+ break;
+
+ ListBox_DeleteString(*pane, idx+1);
+ }
+
+ dir->_expanded = false;
+
+ SendMessage(*pane, WM_SETREDRAW, TRUE, 0); //ShowWindow(*pane, SW_SHOW);
+}
+
+
+FileChildWindow* FileChildWindow::create(const FileChildWndInfo& info)
+{
+ CONTEXT("FileChildWindow::create()");
+
+ MDICREATESTRUCT mcs;
+
+ mcs.szClass = CLASSNAME_WINEFILETREE;
+ mcs.szTitle = (LPTSTR)info._path;
+ mcs.hOwner = g_Globals._hInstance;
+ mcs.x = info._pos.rcNormalPosition.left;
+ mcs.y = info._pos.rcNormalPosition.top;
+ mcs.cx = info._pos.rcNormalPosition.right - info._pos.rcNormalPosition.left;
+ mcs.cy = info._pos.rcNormalPosition.bottom - info._pos.rcNormalPosition.top;
+ mcs.style = 0;
+ mcs.lParam = 0;
+
+ FileChildWindow* child = static_cast<FileChildWindow*>(
+ create_mdi_child(info, mcs, WINDOW_CREATOR_INFO(FileChildWindow,FileChildWndInfo)));
+
+ return child;
+}
+
+
+void FileChildWindow::resize_children(int cx, int cy)
+{
+ HDWP hdwp = BeginDeferWindowPos(4);
+ RECT rt;
+
+ rt.left = 0;
+ rt.top = 0;
+ rt.right = cx;
+ rt.bottom = cy;
+
+ cx = _split_pos + SPLIT_WIDTH/2;
+
+ if (_left && _right) {
+ WINDOWPOS wp;
+ HD_LAYOUT hdl;
+
+ hdl.prc = &rt;
+ hdl.pwpos = ℘
+
+ Header_Layout(_left->_hwndHeader, &hdl);
+
+ hdwp = DeferWindowPos(hdwp, _left->_hwndHeader, wp.hwndInsertAfter,
+ wp.x-1, wp.y, _split_pos-SPLIT_WIDTH/2+1, wp.cy, wp.flags);
+
+ hdwp = DeferWindowPos(hdwp, _right->_hwndHeader, wp.hwndInsertAfter,
+ rt.left+cx+1, wp.y, wp.cx-cx+2, wp.cy, wp.flags);
+ }
+
+ if (_left_hwnd)
+ hdwp = DeferWindowPos(hdwp, _left_hwnd, 0, rt.left, rt.top, _split_pos-SPLIT_WIDTH/2-rt.left, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE);
+
+ if (_right_hwnd)
+ hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, rt.left+cx+1, rt.top, rt.right-cx, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE);
+
+ EndDeferWindowPos(hdwp);
+}
+
+
+LRESULT FileChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_DRAWITEM: {
+ LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lparam;
+ Entry* entry = (Entry*) dis->itemData;
+
+ if (dis->CtlID == IDW_TREE_LEFT) {
+ _left->draw_item(dis, entry);
+ return TRUE;
+ } else if (dis->CtlID == IDW_TREE_RIGHT) {
+ _right->draw_item(dis, entry);
+ return TRUE;
+ }
+
+ goto def;}
+
+ case WM_SIZE:
+ if (wparam != SIZE_MINIMIZED)
+ resize_children(LOWORD(lparam), HIWORD(lparam));
+ return DefMDIChildProc(_hwnd, nmsg, wparam, lparam);
+
+ case PM_GET_FILEWND_PTR:
+ return (LRESULT)this;
+
+ case WM_SETFOCUS: {
+ TCHAR path[MAX_PATH];
+
+ if (_left && _left->_cur) {
+ _left->_cur->get_path(path, COUNTOF(path));
+ SetCurrentDirectory(path);
+ }
+
+ SetFocus(_focus_pane? _right_hwnd: _left_hwnd);
+ goto def;}
+
+ case PM_DISPATCH_COMMAND: {
+ Pane* pane = GetFocus()==_left_hwnd? _left: _right;
+
+ switch(LOWORD(wparam)) {
+ case ID_WINDOW_NEW: {CONTEXT("FileChildWindow PM_DISPATCH_COMMAND ID_WINDOW_NEW");
+ if (_root._entry->_etype == ET_SHELL)
+ FileChildWindow::create(ShellChildWndInfo(GetParent(_hwnd)/*_hmdiclient*/, _path, DesktopFolderPath()));
+ else
+ FileChildWindow::create(FileChildWndInfo(GetParent(_hwnd)/*_hmdiclient*/, _path));
+ break;}
+
+ case ID_REFRESH: {CONTEXT("ID_REFRESH");
+ WaitCursor wait;
+ bool expanded = _left->_cur->_expanded;
+
+ scan_entry(_left->_cur);
+
+ if (expanded)
+ expand_entry(_left->_cur);
+ break;}
+
+ case ID_ACTIVATE: {CONTEXT("ID_ACTIVATE");
+ activate_entry(pane);
+ break;}
+
+ default:
+ if (pane->command(LOWORD(wparam)))
+ return TRUE;
+ else
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return TRUE;}
+
+ case WM_CONTEXTMENU: {
+ // first select the current item in the listbox
+ HWND hpanel = (HWND) wparam;
+ const POINTS& pos = MAKEPOINTS(lparam);
+ POINT pt; POINTSTOPOINT(pt, pos);
+ POINT pt_screen = pt;
+ ScreenToClient(hpanel, &pt);
+ SendMessage(hpanel, WM_LBUTTONDOWN, 0, MAKELONG(pt.x, pt.y));
+ SendMessage(hpanel, WM_LBUTTONUP, 0, MAKELONG(pt.x, pt.y));
+
+ // now create the popup menu using shell namespace and IContextMenu
+ Pane* pane = GetFocus()==_left_hwnd? _left: _right;
+ int idx = ListBox_GetCurSel(*pane);
+ if (idx != -1) {
+ Entry* entry = (Entry*) ListBox_GetItemData(*pane, idx);
+
+ CHECKERROR(entry->do_context_menu(_hwnd, pt_screen, _cm_ifs));
+ }
+ break;}
+
+ default: def:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+
+int FileChildWindow::Command(int id, int code)
+{
+ Pane* pane = GetFocus()==_left_hwnd? _left: _right;
+
+ switch(code) {
+ case LBN_SELCHANGE: {
+ int idx = ListBox_GetCurSel(*pane);
+ Entry* entry = (Entry*) ListBox_GetItemData(*pane, idx);
+
+ if (pane == _left)
+ set_curdir(entry);
+ else
+ pane->_cur = entry;
+ break;}
+
+ case LBN_DBLCLK:
+ activate_entry(pane);
+ break;
+ }
+
+ return 0;
+}
+
+
+void FileChildWindow::activate_entry(Pane* pane) ///@todo enable using RETURN key accelerator
+{
+ Entry* entry = pane->_cur;
+
+ if (!entry)
+ return;
+
+ WaitCursor wait;
+
+ if ((entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || // a directory?
+ entry->_down) // a file with NTFS sub-streams?
+ {
+ int scanned_old = entry->_scanned;
+
+ if (!scanned_old)
+ scan_entry(entry);
+
+ if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('\0'))
+ return;
+
+ if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('.') && entry->_data.cFileName[2]==TEXT('\0')) {
+ entry = _left->_cur->_up;
+ collapse_entry(_left, entry);
+ goto focus_entry;
+ } else if (entry->_expanded)
+ collapse_entry(pane, _left->_cur);
+ else {
+ expand_entry(_left->_cur);
+
+ if (!pane->_treePane) focus_entry: {
+ int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), entry);
+ ListBox_SetCurSel(_left_hwnd, idx);
+
+ set_curdir(entry);
+ }
+ }
+
+ if (!scanned_old) {
+ pane->calc_widths(false);
+
+ pane->set_header();
+ }
+ } else {
+ entry->launch_entry(_hwnd);
+ }
+}
+
+
+void FileChildWindow::scan_entry(Entry* entry)
+{
+ CONTEXT("FileChildWindow::scan_entry()");
+
+ int idx = ListBox_GetCurSel(_left_hwnd);
+
+ // delete sub entries in left pane
+ for(;;) {
+ LRESULT res = ListBox_GetItemData(_left_hwnd, idx+1);
+ Entry* sub = (Entry*) res;
+
+ if (res==LB_ERR || !sub || sub->_level<=entry->_level)
+ break;
+
+ ListBox_DeleteString(_left_hwnd, idx+1);
+ }
+
+ // empty right pane
+ ListBox_ResetContent(_right_hwnd);
+
+ // release memory
+ entry->free_subentries();
+ entry->_expanded = false;
+
+ // read contents from disk
+ entry->read_directory_base(_root._sort_order); ///@todo use modifyable sort order instead of fixed file system default
+
+ // insert found entries in right pane
+ HiddenWindow hide(_right_hwnd);
+ _right->insert_entries(entry->_down);
+
+ _right->calc_widths(false);
+ _right->set_header();
+
+ _header_wdths_ok = false;
+}
+
+
+int FileChildWindow::Notify(int id, NMHDR* pnmh)
+{
+ return (pnmh->idFrom==IDW_HEADER_LEFT? _left: _right)->Notify(id, pnmh);
+}
+
+
+String FileChildWindow::jump_to_int(LPCTSTR url)
+{
+ String dir, fname;
+
+ if (SplitFileSysURL(url, dir, fname)) {
+ Entry* entry = NULL;
+
+ // call read_tree() to iterate through the hierarchy and open all folders to reach dir
+ if (_root._entry)
+ switch(_root._entry->_etype) {
+ case ET_SHELL: { //@@ separate into FileChildWindow in ShellChildWindow, WinChildWindow, UnixChildWindow ?
+ ShellPath shell_path(dir);
+ entry = _root.read_tree(&*shell_path);
+ break;}
+
+#ifdef __WINE__
+ case ET_UNIX: {
+ LPCTSTR path = dir;
+
+ if (!_tcsicmp(path, _root._path, _tcslen(_root._path)))
+ path += _tcslen(_root._path);
+
+ entry = _root.read_tree(path);
+ break;}
+#endif
+
+ default: { // ET_NTOBJS, ET_REGISTRY, ET_FAT, ET_WINDOWS
+ LPCTSTR path = dir;
+
+ if (!_tcsnicmp(path, _root._path, _tcslen(_root._path)))
+ path += _tcslen(_root._path);
+
+ entry = _root.read_tree(path);
+ break;}
+ }
+
+ if (entry) {
+ // refresh left pane entries
+ HiddenWindow hide(_left_hwnd);
+
+ ListBox_ResetContent(_left_hwnd);
+
+ _left->insert_entries(_root._entry);
+
+ if (!_header_wdths_ok) {
+ if (_left->calc_widths(false)) {
+ _left->set_header();
+
+ _header_wdths_ok = true;
+ }
+ }
+
+ set_curdir(entry);
+
+ if (_left_hwnd) {
+ int idx = ListBox_FindItemData(_left_hwnd, -1, entry);
+
+ if (idx != -1) { // The item should always be found.
+ ListBox_SetCurSel(_left_hwnd, idx);
+ SetFocus(_left_hwnd);
+ }
+ }
+
+ ///@todo use fname
+
+ return dir; //FmtString(TEXT("file://%s"), (LPCTSTR)dir);
+ }
+ }
+
+ return String();
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // filechild.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+ /// information structure for creation of FileChildWindow
+struct FileChildWndInfo : public ChildWndInfo
+{
+ typedef ChildWndInfo super;
+
+ FileChildWndInfo(HWND hmdiclient, LPCTSTR path, ENTRY_TYPE etype=ET_UNKNOWN);
+
+ ENTRY_TYPE _etype;
+ LPCTSTR _path;
+
+ WINDOWPLACEMENT _pos;
+ int _open_mode; //OPEN_WINDOW_MODE
+};
+
+ /// information structure for creation of MDIShellBrowserChild
+struct ShellChildWndInfo : public FileChildWndInfo
+{
+ typedef FileChildWndInfo super;
+
+ ShellChildWndInfo(HWND hmdiclient, LPCTSTR path, const ShellPath& root_shell_path);
+
+ ShellPath _shell_path;
+ ShellPath _root_shell_path;
+};
+
+ /// information structure for creation of FileChildWindow for NT object namespace
+struct NtObjChildWndInfo : public FileChildWndInfo
+{
+ typedef FileChildWndInfo super;
+
+ NtObjChildWndInfo(HWND hmdiclient, LPCTSTR path);
+};
+
+ /// information structure for creation of FileChildWindow for the Registry
+struct RegistryChildWndInfo : public FileChildWndInfo
+{
+ typedef FileChildWndInfo super;
+
+ RegistryChildWndInfo(HWND hmdiclient, LPCTSTR path);
+};
+
+ /// information structure for creation of FileChildWindow
+struct FATChildWndInfo : public FileChildWndInfo
+{
+ typedef FileChildWndInfo super;
+
+ FATChildWndInfo(HWND hmdiclient, LPCTSTR path);
+};
+
+ /// information structure for creation of WebChildWindow
+struct WebChildWndInfo : public FileChildWndInfo
+{
+ typedef FileChildWndInfo super;
+
+ WebChildWndInfo(HWND hmdiclient, LPCTSTR url);
+};
+
+
+ /// MDI child window displaying file lists
+struct FileChildWindow : public ExtContextMenuHandlerT<ChildWindow>
+{
+ typedef ExtContextMenuHandlerT<ChildWindow> super;
+
+ FileChildWindow(HWND hwnd, const FileChildWndInfo& info);
+
+ static FileChildWindow* create(const FileChildWndInfo& info);
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Command(int id, int code);
+ int Notify(int id, NMHDR* pnmh);
+
+ virtual void resize_children(int cx, int cy);
+ virtual String jump_to_int(LPCTSTR url);
+
+ void scan_entry(Entry* entry);
+
+ bool expand_entry(Entry* dir);
+ static void collapse_entry(Pane* pane, Entry* dir);
+
+ void set_curdir(Entry* entry);
+ void activate_entry(Pane* pane);
+
+protected:
+ Root _root;
+ Pane* _left;
+ Pane* _right;
+ TCHAR _path[MAX_PATH];
+ bool _header_wdths_ok;
+
+public:
+ const Root& get_root() const {return _root;}
+
+ void set_focus_pane(Pane* pane)
+ {_focus_pane = pane==_right? 1: 0;}
+
+ void switch_focus_pane()
+ {SetFocus(_focus_pane? *_left: *_right);}
+};
+
+
+ /// The "Execute..."-dialog lets the user enter a command line to launch.
+struct ExecuteDialog { ///@todo use class Dialog
+ TCHAR cmd[MAX_PATH];
+ int cmdshow;
+
+ static INT_PTR CALLBACK WndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
+};
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // mainframe.cpp
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#include <precomp.h>
+
+/* We can't include webchild.h here - otherwise MinGW produces errors like: "multiple definition of `QACONTAINERFLAGS'"
+#include "webchild.h"
+*/
+extern HWND create_webchildwindow(const WebChildWndInfo& info);
+
+#include "../resource.h"
+
+#include "../dialogs/settings.h" // for MdiSdiDlg
+
+
+HWND MainFrameBase::Create(const ExplorerCmd& cmd)
+{
+ HWND hFrame;
+
+#ifndef _NO_MDI
+ if (cmd._mdi)
+ hFrame = MDIMainFrame::Create();
+ else
+#endif
+ hFrame = SDIMainFrame::Create();
+
+ if (hFrame) {
+ HWND hwndOld = g_Globals._hMainWnd;
+
+ g_Globals._hMainWnd = hFrame;
+
+ if (hwndOld)
+ DestroyWindow(hwndOld);
+
+ ShowWindow(hFrame, cmd._cmdShow);
+ UpdateWindow(hFrame);
+
+ // Open the first child window after initializing the application
+ if (cmd.IsValidPath()) {
+ // We use the static s_path variable to store the path string in order
+ // to avoid accessing prematurely freed memory in the PostMessage handlers.
+ static String s_path = cmd._path;
+
+ PostMessage(hFrame, PM_OPEN_WINDOW, cmd._flags, (LPARAM)(LPCTSTR)s_path);
+ } else
+ PostMessage(hFrame, PM_OPEN_WINDOW, OWM_EXPLORE|OWM_DETAILS, 0);
+ }
+
+ return hFrame;
+}
+
+
+int MainFrameBase::OpenShellFolders(LPIDA pida, HWND hFrameWnd)
+{
+ int cnt = 0;
+
+ LPCITEMIDLIST parent_pidl = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]);
+ ShellFolder folder(parent_pidl);
+ LOG(FmtString(TEXT("MainFrameBase::OpenShellFolders(): parent_pidl=%s"), (LPCTSTR)FileSysShellPath(parent_pidl)));
+
+ for(int i=pida->cidl; i>0; --i) {
+ LPCITEMIDLIST pidl = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[i]);
+
+ SFGAOF attribs = SFGAO_FOLDER;
+ HRESULT hr = folder->GetAttributesOf(1, &pidl, &attribs);
+
+ if (SUCCEEDED(hr))
+ if (attribs & SFGAO_FOLDER) {
+ try {
+ XMLPos explorer_options = g_Globals.get_cfg("general/explorer");
+
+ bool mdi = XMLBool(explorer_options, "mdi", true);
+ bool separateFolders = XMLBool(explorer_options, "separate-folders", true);
+
+ ShellPath pidl_abs = ShellPath(pidl).create_absolute_pidl(parent_pidl);
+ LOG(FmtString(TEXT("MainFrameBase::OpenShellFolders(): pidl_abs=%s"), (LPCTSTR)FileSysShellPath(pidl_abs)));
+
+ if (hFrameWnd && (mdi || !separateFolders)) {
+ int flags = OWM_PIDL;
+
+ if (separateFolders)
+ flags |= OWM_SEPARATE;
+
+ if (SendMessage(hFrameWnd, PM_OPEN_WINDOW, flags, (LPARAM)(LPCITEMIDLIST)pidl_abs))
+ ++cnt;
+ } else {
+ HWND hwnd;
+#ifndef _NO_MDI
+ if (mdi)
+ hwnd = MDIMainFrame::Create(pidl_abs, 0);
+ else
+#endif
+ hwnd = SDIMainFrame::Create(pidl_abs, 0);
+
+ if (hwnd)
+ ++cnt;
+ }
+ } catch(COMException& e) {
+ HandleException(e, g_Globals._hMainWnd);
+ }
+ }/*TEST
+ else { // !(attribs & SFGAO_FOLDER))
+ SHELLEXECUTEINFOA shexinfo;
+
+ shexinfo.cbSize = sizeof(SHELLEXECUTEINFOA);
+ shexinfo.fMask = SEE_MASK_INVOKEIDLIST;
+ shexinfo.hwnd = NULL;
+ shexinfo.lpVerb = NULL;
+ shexinfo.lpFile = NULL;
+ shexinfo.lpParameters = NULL;
+ shexinfo.lpDirectory = NULL;
+ shexinfo.nShow = SW_NORMAL;
+ shexinfo.lpIDList = ILCombine(parent_pidl, pidl);
+
+ if (ShellExecuteExA(&shexinfo))
+ ++cnt;
+
+ ILFree((LPITEMIDLIST)shexinfo.lpIDList);
+ }*/
+ }
+
+ return cnt;
+}
+
+
+MainFrameBase::MainFrameBase(HWND hwnd)
+ : super(hwnd)
+{
+ _himl = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLOR24, 2, 0);
+
+ _hMenuFrame = GetMenu(hwnd);
+ _hMenuWindow = GetSubMenu(_hMenuFrame, GetMenuItemCount(_hMenuFrame)-3);
+
+ _menu_info._hMenuView = GetSubMenu(_hMenuFrame, 1);
+
+ _hAccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_EXPLORER));
+
+
+ TBBUTTON toolbarBtns[] = {
+#ifdef _NO_REBAR
+ {0, 0, 0, BTNS_SEP, {0, 0}, 0, 0},
+#endif
+ {7, ID_GO_BACK, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
+ {8, ID_GO_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
+ {9, ID_GO_UP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
+ {10, ID_GO_HOME, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
+ {11, ID_GO_SEARCH, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
+ {12, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
+ {13, ID_STOP, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}
+ };
+
+ _htoolbar = CreateToolbarEx(hwnd,
+#ifndef _NO_REBAR
+ CCS_NOPARENTALIGN|CCS_NORESIZE|CCS_NODIVIDER|
+#endif
+ WS_CHILD|TBSTYLE_FLAT|WS_VISIBLE, IDW_TOOLBAR, 2, g_Globals._hInstance, IDB_TOOLBAR,
+ toolbarBtns, sizeof(toolbarBtns)/sizeof(TBBUTTON),
+ 16, 15, 16, 15, sizeof(TBBUTTON));
+
+ CheckMenuItem(_menu_info._hMenuView, ID_VIEW_TOOL_BAR, MF_BYCOMMAND|MF_CHECKED);
+
+
+ // address & command bar
+ WindowCanvas canvas(hwnd);
+ RECT rect = {0, 0, 0, 0};
+ DrawText(canvas, TEXT("My"), -1, &rect, DT_SINGLELINE|DT_NOPREFIX|DT_CALCRECT);
+ HFONT hfont = GetStockFont(DEFAULT_GUI_FONT);
+
+ _haddressedit = CreateWindow(TEXT("EDIT"), NULL, WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom,
+ hwnd, (HMENU)IDW_ADDRESSBAR, g_Globals._hInstance, 0);
+ SetWindowFont(_haddressedit, hfont, FALSE);
+ new EditController(_haddressedit);
+
+ _hcommandedit = CreateWindow(TEXT("EDIT"), TEXT("> "), WS_CHILD|WS_VISIBLE, 0, 0, 0, rect.bottom,
+ hwnd, (HMENU)IDW_COMMANDBAR, g_Globals._hInstance, 0);
+ SetWindowFont(_hcommandedit, hfont, FALSE);
+ new EditController(_hcommandedit);
+
+ /* CreateStatusWindow does not accept WS_BORDER
+ _hstatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY, STATUSCLASSNAME, 0,
+ WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|CCS_NODIVIDER, 0,0,0,0,
+ hwnd, (HMENU)IDW_STATUSBAR, g_Globals._hInstance, 0);*/
+
+ _hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, hwnd, IDW_STATUSBAR);
+ CheckMenuItem(_menu_info._hMenuView, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED);
+
+ _hsidebar = CreateWindowEx(WS_EX_STATICEDGE, WC_TREEVIEW, TEXT("Sidebar"),
+ WS_CHILD|WS_TABSTOP|WS_BORDER|/*WS_VISIBLE|*/WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_SHOWSELALWAYS|TVS_INFOTIP,
+ -1, -1, 200, 0, _hwnd, (HMENU)IDW_SIDEBAR, g_Globals._hInstance, 0);
+
+ _himl_old = TreeView_SetImageList(_hsidebar, _himl, TVSIL_NORMAL);
+
+ CheckMenuItem(_menu_info._hMenuView, ID_VIEW_SIDE_BAR, MF_BYCOMMAND|MF_UNCHECKED/*MF_CHECKED*/);
+
+
+ // create rebar window to manage toolbar and drivebar
+#ifndef _NO_REBAR
+ _hwndrebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL,
+ WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
+ RBS_VARHEIGHT|RBS_DBLCLKTOGGLE|
+ WS_BORDER|RBS_AUTOSIZE|RBS_BANDBORDERS,
+ 0, 0, 0, 0, _hwnd, 0, g_Globals._hInstance, 0);
+
+ int btn_hgt = HIWORD(SendMessage(_htoolbar, TB_GETBUTTONSIZE, 0, 0));
+
+ REBARBANDINFO rbBand;
+
+ rbBand.cbSize = sizeof(REBARBANDINFO);
+ rbBand.fMask = RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE;
+#ifndef RBBS_HIDETITLE // missing in MinGW headers as of 25.02.2004
+#define RBBS_HIDETITLE 0x400
+#endif
+ rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE;
+
+ rbBand.cxMinChild = 0;
+ rbBand.cyMinChild = 0;
+ rbBand.cyChild = 0;
+ rbBand.cyMaxChild = 0;
+ rbBand.cyIntegral = btn_hgt;
+
+ rbBand.lpText = NULL;//TEXT("Toolbar");
+ rbBand.hwndChild = _htoolbar;
+ rbBand.cxMinChild = 0;
+ rbBand.cyMinChild = btn_hgt;
+ rbBand.cx = 284;
+ SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
+#endif
+}
+
+
+MainFrameBase::~MainFrameBase()
+{
+ (void)TreeView_SetImageList(_hsidebar, _himl_old, TVSIL_NORMAL);
+ ImageList_Destroy(_himl);
+
+ // don't exit desktop when closing file manager window
+ if (!g_Globals._desktop_mode)
+ if (g_Globals._hMainWnd == _hwnd) // don't quit when switching between MDI and SDI mode
+ PostQuitMessage(0);
+}
+
+
+LRESULT MainFrameBase::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ LRESULT res;
+
+ if (ProcessMessage(nmsg, wparam, lparam, &res))
+ return res;
+ else
+ return super::WndProc(nmsg, wparam, lparam);
+}
+
+bool MainFrameBase::ProcessMessage(UINT nmsg, WPARAM wparam, LPARAM lparam, LRESULT* pres)
+{
+ switch(nmsg) {
+ case PM_TRANSLATE_MSG:
+ *pres = TranslateMsg((MSG*)lparam);
+ return true;
+
+ case WM_SHOWWINDOW:
+ if (wparam) { // trigger child resizing after window creation - now we can succesfully call IsWindowVisible()
+ int height = SendMessage(_hwndrebar, RB_GETBARHEIGHT, 0, 0);
+ MoveWindow(_hwndrebar, 0, 0, LOWORD(lparam), height, TRUE);
+ resize_frame_client();
+ }
+ return false; // goto def;
+
+ case WM_CLOSE:
+ DestroyWindow(_hwnd);
+ g_Globals._hMainWnd = 0;
+ break;
+
+ case WM_DESTROY:
+ break;
+
+ case WM_SIZE: {
+#ifdef _ROS_ ///@todo Work around to display rebar in ROS (with flickering) as long as the control isn't fixed
+ int height = SendMessage(_hwndrebar, RB_GETBARHEIGHT, 0, 0);
+ MoveWindow(_hwndrebar, 0, 0, LOWORD(lparam), height, TRUE);
+#else
+ resize_frame(LOWORD(lparam), HIWORD(lparam));
+#endif
+ } break; // do not pass message to DefFrameProc
+
+ case WM_GETMINMAXINFO: {
+ LPMINMAXINFO lpmmi = (LPMINMAXINFO)lparam;
+
+ lpmmi->ptMaxTrackSize.x <<= 1;/*2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN */
+ lpmmi->ptMaxTrackSize.y <<= 1;/*2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN */
+ break;}
+
+ case PM_FRM_CALC_CLIENT:
+ frame_get_clientspace((PRECT)lparam);
+ *pres = TRUE;
+ return true;
+
+ case PM_FRM_GET_MENUINFO:
+ *pres = (LPARAM)&_menu_info;
+ return true;
+
+ case PM_GET_CONTROLWINDOW:
+ if (wparam == FCW_STATUS) {
+ *pres = (LRESULT)(HWND)_hstatusbar;
+ return true;
+ }
+ break;
+
+ case PM_SETSTATUSTEXT:
+ SendMessage(_hstatusbar, SB_SETTEXT, 0, lparam);
+ break;
+
+ case PM_URL_CHANGED:
+ SetWindowText(_haddressedit, (LPCTSTR)lparam);
+ break;
+
+ default:
+ return false;
+ }
+
+ *pres = 0;
+ return true;
+}
+
+BOOL MainFrameBase::TranslateMsg(MSG* pmsg)
+{
+ if (TranslateAccelerator(_hwnd, _hAccel, pmsg))
+ return TRUE;
+
+ return FALSE;
+}
+
+
+int MainFrameBase::Command(int id, int code)
+{
+ CONTEXT("MainFrameBase::Command()");
+
+ switch(id) {
+ case ID_FILE_EXIT:
+ SendMessage(_hwnd, WM_CLOSE, 0, 0);
+ break;
+
+ case ID_VIEW_TOOL_BAR:
+ toggle_child(_hwnd, id, _htoolbar, 0);
+ break;
+
+ case ID_VIEW_STATUSBAR:
+ toggle_child(_hwnd, id, _hstatusbar);
+ break;
+
+ case ID_VIEW_SIDE_BAR:
+ // lazy initialization
+ if (!TreeView_GetCount(_hsidebar))
+ FillBookmarks();
+
+ toggle_child(_hwnd, id, _hsidebar);
+ break;
+
+ case ID_EXECUTE: {
+ ExecuteDialog dlg = {{0}, 0};
+
+ if (DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(IDD_EXECUTE), _hwnd, ExecuteDialog::WndProc, (LPARAM)&dlg) == IDOK) {
+ CONTEXT("ID_EXECUTE - ShellExecute()");
+
+ HINSTANCE hinst = ShellExecute(_hwnd, NULL/*operation*/, dlg.cmd/*file*/, NULL/*parameters*/, NULL/*dir*/, dlg.cmdshow);
+
+ if ((int)hinst <= 32)
+ display_error(_hwnd, GetLastError());
+ }
+ break;}
+
+ case ID_HELP:
+ WinHelp(_hwnd, TEXT("explorer")/*file explorer.hlp*/, HELP_INDEX, 0);
+ break;
+
+ case ID_VIEW_FULLSCREEN:
+ CheckMenuItem(_menu_info._hMenuView, id, toggle_fullscreen()?MF_CHECKED:0);
+ break;
+
+ case ID_TOOLS_OPTIONS:
+ Dialog::DoModal(IDD_MDI_SDI, WINDOW_CREATOR(MdiSdiDlg), _hwnd);
+ break;
+
+ case ID_ABOUT_WINDOWS:
+ ShellAbout(_hwnd, ResString(IDS_TITLE), NULL, 0);
+ break;
+
+ case ID_ABOUT_EXPLORER:
+ explorer_about(_hwnd);
+ break;
+
+ case ID_EXPLORER_FAQ:
+ launch_file(_hwnd, TEXT("http://www.sky.franken.de/explorer/"), SW_SHOW);
+ break;
+
+ case IDW_ADDRESSBAR:
+ if (code == 1) {
+ TCHAR url[BUFFER_LEN];
+
+ if (GetWindowText(_haddressedit, url, BUFFER_LEN))
+ go_to(url, false);
+ }
+ break;
+
+ case IDW_COMMANDBAR:
+ if (code == 1)
+ ExecuteCommandbar(NULL);
+ break;
+
+ default:
+ return 1; // no command handlers in Window::Command()
+ }
+
+ return 0;
+}
+
+
+void MainFrameBase::ExecuteCommandbar(LPCTSTR dir)
+{
+ TCHAR cmd[BUFFER_LEN];
+
+ if (GetWindowText(_hcommandedit, cmd, BUFFER_LEN)) {
+ CONTEXT("ExecuteCommandbar - ShellExecute()");
+
+ // remove command prompt from 'cmd' string
+ LPCTSTR p = cmd;
+
+ if (*p == '>')
+ ++p;
+
+ while(*p == ' ')
+ ++p;
+
+ if (dir) {
+ // remove "file://" from directory URL
+ if (!_tcsnicmp(dir, TEXT("file://"), 7))
+ dir += 7;
+ }
+
+ ///@todo use SHGetFileInfo() with SHGFI_EXETYPE flag to determine EXE type and open console window
+
+ HINSTANCE hinst = ShellExecute(_hwnd, NULL, p, NULL, dir, SW_SHOWNORMAL);
+
+ if ((int)hinst <= 32)
+ display_error(_hwnd, GetLastError());
+ }
+}
+
+
+int MainFrameBase::Notify(int id, NMHDR* pnmh)
+{
+ switch(pnmh->code) {
+ // resize children windows when the rebar size changes
+
+ case RBN_AUTOSIZE:
+ resize_frame_client();
+ break;
+
+ case TVN_GETINFOTIP: {
+ NMTVGETINFOTIP* pnmgit = (NMTVGETINFOTIP*)pnmh;
+
+ if (pnmgit->lParam) {
+ const BookmarkNode& node = *(BookmarkNode*)pnmgit->lParam;
+
+ if (node._type == BookmarkNode::BMNT_FOLDER) {
+ // display tooltips for bookmark folders
+ if (!node._pfolder->_description.empty())
+ lstrcpyn(pnmgit->pszText, node._pfolder->_description.c_str(), pnmgit->cchTextMax);
+ } else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
+ // display tooltips for bookmark folders
+ String txt = node._pbookmark->_description;
+
+ if (!node._pbookmark->_url.empty()) {
+ if (!txt.empty())
+ txt += TEXT(" - ");
+
+ txt += node._pbookmark->_url;
+ }
+
+ lstrcpyn(pnmgit->pszText, txt.c_str(), pnmgit->cchTextMax);
+ }
+ }
+ break;}
+
+ case NM_DBLCLK: {
+ HTREEITEM hitem = TreeView_GetSelection(_hsidebar);
+ LPARAM lparam = TreeView_GetItemData(_hsidebar, hitem);
+
+ if (lparam) {
+ const BookmarkNode& node = *(BookmarkNode*)lparam;
+
+ if (node._type == BookmarkNode::BMNT_BOOKMARK) {
+ bool new_window = GetAsyncKeyState(VK_SHIFT)<0;
+
+ go_to(node._pbookmark->_url, new_window);
+ }
+ }
+ break;}
+ }
+
+ return 0;
+}
+
+
+void MainFrameBase::resize_frame(int cx, int cy)
+{
+ if (cy <= 0)
+ return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized
+
+ RECT rect = {0, 0, cx, cy};
+
+ if (_hwndrebar) {
+ int height = SendMessage(_hwndrebar, RB_GETBARHEIGHT, 0, 0);
+ rect.top += height;
+ rect.top += 5;
+ } else {
+ if (IsWindowVisible(_htoolbar)) {
+ SendMessage(_htoolbar, WM_SIZE, 0, 0);
+ WindowRect rt(_htoolbar);
+ rect.top = rt.bottom;
+ // rect.bottom -= rt.bottom;
+ }
+ }
+
+ if (IsWindowVisible(_hstatusbar)) {
+ int parts[] = {300, 500};
+
+ SendMessage(_hstatusbar, WM_SIZE, 0, 0);
+ SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts);
+ ClientRect rt(_hstatusbar);
+ rect.bottom -= rt.bottom;
+ }
+
+ if (IsWindowVisible(_haddressedit) || IsWindowVisible(_hcommandedit)) {
+ ClientRect rt(_haddressedit);
+ rect.bottom -= rt.bottom;
+
+ int mid = (rect.right-rect.left) / 2; ///@todo use split bar
+ SetWindowPos(_haddressedit, 0, 0, rect.bottom, mid, rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER);
+ SetWindowPos(_hcommandedit, 0, mid+1, rect.bottom, rect.right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER);
+ }
+
+ if (IsWindowVisible(_hsidebar)) {
+ WindowRect rt(_hsidebar);
+ rect.left += rt.right-rt.left;
+
+ SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER);
+ }
+}
+
+void MainFrameBase::resize_frame_client()
+{
+ ClientRect rect(_hwnd);
+
+ resize_frame(rect.right, rect.bottom);
+}
+
+void MainFrameBase::frame_get_clientspace(PRECT prect)
+{
+ if (!IsIconic(_hwnd))
+ GetClientRect(_hwnd, prect);
+ else {
+ WINDOWPLACEMENT wp;
+
+ GetWindowPlacement(_hwnd, &wp);
+
+ prect->left = prect->top = 0;
+ prect->right = wp.rcNormalPosition.right-wp.rcNormalPosition.left-
+ 2*(GetSystemMetrics(SM_CXSIZEFRAME)+GetSystemMetrics(SM_CXEDGE));
+ prect->bottom = wp.rcNormalPosition.bottom-wp.rcNormalPosition.top-
+ 2*(GetSystemMetrics(SM_CYSIZEFRAME)+GetSystemMetrics(SM_CYEDGE))-
+ GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYMENUSIZE);
+ }
+
+ if (IsWindowVisible(_htoolbar)) {
+ ClientRect rt(_htoolbar);
+ prect->top += rt.bottom+2;
+ }
+
+ if (IsWindowVisible(_hstatusbar)) {
+ ClientRect rt(_hstatusbar);
+ prect->bottom -= rt.bottom;
+ }
+}
+
+BOOL MainFrameBase::toggle_fullscreen()
+{
+ RECT rt;
+
+ if ((_fullscreen._mode=!_fullscreen._mode)) {
+ GetWindowRect(_hwnd, &_fullscreen._orgPos);
+ _fullscreen._wasZoomed = IsZoomed(_hwnd);
+
+ Frame_CalcFrameClient(_hwnd, &rt);
+ ClientToScreen(_hwnd, (LPPOINT)&rt.left);
+ ClientToScreen(_hwnd, (LPPOINT)&rt.right);
+
+ rt.left = _fullscreen._orgPos.left-rt.left;
+ rt.top = _fullscreen._orgPos.top-rt.top;
+ rt.right = GetSystemMetrics(SM_CXSCREEN)+_fullscreen._orgPos.right-rt.right;
+ rt.bottom = GetSystemMetrics(SM_CYSCREEN)+_fullscreen._orgPos.bottom-rt.bottom;
+
+ MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE);
+ } else {
+ MoveWindow(_hwnd, _fullscreen._orgPos.left, _fullscreen._orgPos.top,
+ _fullscreen._orgPos.right-_fullscreen._orgPos.left,
+ _fullscreen._orgPos.bottom-_fullscreen._orgPos.top, TRUE);
+
+ if (_fullscreen._wasZoomed)
+ ShowWindow(_hwnd, WS_MAXIMIZE);
+ }
+
+ return _fullscreen._mode;
+}
+
+void MainFrameBase::fullscreen_move()
+{
+ RECT rt, pos;
+ GetWindowRect(_hwnd, &pos);
+
+ Frame_CalcFrameClient(_hwnd, &rt);
+ ClientToScreen(_hwnd, (LPPOINT)&rt.left);
+ ClientToScreen(_hwnd, (LPPOINT)&rt.right);
+
+ rt.left = pos.left-rt.left;
+ rt.top = pos.top-rt.top;
+ rt.right = GetSystemMetrics(SM_CXSCREEN)+pos.right-rt.right;
+ rt.bottom = GetSystemMetrics(SM_CYSCREEN)+pos.bottom-rt.bottom;
+
+ MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE);
+}
+
+
+void MainFrameBase::toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx)
+{
+ BOOL vis = IsWindowVisible(hchild);
+
+ CheckMenuItem(_menu_info._hMenuView, cmd, vis?MF_BYCOMMAND:MF_BYCOMMAND|MF_CHECKED);
+
+ if (band_idx != -1)
+ SendMessage(_hwndrebar, RB_SHOWBAND, band_idx, !vis);
+ else
+ ShowWindow(hchild, vis? SW_HIDE: SW_SHOW);
+
+ if (_fullscreen._mode)
+ fullscreen_move();
+
+ resize_frame_client();
+}
+
+void MainFrameBase::FillBookmarks()
+{
+ HiddenWindow hide(_hsidebar);
+ WindowCanvas canvas(_hwnd);
+
+ TreeView_DeleteAllItems(_hsidebar);
+
+ g_Globals._icon_cache.get_icon(ICID_FAVORITES).add_to_imagelist(_himl, canvas);
+ g_Globals._icon_cache.get_icon(ICID_BOOKMARK).add_to_imagelist(_himl, canvas);
+ ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), GetStockBrush(WHITE_BRUSH), canvas);
+ g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas);
+ g_Globals._icon_cache.get_icon(ICID_FOLDER).add_to_imagelist(_himl, canvas);
+
+ TV_INSERTSTRUCT tvi;
+
+ tvi.hParent = TVI_ROOT;
+ tvi.hInsertAfter = TVI_LAST;
+ tvi.item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+ ResString sFavorites(IDS_FAVORITES);
+ tvi.item.pszText = sFavorites.str();
+ tvi.item.iSelectedImage = tvi.item.iImage = 0;
+
+ HTREEITEM hitem_bookmarks = TreeView_InsertItem(_hsidebar, &tvi);
+
+ g_Globals._favorites.fill_tree(_hsidebar, hitem_bookmarks, _himl, canvas);
+
+ TreeView_Expand(_hsidebar, hitem_bookmarks, TVE_EXPAND);
+}
+
+
+bool MainFrameBase::go_to(LPCTSTR url, bool new_window)
+{
+ ///@todo SDI implementation
+
+ return false;
+}
+
+
+#ifndef _NO_MDI
+
+MDIMainFrame::MDIMainFrame(HWND hwnd)
+ : super(hwnd)
+{
+ TBBUTTON mdiBtns[] = {
+ {0, 0, 0, BTNS_SEP, {0, 0}, 0, 0},
+ {0, ID_WINDOW_NEW, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
+ {1, ID_WINDOW_CASCADE, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
+ {2, ID_WINDOW_TILE_HORZ, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
+ {3, ID_WINDOW_TILE_VERT, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0}
+ };
+
+ SendMessage(_htoolbar, TB_ADDBUTTONS, sizeof(mdiBtns)/sizeof(TBBUTTON), (LPARAM)&mdiBtns);
+
+ CLIENTCREATESTRUCT ccs;
+
+ ccs.hWindowMenu = _hMenuWindow;
+ ccs.idFirstChild = IDW_FIRST_CHILD;
+
+ _hmdiclient = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("MDICLIENT"), NULL,
+ WS_CHILD|WS_CLIPCHILDREN|WS_VSCROLL|WS_HSCROLL|WS_VISIBLE|WS_BORDER,
+ 0, 0, 0, 0,
+ hwnd, 0, g_Globals._hInstance, &ccs);
+
+ TBBUTTON extraBtns = {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0};
+
+#ifndef _NO_REBAR
+ _hextrabar = CreateToolbarEx(hwnd,
+ CCS_NOPARENTALIGN|CCS_NORESIZE|CCS_NODIVIDER|
+ WS_CHILD|TBSTYLE_FLAT|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST,
+ IDW_EXTRABAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, NULL, 0,
+ 16, 15, 16, 15, sizeof(TBBUTTON));
+#else
+ _hextrabar = CreateToolbarEx(hwnd,
+ WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST,CCS_NODIVIDER|
+ IDW_EXTRABAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &extraBtns, 1,
+ 16, 13, 16, 13, sizeof(TBBUTTON));
+#endif
+
+ CheckMenuItem(_menu_info._hMenuView, ID_VIEW_EXTRA_BAR, MF_BYCOMMAND|MF_CHECKED);
+
+
+ extraBtns.fsStyle = BTNS_BUTTON;
+
+#ifdef __WINE__
+ // insert unix file system button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("/\0"));
+ extraBtns.idCommand = ID_DRIVE_UNIX_FS;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+#endif
+
+ // insert explorer window button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Explore\0"));
+ extraBtns.idCommand = ID_DRIVE_DESKTOP;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+
+ // insert shell namespace button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Shell\0"));
+ extraBtns.idCommand = ID_DRIVE_SHELL_NS;
+ extraBtns.iBitmap = 6;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+
+ // insert web control button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Web\0"));
+ extraBtns.idCommand = ID_WEB_WINDOW;
+ extraBtns.iBitmap = 7;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+
+ if ((HIWORD(GetVersion())>>14) == W_VER_NT) {
+ // insert NT object namespace button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("NT Obj\0"));
+ extraBtns.idCommand = ID_DRIVE_NTOBJ_NS;
+ extraBtns.iBitmap = 8;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+ }
+
+ // insert Registry button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("Reg.\0"));
+ extraBtns.idCommand = ID_DRIVE_REGISTRY;
+ extraBtns.iBitmap = 9;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+
+#ifdef _DEBUG
+ // insert FAT direct file system access button
+ extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("FAT\0"));
+ extraBtns.idCommand = ID_DRIVE_FAT;
+ extraBtns.iBitmap = 10;
+ SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
+#endif
+
+
+ TBBUTTON drivebarBtn = {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0};
+#ifndef _NO_WIN_FS
+ PTSTR p;
+
+#ifndef _NO_REBAR
+ _hdrivebar = CreateToolbarEx(hwnd,
+ CCS_NOPARENTALIGN|CCS_NORESIZE|CCS_NODIVIDER|
+ WS_CHILD|WS_VISIBLE|TBSTYLE_FLAT|CCS_NOMOVEY|TBSTYLE_LIST,
+ IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, NULL, 0,
+ 16, 15, 16, 15, sizeof(TBBUTTON));
+#else
+ _hdrivebar = CreateToolbarEx(hwnd,
+ WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST|CCS_NODIVIDER,
+ IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &drivebarBtn, 1,
+ 16, 13, 16, 13, sizeof(TBBUTTON));
+#endif
+#endif
+
+ CheckMenuItem(_menu_info._hMenuView, ID_VIEW_DRIVE_BAR, MF_BYCOMMAND|MF_CHECKED);
+
+
+#ifndef _NO_WIN_FS
+ GetLogicalDriveStrings(BUFFER_LEN, _drives);
+
+ // register windows drive root strings
+ SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)_drives);
+
+ drivebarBtn.fsStyle = BTNS_BUTTON;
+ drivebarBtn.idCommand = ID_DRIVE_FIRST;
+
+ for(p=_drives; *p; ) {
+ switch(GetDriveType(p)) {
+ case DRIVE_REMOVABLE: drivebarBtn.iBitmap = 1; break;
+ case DRIVE_CDROM: drivebarBtn.iBitmap = 3; break;
+ case DRIVE_REMOTE: drivebarBtn.iBitmap = 4; break;
+ case DRIVE_RAMDISK: drivebarBtn.iBitmap = 5; break;
+ default:/*DRIVE_FIXED*/ drivebarBtn.iBitmap = 2;
+ }
+
+ SendMessage(_hdrivebar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&drivebarBtn);
+ ++drivebarBtn.idCommand;
+ ++drivebarBtn.iString;
+
+ while(*p++);
+ }
+#endif
+
+
+#ifndef _NO_REBAR
+ int btn_hgt = HIWORD(SendMessage(_htoolbar, TB_GETBUTTONSIZE, 0, 0));
+
+ REBARBANDINFO rbBand;
+
+ rbBand.cbSize = sizeof(REBARBANDINFO);
+ rbBand.fMask = RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE;
+#ifndef RBBS_HIDETITLE // missing in MinGW headers as of 25.02.2004
+#define RBBS_HIDETITLE 0x400
+#endif
+ rbBand.fStyle = RBBS_CHILDEDGE|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE;
+
+ rbBand.lpText = TEXT("Extras");
+ rbBand.hwndChild = _hextrabar;
+ rbBand.cxMinChild = 0;
+ rbBand.cyMinChild = btn_hgt;
+ rbBand.cx = 284;
+ SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
+
+#ifndef _NO_WIN_FS
+ rbBand.fStyle |= RBBS_BREAK;
+ rbBand.lpText = TEXT("Drives");
+ rbBand.hwndChild = _hdrivebar;
+ rbBand.cxMinChild = 0;
+ rbBand.cyMinChild = btn_hgt;
+ rbBand.cx = 400;
+ SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
+#endif
+#endif
+}
+
+
+HWND MDIMainFrame::Create()
+{
+ HMENU hMenuFrame = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(IDM_MDIFRAME));
+
+ return Window::Create(WINDOW_CREATOR(MDIMainFrame), 0,
+ (LPCTSTR)(int)g_Globals._hframeClass, ResString(IDS_TITLE), WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ 0/*hwndDesktop*/, hMenuFrame);
+}
+
+HWND MDIMainFrame::Create(LPCTSTR path, int mode)
+{
+ HWND hFrame = Create();
+ if (!hFrame)
+ return 0;
+
+ ShowWindow(hFrame, SW_SHOW);
+
+ MDIMainFrame* pMainFrame = GET_WINDOW(MDIMainFrame, hFrame);
+
+ if (pMainFrame)
+ pMainFrame->CreateChild(path, mode);
+
+ return hFrame;
+}
+
+HWND MDIMainFrame::Create(LPCITEMIDLIST pidl, int mode)
+{
+ HWND hFrame = Create();
+ if (!hFrame)
+ return 0;
+
+ ShowWindow(hFrame, SW_SHOW);
+
+ MDIMainFrame* pMainFrame = GET_WINDOW(MDIMainFrame, hFrame);
+
+ if (pMainFrame)
+ pMainFrame->CreateChild(pidl, mode);
+
+ return hFrame;
+}
+
+
+ChildWindow* MDIMainFrame::CreateChild(LPCTSTR path, int mode)
+{
+ return reinterpret_cast<ChildWindow*>(SendMessage(_hwnd, PM_OPEN_WINDOW, mode, (LPARAM)path));
+}
+
+ChildWindow* MDIMainFrame::CreateChild(LPCITEMIDLIST pidl, int mode)
+{
+ return reinterpret_cast<ChildWindow*>(SendMessage(_hwnd, PM_OPEN_WINDOW, mode|OWM_PIDL, (LPARAM)pidl));
+}
+
+
+BOOL MDIMainFrame::TranslateMsg(MSG* pmsg)
+{
+ if (_hmdiclient && TranslateMDISysAccel(_hmdiclient, pmsg))
+ return TRUE;
+
+ return super::TranslateMsg(pmsg);
+}
+
+LRESULT MDIMainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case PM_OPEN_WINDOW: {
+ CONTEXT("MDIMainFrame PM_OPEN_WINDOW");
+
+ TCHAR buffer[MAX_PATH];
+ LPCTSTR path;
+ ShellPath shell_path = DesktopFolderPath();
+
+ if (lparam) {
+ if (wparam & OWM_PIDL) {
+ // take over PIDL from lparam
+ shell_path.assign((LPCITEMIDLIST)lparam); // create as "rooted" window
+ FileSysShellPath fsp(shell_path);
+ path = fsp;
+
+ if (path) {
+ LOG(FmtString(TEXT("MDIMainFrame PM_OPEN_WINDOW: path=%s"), path));
+ lstrcpy(buffer, path);
+ path = buffer;
+ }
+ } else {
+ // take over path from lparam
+ path = (LPCTSTR)lparam;
+ shell_path = path; // create as "rooted" window
+ }
+ } else {
+ ///@todo read paths and window placements from registry
+ if (!GetCurrentDirectory(MAX_PATH, buffer))
+ *buffer = '\0';
+
+ path = buffer;
+ }
+
+ if (path && _tcsstr(path, TEXT("://"))) { // "http://...", "ftp://", ...
+ OBJ_CONTEXT("create WebChild window", path);
+
+ return (LRESULT)GET_WINDOW(ChildWindow, create_webchildwindow(WebChildWndInfo(_hmdiclient, path)));
+ } else {
+ OBJ_CONTEXT("create ShellChildWndInfo", path);
+
+ // Shell Namespace as default view
+ ShellChildWndInfo create_info(_hmdiclient, path, shell_path);
+
+ if (wparam & OWM_ROOTED)
+ create_info._root_shell_path = shell_path;
+ else
+ create_info._root_shell_path = DesktopFolderPath(); //SpecialFolderPath(CSIDL_DRIVES, _hwnd);
+
+ create_info._pos.showCmd = wparam&OWM_SEPARATE? SW_SHOWNORMAL: SW_SHOWMAXIMIZED;
+ create_info._pos.rcNormalPosition.left = CW_USEDEFAULT;
+ create_info._pos.rcNormalPosition.top = CW_USEDEFAULT;
+ create_info._pos.rcNormalPosition.right = CW_USEDEFAULT;
+ create_info._pos.rcNormalPosition.bottom = CW_USEDEFAULT;
+
+ create_info._open_mode = wparam;
+
+ // FileChildWindow::create(_hmdiclient, create_info);
+ return (LRESULT)MDIShellBrowserChild::create(create_info);
+ }
+ return TRUE;} // success
+
+ default: {
+ LRESULT res;
+
+ if (super::ProcessMessage(nmsg, wparam, lparam, &res))
+ return res;
+ else
+ return DefFrameProc(_hwnd, _hmdiclient, nmsg, wparam, lparam);
+ }
+ }
+
+ return 0;
+}
+
+int MDIMainFrame::Command(int id, int code)
+{
+ CONTEXT("MDIMainFrame::Command()");
+
+ HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0);
+
+ if (hwndClient)
+ if (SendMessage(hwndClient, PM_DISPATCH_COMMAND, MAKELONG(id,code), 0))
+ return 0;
+
+#ifndef _NO_WIN_FS
+ if (id>=ID_DRIVE_FIRST && id<=ID_DRIVE_FIRST+0xFF) {
+ TCHAR drv[_MAX_DRIVE], path[MAX_PATH];
+ LPCTSTR root = _drives;
+
+ for(int i=id-ID_DRIVE_FIRST; i--; root++)
+ while(*root)
+ ++root;
+
+ if (activate_drive_window(root))
+ return 0;
+
+ _tsplitpath_s(root, drv, COUNTOF(drv), NULL, 0, NULL, 0, NULL, 0);
+
+ if (!SetCurrentDirectory(drv)) {
+ display_error(_hwnd, GetLastError());
+ return 0;
+ }
+
+ GetCurrentDirectory(MAX_PATH, path); ///@todo store last directory per drive
+
+ FileChildWindow::create(FileChildWndInfo(_hmdiclient, path));
+
+ return 1;
+ }
+#endif
+
+ switch(id) {
+ case ID_WINDOW_NEW: {
+ TCHAR path[MAX_PATH];
+
+ GetCurrentDirectory(MAX_PATH, path);
+
+ FileChildWindow::create(FileChildWndInfo(_hmdiclient, path));
+ break;}
+
+ case ID_WINDOW_CASCADE:
+ SendMessage(_hmdiclient, WM_MDICASCADE, 0, 0);
+ break;
+
+ case ID_WINDOW_TILE_HORZ:
+ SendMessage(_hmdiclient, WM_MDITILE, MDITILE_HORIZONTAL, 0);
+ break;
+
+ case ID_WINDOW_TILE_VERT:
+ SendMessage(_hmdiclient, WM_MDITILE, MDITILE_VERTICAL, 0);
+ break;
+
+ case ID_WINDOW_ARRANGE:
+ SendMessage(_hmdiclient, WM_MDIICONARRANGE, 0, 0);
+ break;
+
+ case ID_VIEW_EXTRA_BAR:
+ toggle_child(_hwnd, id, _hextrabar, 1);
+ break;
+
+#ifndef _NO_WIN_FS
+ case ID_VIEW_DRIVE_BAR:
+ toggle_child(_hwnd, id, _hdrivebar, 2);
+ break;
+#endif
+
+#ifdef __WINE__
+ case ID_DRIVE_UNIX_FS: {
+ TCHAR path[MAX_PATH];
+ FileChildWindow* child;
+
+ getcwd(path, COUNTOF(path));
+
+ if (activate_child_window(TEXT("unixfs")))
+ break;
+
+ FileChildWindow::create(_hmdiclient, FileChildWndInfo(path));
+ break;}
+#endif
+
+ case ID_DRIVE_DESKTOP: {
+ TCHAR path[MAX_PATH];
+
+ if (activate_child_window(TEXT("Desktop")))
+ break;
+
+ GetCurrentDirectory(MAX_PATH, path);
+
+ MDIShellBrowserChild::create(ShellChildWndInfo(_hmdiclient, path, DesktopFolderPath()));
+ break;}
+
+ case ID_DRIVE_SHELL_NS: {
+ TCHAR path[MAX_PATH];
+ GetCurrentDirectory(MAX_PATH, path);
+
+ if (activate_child_window(TEXT("Shell")))
+ break;
+
+ FileChildWindow::create(ShellChildWndInfo(_hmdiclient, path, DesktopFolderPath()));
+ break;}
+
+ case ID_DRIVE_NTOBJ_NS: {
+ if (activate_child_window(TEXT("NTOBJ")))
+ break;
+
+ FileChildWindow::create(NtObjChildWndInfo(_hmdiclient, TEXT("\\")));
+ break;}
+
+ case ID_DRIVE_REGISTRY: {
+ if (activate_child_window(TEXT("Registry")))
+ break;
+
+ FileChildWindow::create(RegistryChildWndInfo(_hmdiclient, TEXT("\\")));
+ break;}
+
+ case ID_DRIVE_FAT: {
+
+ ///@todo prompt for image file
+
+ if (activate_child_window(TEXT("FAT")))
+ break;
+
+ FileChildWindow::create(FATChildWndInfo(_hmdiclient, TEXT("FAT Image"))); //@@
+ break;}
+
+ case ID_WEB_WINDOW:
+#ifdef _DEBUG
+ create_webchildwindow(WebChildWndInfo(_hmdiclient, TEXT("http://localhost")));
+#else
+ create_webchildwindow(WebChildWndInfo(_hmdiclient, TEXT("http://www.reactos.org")));
+#endif
+ break;
+
+ case ID_EXPLORER_FAQ:
+ create_webchildwindow(WebChildWndInfo(_hmdiclient, TEXT("http://www.sky.franken.de/explorer/")));
+ break;
+
+ case ID_VIEW_SDI:
+ MainFrameBase::Create(ExplorerCmd());
+ break;
+
+ case IDW_COMMANDBAR:
+ if (code == 1) {
+ TCHAR url[BUFFER_LEN];
+ LPCTSTR dir;
+
+ if (GetWindowText(_haddressedit, url, BUFFER_LEN))
+ dir = url;
+ else
+ dir = NULL;
+
+ ExecuteCommandbar(dir);
+ }
+ break;
+
+ ///@todo There are even more menu items!
+
+ default:
+ if (super::Command(id, code) == 0)
+ return 0;
+ else
+ return DefFrameProc(_hwnd, _hmdiclient, WM_COMMAND, MAKELONG(id,code), 0);
+ }
+
+ return 0;
+}
+
+
+void MDIMainFrame::frame_get_clientspace(PRECT prect)
+{
+ super::frame_get_clientspace(prect);
+
+#ifndef _NO_WIN_FS
+ if (IsWindowVisible(_hdrivebar)) {
+ ClientRect rt(_hdrivebar);
+ prect->top += rt.bottom+2;
+ }
+#endif
+}
+
+void MDIMainFrame::resize_frame(int cx, int cy)
+{
+ if (cy <= 0)
+ return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized
+
+ RECT rect = {0, 0, cx, cy};
+
+ if (_hwndrebar) {
+ int height = SendMessage(_hwndrebar, RB_GETBARHEIGHT, 0, 0);
+ rect.top += height;
+ rect.top += 5;
+ } else {
+ if (IsWindowVisible(_htoolbar)) {
+ SendMessage(_htoolbar, WM_SIZE, 0, 0);
+ WindowRect rt(_htoolbar);
+ rect.top = rt.bottom;
+ // rect.bottom -= rt.bottom;
+ }
+
+ if (IsWindowVisible(_hextrabar)) {
+ SendMessage(_hextrabar, WM_SIZE, 0, 0);
+ WindowRect rt(_hextrabar);
+ int new_top = --rect.top + rt.bottom;
+ MoveWindow(_hextrabar, 0, rect.top, rt.right, new_top, TRUE);
+ rect.top = new_top;
+ // rect.bottom -= rt.bottom;
+ }
+
+#ifndef _NO_WIN_FS
+ if (IsWindowVisible(_hdrivebar)) {
+ SendMessage(_hdrivebar, WM_SIZE, 0, 0);
+ WindowRect rt(_hdrivebar);
+ int new_top = --rect.top + rt.bottom;
+ MoveWindow(_hdrivebar, 0, rect.top, rt.right, new_top, TRUE);
+ rect.top = new_top;
+ // rect.bottom -= rt.bottom;
+ }
+#endif
+ }
+
+ if (IsWindowVisible(_hstatusbar)) {
+ int parts[] = {300, 500};
+
+ SendMessage(_hstatusbar, WM_SIZE, 0, 0);
+ SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts);
+ ClientRect rt(_hstatusbar);
+ rect.bottom -= rt.bottom;
+ }
+
+ if (IsWindowVisible(_haddressedit) || IsWindowVisible(_hcommandedit)) {
+ ClientRect rt(_haddressedit);
+ rect.bottom -= rt.bottom;
+
+ int mid = (rect.right-rect.left) / 2; ///@todo use split bar
+ SetWindowPos(_haddressedit, 0, 0, rect.bottom, mid, rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER);
+ SetWindowPos(_hcommandedit, 0, mid+1, rect.bottom, rect.right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER);
+ }
+
+ if (IsWindowVisible(_hsidebar)) {
+ WindowRect rt(_hsidebar);
+ rect.left += rt.right-rt.left;
+
+ SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER);
+ }
+
+ MoveWindow(_hmdiclient, rect.left-1, rect.top-1, rect.right-rect.left+1, rect.bottom-rect.top+1, TRUE);
+}
+
+bool MDIMainFrame::activate_drive_window(LPCTSTR path)
+{
+ TCHAR drv1[_MAX_DRIVE], drv2[_MAX_DRIVE];
+ HWND child_wnd;
+
+ _tsplitpath_s(path, drv1, COUNTOF(drv1), NULL, 0, NULL, 0, NULL, 0);
+
+ // search for a already open window for the same drive
+ for(child_wnd=::GetNextWindow(_hmdiclient,GW_CHILD); child_wnd; child_wnd=::GetNextWindow(child_wnd, GW_HWNDNEXT)) {
+ FileChildWindow* child = (FileChildWindow*) SendMessage(child_wnd, PM_GET_FILEWND_PTR, 0, 0);
+
+ if (child) {
+ _tsplitpath_s(child->get_root()._path, drv2, COUNTOF(drv2), NULL, 0, NULL, 0, NULL, 0);
+
+ if (!lstrcmpi(drv2, drv1)) {
+ SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
+
+ if (IsMinimized(child_wnd))
+ ShowWindow(child_wnd, SW_SHOWNORMAL);
+
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+bool MDIMainFrame::activate_child_window(LPCTSTR filesys)
+{
+ HWND child_wnd;
+
+ // search for a already open window of the given file system name
+ for(child_wnd=::GetNextWindow(_hmdiclient,GW_CHILD); child_wnd; child_wnd=::GetNextWindow(child_wnd, GW_HWNDNEXT)) {
+ FileChildWindow* child = (FileChildWindow*) SendMessage(child_wnd, PM_GET_FILEWND_PTR, 0, 0);
+
+ if (child) {
+ if (!lstrcmpi(child->get_root()._fs, filesys)) {
+ SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
+
+ if (IsMinimized(child_wnd))
+ ShowWindow(child_wnd, SW_SHOWNORMAL);
+
+ return true;
+ }
+ } else {
+ ShellBrowser* shell_child = (ShellBrowser*) SendMessage(child_wnd, PM_GET_SHELLBROWSER_PTR, 0, 0);
+
+ if (shell_child) {
+ if (!lstrcmpi(shell_child->get_root()._fs, filesys)) {
+ SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
+
+ if (IsMinimized(child_wnd))
+ ShowWindow(child_wnd, SW_SHOWNORMAL);
+
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+bool MDIMainFrame::go_to(LPCTSTR url, bool new_window)
+{
+ if (!new_window) {
+ HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0);
+
+ if (hwndClient)
+ if (SendMessage(hwndClient, PM_JUMP_TO_URL, 0, (LPARAM)url))
+ return true;
+ }
+
+ if (CreateChild(url))
+ return true;
+
+ return super::go_to(url, new_window);
+}
+
+#endif // _NO_MDI
+
+
+SDIMainFrame::SDIMainFrame(HWND hwnd)
+ : super(hwnd)
+{
+ _split_pos = DEFAULT_SPLIT_POS;
+ _last_split = DEFAULT_SPLIT_POS;
+
+ /* wait for PM_OPEN_WINDOW message before creating a shell view
+ update_shell_browser();*/
+}
+
+HWND SDIMainFrame::Create()
+{
+ HMENU hMenuFrame = LoadMenu(g_Globals._hInstance, MAKEINTRESOURCE(IDM_SDIFRAME));
+
+ return Window::Create(WINDOW_CREATOR(SDIMainFrame), 0,
+ (LPCTSTR)(int)g_Globals._hframeClass, ResString(IDS_TITLE), WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+ 0/*hwndDesktop*/, hMenuFrame);
+}
+
+HWND SDIMainFrame::Create(LPCITEMIDLIST pidl, int mode)
+{
+ HWND hFrame = Create();
+ if (!hFrame)
+ return 0;
+
+ ShowWindow(hFrame, SW_SHOW);
+
+ SDIMainFrame* pFrame = GET_WINDOW(SDIMainFrame, hFrame);
+
+ if (pFrame)
+ pFrame->jump_to(pidl, mode);
+
+ return hFrame;
+}
+
+HWND SDIMainFrame::Create(LPCTSTR path, int mode)
+{
+ HWND hFrame = Create();
+ if (!hFrame)
+ return 0;
+
+ ShowWindow(hFrame, SW_SHOW);
+
+ MDIMainFrame* pMainFrame = GET_WINDOW(MDIMainFrame, hFrame);
+
+ if (pMainFrame)
+ pMainFrame->CreateChild(path, mode);
+
+ return hFrame;
+}
+
+LRESULT SDIMainFrame::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_SIZE:
+ resize_frame(LOWORD(lparam), HIWORD(lparam));
+ break;
+
+ case WM_PAINT: {
+ PaintCanvas canvas(_hwnd);
+
+ if (_left_hwnd) {
+ ClientRect rt(_hwnd);
+ rt.left = _split_pos-SPLIT_WIDTH/2;
+ rt.right = _split_pos+SPLIT_WIDTH/2+1;
+
+ if (_right_hwnd) {
+ WindowRect right_rect(_right_hwnd);
+ ScreenToClient(_hwnd, &right_rect);
+ rt.top = right_rect.top;
+ rt.bottom = right_rect.bottom;
+ }
+
+ HBRUSH lastBrush = SelectBrush(canvas, GetStockBrush(COLOR_SPLITBAR));
+ Rectangle(canvas, rt.left, rt.top-1, rt.right, rt.bottom+1);
+ SelectObject(canvas, lastBrush);
+ }
+ break;}
+
+ case WM_SETCURSOR:
+ if (_left_hwnd)
+ if (LOWORD(lparam) == HTCLIENT) {
+ POINT pt;
+ GetCursorPos(&pt);
+ ScreenToClient(_hwnd, &pt);
+
+ if (pt.x>=_split_pos-SPLIT_WIDTH/2 && pt.x<_split_pos+SPLIT_WIDTH/2+1) {
+ SetCursor(LoadCursor(0, IDC_SIZEWE));
+ return TRUE;
+ }
+ }
+ goto def;
+
+ case WM_LBUTTONDOWN:
+ if (_left_hwnd) {
+ int x = GET_X_LPARAM(lparam);
+
+ ClientRect rt(_hwnd);
+
+ if (x>=_split_pos-SPLIT_WIDTH/2 && x<_split_pos+SPLIT_WIDTH/2+1) {
+ _last_split = _split_pos;
+ SetCapture(_hwnd);
+ }
+ }
+ break;
+
+ case WM_LBUTTONUP:
+ if (GetCapture() == _hwnd)
+ ReleaseCapture();
+ break;
+
+ case WM_KEYDOWN:
+ if (wparam == VK_ESCAPE)
+ if (GetCapture() == _hwnd) {
+ _split_pos = _last_split;
+ resize_children();
+ _last_split = -1;
+ ReleaseCapture();
+ SetCursor(LoadCursor(0, IDC_ARROW));
+ }
+ break;
+
+ case WM_MOUSEMOVE:
+ if (GetCapture() == _hwnd) {
+ int x = GET_X_LPARAM(lparam);
+
+ ClientRect rt(_hwnd);
+
+ if (x>=0 && x<rt.right) {
+ _split_pos = x;
+ resize_children();
+ rt.left = x-SPLIT_WIDTH/2;
+ rt.right = x+SPLIT_WIDTH/2+1;
+ InvalidateRect(_hwnd, &rt, FALSE);
+ UpdateWindow(_left_hwnd);
+ UpdateWindow(_hwnd);
+ UpdateWindow(_right_hwnd);
+ }
+ }
+ break;
+
+ case PM_OPEN_WINDOW: {
+ CONTEXT("SDIMainFrame PM_OPEN_WINDOW");
+
+ TCHAR buffer[MAX_PATH];
+ LPCTSTR path;
+ ShellPath shell_path = DesktopFolderPath();
+
+ if (lparam) {
+ if (wparam & OWM_PIDL) {
+ // take over PIDL from lparam
+ shell_path.assign((LPCITEMIDLIST)lparam); // create as "rooted" window
+ FileSysShellPath fsp(shell_path);
+ path = fsp;
+
+ if (path) {
+ LOG(FmtString(TEXT("SDIMainFrame PM_OPEN_WINDOW: path=%s"), path));
+ lstrcpy(buffer, path);
+ path = buffer;
+ }
+ } else {
+ // take over path from lparam
+ path = (LPCTSTR)lparam;
+ shell_path = path; // create as "rooted" window
+ }
+ } else {
+ ///@todo read paths and window placements from registry
+ if (!GetCurrentDirectory(MAX_PATH, buffer))
+ *buffer = '\0';
+
+ path = buffer;
+ shell_path = path;
+ }
+
+ if (wparam & OWM_ROOTED)
+ _shellpath_info._root_shell_path = shell_path;
+ else
+ _shellpath_info._root_shell_path = DesktopFolderPath(); //SpecialFolderPath(CSIDL_DRIVES, _hwnd);
+
+ jump_to(shell_path, wparam); //@todo content of 'path' not used any more
+ return TRUE;} // success
+
+ default: def:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+int SDIMainFrame::Command(int id, int code)
+{
+ switch(id) {
+ case ID_VIEW_MDI:
+ MainFrameBase::Create(ExplorerCmd(_url, true));
+ break;
+
+ case IDW_COMMANDBAR:
+ if (code == 1)
+ ExecuteCommandbar(_url);
+ break;
+
+ default:
+ return super::Command(id, code);
+ }
+
+ return 0;
+}
+
+void SDIMainFrame::resize_frame(int cx, int cy)
+{
+ if (cy <= 0)
+ return; // avoid resizing children when receiving RBN_AUTOSIZE while getting minimized
+
+ RECT rect = {0, 0, cx, cy};
+
+ if (_hwndrebar) {
+ int height = ClientRect(_hwndrebar).bottom;
+ rect.top += height;
+ rect.top += 5;
+ } else {
+ if (IsWindowVisible(_htoolbar)) {
+ SendMessage(_htoolbar, WM_SIZE, 0, 0);
+ WindowRect rt(_htoolbar);
+ rect.top = rt.bottom;
+ // rect.bottom -= rt.bottom;
+ }
+ }
+
+ if (IsWindowVisible(_hstatusbar)) {
+ int parts[] = {300, 500};
+
+ SendMessage(_hstatusbar, WM_SIZE, 0, 0);
+ SendMessage(_hstatusbar, SB_SETPARTS, 2, (LPARAM)&parts);
+ ClientRect rt(_hstatusbar);
+ rect.bottom -= rt.bottom;
+ }
+
+ if (IsWindowVisible(_haddressedit) || IsWindowVisible(_hcommandedit)) {
+ ClientRect rt(_haddressedit);
+ rect.bottom -= rt.bottom;
+
+ int mid = (rect.right-rect.left) / 2; ///@todo use split bar
+ SetWindowPos(_haddressedit, 0, 0, rect.bottom, mid, rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER);
+ SetWindowPos(_hcommandedit, 0, mid+1, rect.bottom, rect.right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER);
+ }
+
+ if (IsWindowVisible(_hsidebar)) {
+ WindowRect rt(_hsidebar);
+ rect.left += rt.right-rt.left;
+
+ SetWindowPos(_hsidebar, 0, -1, rect.top-1, rt.right-rt.left, rect.bottom-rect.top+1, SWP_NOACTIVATE|SWP_NOZORDER);
+ }
+
+ _clnt_rect = rect;
+
+ resize_children();
+}
+
+void SDIMainFrame::resize_children()
+{
+ HDWP hdwp = BeginDeferWindowPos(2);
+
+ int cx = _clnt_rect.left;
+
+ if (_left_hwnd) {
+ cx = _split_pos + SPLIT_WIDTH/2;
+
+ hdwp = DeferWindowPos(hdwp, _left_hwnd, 0, _clnt_rect.left, _clnt_rect.top, _split_pos-SPLIT_WIDTH/2-_clnt_rect.left, _clnt_rect.bottom-_clnt_rect.top, SWP_NOZORDER|SWP_NOACTIVATE);
+ } else {
+ //_split_pos = -1;
+ cx = 0;
+ }
+
+ if (_right_hwnd)
+ hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, _clnt_rect.left+cx+1, _clnt_rect.top, _clnt_rect.right-cx, _clnt_rect.bottom-_clnt_rect.top, SWP_NOZORDER|SWP_NOACTIVATE);
+
+ EndDeferWindowPos(hdwp);
+}
+
+void SDIMainFrame::update_clnt_rect()
+{
+ ClientRect rect(_hwnd);
+
+ resize_frame(rect.right, rect.bottom);
+}
+
+void SDIMainFrame::update_shell_browser()
+{
+ int split_pos = DEFAULT_SPLIT_POS;
+
+ if (_shellBrowser.get()) {
+ split_pos = _split_pos;
+ delete _shellBrowser.release();
+ }
+
+ // create explorer treeview
+ if (_shellpath_info._open_mode & OWM_EXPLORE) {
+ if (!_left_hwnd) {
+ ClientRect rect(_hwnd);
+
+ _left_hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL,
+ WS_CHILD|WS_TABSTOP|WS_VISIBLE|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_NOTOOLTIPS|TVS_SHOWSELALWAYS,
+ 0, rect.top, split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top,
+ _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0);
+
+ // display tree window as long as the shell view is not yet visible
+ resize_frame(rect.right, rect.bottom);
+ MoveWindow(_left_hwnd, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE);
+ }
+ } else {
+ if (_left_hwnd) {
+ DestroyWindow(_left_hwnd);
+ _left_hwnd = 0;
+ }
+ }
+
+ _shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _hwnd, _left_hwnd, _right_hwnd,
+ _shellpath_info, this, _cm_ifs));
+
+ if (_left_hwnd)
+ _shellBrowser->Init();
+
+ // update _clnt_rect and set size of new created shell view windows
+ update_clnt_rect();
+}
+
+void SDIMainFrame::entry_selected(Entry* entry)
+{
+ if (_left_hwnd)
+ _shellBrowser->select_folder(entry, false);
+
+ _shellBrowser->UpdateFolderView(entry->get_shell_folder());
+
+ // set size of new created shell view windows
+ resize_children();
+
+ TCHAR path[MAX_PATH];
+
+ if (entry->get_path(path, COUNTOF(path))) {
+ String url;
+
+ if (path[0] == ':')
+ url.printf(TEXT("shell://%s"), path);
+ else
+ url.printf(TEXT("file://%s"), path);
+
+ set_url(url);
+ }
+}
+
+void SDIMainFrame::set_url(LPCTSTR url)
+{
+ if (_url != url) {
+ _url = url;
+
+ SetWindowText(_haddressedit, url); //SendMessage(_hwndFrame, PM_URL_CHANGED, 0, (LPARAM)url);
+ }
+}
+
+void SDIMainFrame::jump_to(LPCTSTR path, int mode)
+{/*@@todo
+ if (_shellBrowser.get() && (_shellpath_info._open_mode&~OWM_PIDL)==(mode&~OWM_PIDL)) {
+ _shellBrowser->jump_to(path);
+
+ _shellpath_info._shell_path = path;
+ } else */{
+ _shellpath_info._open_mode = mode;
+ _shellpath_info._shell_path = path;
+
+ update_shell_browser();
+ }
+}
+
+void SDIMainFrame::jump_to(LPCITEMIDLIST path, int mode)
+{
+ if (_shellBrowser.get() && (_shellpath_info._open_mode&~OWM_PIDL)==(mode&~OWM_PIDL)) {
+ ShellPath shell_path = path;
+
+ _shellBrowser->jump_to(shell_path);
+
+ _shellpath_info._shell_path = shell_path;
+ } else {
+ _shellpath_info._open_mode = mode;
+ _shellpath_info._shell_path = path;
+
+ update_shell_browser();
+ }
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // mainframe.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#define PM_OPEN_WINDOW (WM_APP+0x07)
+
+enum OPEN_WINDOW_MODE {
+ OWM_EXPLORE=1, /// window in explore mode
+ OWM_ROOTED=2, /// "rooted" window with special shell namespace root
+ OWM_DETAILS=4, /// view files in detail mode
+ OWM_PIDL=8, /// path is given as PIDL, otherwise as LPCTSTR
+ OWM_SEPARATE=16 /// open separate subfolder windows
+};
+
+
+ /// Explorer frame window base class
+struct MainFrameBase : public PreTranslateWindow
+{
+ typedef PreTranslateWindow super;
+
+ MainFrameBase(HWND hwnd);
+ ~MainFrameBase();
+
+ static HWND Create(const ExplorerCmd& cmd);
+ static int OpenShellFolders(LPIDA pida, HWND hFrameWnd);
+
+ WindowHandle _hwndrebar;
+
+ WindowHandle _htoolbar;
+ WindowHandle _hstatusbar;
+
+ WindowHandle _haddressedit;
+ WindowHandle _hcommandedit;
+
+ WindowHandle _hsidebar;
+ HIMAGELIST _himl;
+
+ HMENU _hMenuFrame;
+ HMENU _hMenuWindow;
+
+ MenuInfo _menu_info;
+
+protected:
+ FullScreenParameters _fullscreen;
+
+ HACCEL _hAccel;
+ HIMAGELIST _himl_old;
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ bool ProcessMessage(UINT nmsg, WPARAM wparam, LPARAM lparam, LRESULT* pres);
+ int Command(int id, int code);
+ int Notify(int id, NMHDR* pnmh);
+
+ virtual BOOL TranslateMsg(MSG* pmsg);
+
+ void toggle_child(HWND hwnd, UINT cmd, HWND hchild, int band_idx=-1);
+
+ void resize_frame_client();
+ virtual void resize_frame(int cx, int cy);
+ virtual void frame_get_clientspace(PRECT prect);
+
+ BOOL toggle_fullscreen();
+ void fullscreen_move();
+
+ void FillBookmarks();
+ virtual bool go_to(LPCTSTR url, bool new_window);
+
+ void ExecuteCommandbar(LPCTSTR dir);
+};
+
+
+#ifndef _NO_MDI
+
+struct MDIMainFrame : public MainFrameBase
+{
+ typedef MainFrameBase super;
+
+ MDIMainFrame(HWND hwnd);
+
+ static HWND Create();
+ static HWND Create(LPCTSTR path, int mode=OWM_EXPLORE|OWM_DETAILS);
+ static HWND Create(LPCITEMIDLIST pidl, int mode=OWM_EXPLORE|OWM_DETAILS|OWM_PIDL);
+
+ ChildWindow* CreateChild(LPCTSTR path=NULL, int mode=OWM_EXPLORE|OWM_DETAILS);
+ ChildWindow* CreateChild(LPCITEMIDLIST pidl, int mode=OWM_EXPLORE|OWM_DETAILS|OWM_PIDL);
+
+protected:
+ HWND _hmdiclient;
+
+ WindowHandle _hextrabar;
+#ifndef _NO_WIN_FS
+ WindowHandle _hdrivebar;
+#endif
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Command(int id, int code);
+
+ virtual BOOL TranslateMsg(MSG* pmsg);
+
+ bool activate_drive_window(LPCTSTR path);
+ bool activate_child_window(LPCTSTR filesys);
+
+ virtual void resize_frame(int cx, int cy);
+ virtual void frame_get_clientspace(PRECT prect);
+
+ virtual bool go_to(LPCTSTR url, bool new_window);
+
+#ifndef _NO_WIN_FS
+ TCHAR _drives[BUFFER_LEN];
+#endif
+};
+
+#endif
+
+
+struct SDIMainFrame : public ExtContextMenuHandlerT<
+ ShellBrowserChildT<MainFrameBase>
+ >
+{
+ typedef ExtContextMenuHandlerT<
+ ShellBrowserChildT<MainFrameBase>
+ > super;
+
+ SDIMainFrame(HWND hwnd);
+
+ static HWND Create();
+ static HWND Create(LPCTSTR path, int mode=OWM_EXPLORE|OWM_DETAILS);
+ static HWND Create(LPCITEMIDLIST pidl, int mode=OWM_EXPLORE|OWM_DETAILS|OWM_PIDL);
+
+protected:
+ ShellPathInfo _shellpath_info;
+
+ WindowHandle _left_hwnd;
+ WindowHandle _right_hwnd;
+
+/**@todo focus handling for TAB switching
+ int _focus_pane; // 0: left 1: right
+*/
+
+ int _split_pos;
+ int _last_split;
+ RECT _clnt_rect;
+
+ String _url;
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Command(int id, int code);
+
+ void resize_frame(int cx, int cy);
+ void resize_children();
+ void update_clnt_rect();
+
+ void update_shell_browser();
+ void jump_to(LPCTSTR path, int mode);
+ void jump_to(LPCITEMIDLIST path, int mode);
+
+ // interface BrowserCallback
+ virtual void entry_selected(Entry* entry);
+
+ void set_url(LPCTSTR url);
+};
--- /dev/null
+/*
+ * Copyright 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // ntobjfs.cpp
+ //
+ // Martin Fuchs, 31.01.2004
+ //
+
+
+#include <precomp.h>
+
+#include "ntobjfs.h"
+//#include "winfs.h"
+#include "regfs.h"
+
+
+#define CONSTRUCT_NTDLLFCT(x) x(TEXT("NTDLL"), #x)
+
+typedef DWORD (__stdcall* NTOBJECTOPENFUNCTIONS)(HANDLE*, DWORD, OpenStruct*);
+
+struct NTDLL {
+ NTDLL()
+ : CONSTRUCT_NTDLLFCT(RtlInitAnsiString),
+ CONSTRUCT_NTDLLFCT(RtlInitUnicodeString),
+ CONSTRUCT_NTDLLFCT(RtlFreeAnsiString),
+ CONSTRUCT_NTDLLFCT(RtlFreeUnicodeString),
+ CONSTRUCT_NTDLLFCT(RtlAnsiStringToUnicodeString),
+ CONSTRUCT_NTDLLFCT(RtlUnicodeStringToAnsiString),
+ CONSTRUCT_NTDLLFCT(NtOpenDirectoryObject),
+ CONSTRUCT_NTDLLFCT(NtQueryDirectoryObject),
+ CONSTRUCT_NTDLLFCT(NtOpenFile),
+ CONSTRUCT_NTDLLFCT(NtOpenSymbolicLinkObject),
+ CONSTRUCT_NTDLLFCT(NtQuerySymbolicLinkObject),
+ CONSTRUCT_NTDLLFCT(NtQueryObject),
+ CONSTRUCT_NTDLLFCT(NtOpenMutant),
+ CONSTRUCT_NTDLLFCT(NtOpenSection),
+ CONSTRUCT_NTDLLFCT(NtOpenEvent),
+ CONSTRUCT_NTDLLFCT(NtOpenEventPair),
+ CONSTRUCT_NTDLLFCT(NtOpenIoCompletion),
+ CONSTRUCT_NTDLLFCT(NtOpenSemaphore),
+ CONSTRUCT_NTDLLFCT(NtOpenTimer),
+ CONSTRUCT_NTDLLFCT(NtOpenKey),
+ CONSTRUCT_NTDLLFCT(NtClose),
+ CONSTRUCT_NTDLLFCT(NtOpenProcess),
+ CONSTRUCT_NTDLLFCT(NtOpenThread)
+ {
+ NTOBJECTOPENFUNCTIONS* p = _ObjectOpenFunctions;
+
+ *p++ = *NtOpenDirectoryObject;
+ *p++ = *NtOpenSymbolicLinkObject;
+ *p++ = *NtOpenMutant;
+ *p++ = *NtOpenSection;
+ *p++ = *NtOpenEvent;
+ *p++ = *NtOpenSemaphore;
+ *p++ = *NtOpenTimer;
+ *p++ = *NtOpenKey;
+ *p++ = *NtOpenEventPair;
+ *p++ = *NtOpenIoCompletion;
+ *p++ = 0/*Device Object*/;
+ *p++ = 0/*NtOpenFile*/;
+ *p++ = 0/*CONTROLLER_OBJECT*/;
+ *p++ = 0/*PROFILE_OBJECT*/;
+ *p++ = 0/*TYPE_OBJECT*/;
+ *p++ = 0/*DESKTOP_OBJECT*/;
+ *p++ = 0/*WINDOWSTATION_OBJECT*/;
+ *p++ = 0/*DRIVER_OBJECT*/;
+ *p++ = 0/*TOKEN_OBJECT*/;
+ *p++ = 0/*PROCESS_OBJECT*/;
+ *p++ = 0/*THREAD_OBJECT*/;
+ *p++ = 0/*ADAPTER_OBJECT*/;
+ *p++ = 0/*PORT_OBJECT*/;
+ }
+
+ NTOBJECTOPENFUNCTIONS _ObjectOpenFunctions[23];
+ static const LPCWSTR s_ObjectTypes[];
+
+ DynamicFct<void (__stdcall*)(RtlAnsiString*, LPCSTR)> RtlInitAnsiString;
+ DynamicFct<void (__stdcall*)(RtlUnicodeString*, LPCWSTR)> RtlInitUnicodeString;
+ DynamicFct<DWORD (__stdcall*)(RtlAnsiString*)> RtlFreeAnsiString;
+ DynamicFct<DWORD (__stdcall*)(RtlUnicodeString*)> RtlFreeUnicodeString;
+ DynamicFct<DWORD (__stdcall*)(RtlUnicodeString*, const RtlAnsiString*, BOOL)> RtlAnsiStringToUnicodeString;
+ DynamicFct<DWORD (__stdcall*)(RtlAnsiString*, const RtlUnicodeString*, BOOL)> RtlUnicodeStringToAnsiString;
+
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenDirectoryObject;
+ DynamicFct<DWORD (__stdcall*)(HANDLE, NtObjectInfo*, DWORD size, BOOL, BOOL, void*, void*)> NtQueryDirectoryObject;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, void*, DWORD*, DWORD, OpenStruct*)> NtOpenFile;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenSymbolicLinkObject;
+ DynamicFct<DWORD (__stdcall*)(HANDLE, RtlUnicodeString*, DWORD*)> NtQuerySymbolicLinkObject;
+ DynamicFct<DWORD (__stdcall*)(HANDLE, DWORD, NtObject*, DWORD size, DWORD* read)> NtQueryObject;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenMutant;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenSection;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenEvent;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenEventPair;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenIoCompletion;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenSemaphore;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenTimer;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenKey;
+ DynamicFct<DWORD (__stdcall*)(HANDLE)> NtClose;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenProcess;
+ DynamicFct<DWORD (__stdcall*)(HANDLE*, DWORD, OpenStruct*)> NtOpenThread;
+};
+
+const LPCWSTR NTDLL::s_ObjectTypes[] = {
+ L"Directory", L"SymbolicLink",
+ L"Mutant", L"Section", L"Event", L"Semaphore",
+ L"Timer", L"Key", L"EventPair", L"IoCompletion",
+ L"Device", L"File", L"Controller", L"Profile",
+ L"Type", L"Desktop", L"WindowStatiom", L"Driver",
+ L"Token", L"Process", L"Thread", L"Adapter", L"Port",
+ 0
+};
+
+NTDLL* g_NTDLL = NULL;
+
+
+struct UnicodeString : public RtlUnicodeString {
+ UnicodeString(LPCWSTR str)
+ {
+ (*g_NTDLL->RtlInitUnicodeString)(this, str);
+ }
+
+ UnicodeString(size_t len, LPWSTR buffer)
+ {
+ alloc_len = len;
+ string_ptr = buffer;
+ }
+
+ operator LPCWSTR() const {return string_ptr;}
+};
+
+
+static DWORD NtOpenObject(OBJECT_TYPE type, HANDLE* phandle, DWORD access, LPCWSTR path/*, BOOL xflag=FALSE*/)
+{
+ UnicodeString ustr(path);
+ OpenStruct open_struct = {sizeof(OpenStruct), 0x00, &ustr, 0x40};
+
+ if (type==DIRECTORY_OBJECT || type==SYMBOLICLINK_OBJECT)
+ access |= FILE_LIST_DIRECTORY;
+
+ /* if (xflag)
+ access |= GENERIC_READ; */
+
+ DWORD ioStatusBlock[2]; // IO_STATUS_BLOCK
+
+ if (type>=DIRECTORY_OBJECT && type<=IOCOMPLETITION_OBJECT)
+ return g_NTDLL->_ObjectOpenFunctions[type](phandle, access|STANDARD_RIGHTS_READ, &open_struct);
+ else if (type == FILE_OBJECT)
+ return (*g_NTDLL->NtOpenFile)(phandle, access, &open_struct, ioStatusBlock, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 0/*OpenOptions*/);
+ else
+ return ERROR_INVALID_FUNCTION;
+}
+
+
+void NtObjDirectory::read_directory(int scan_flags)
+{
+ CONTEXT("NtObjDirectory::read_directory()");
+
+ if (!g_NTDLL)
+ g_NTDLL = new NTDLL();
+
+ Entry* first_entry = NULL;
+ int level = _level + 1;
+
+ LPCTSTR path = (LPCTSTR)_path;
+
+ TCHAR buffer[MAX_PATH], *p=buffer;
+#ifndef UNICODE
+ WCHAR wbuffer[MAX_PATH], *w=wbuffer;
+#endif
+
+ do {
+ *p++ = *path;
+#ifndef UNICODE
+ *w++ = *path;
+#endif
+ } while(*path++);
+ --p;
+#ifndef UNICODE
+ --w;
+#endif
+
+ DWORD idx;
+ HANDLE dir_handle;
+
+#ifdef UNICODE
+ if (NtOpenObject(_type, &dir_handle, 0, buffer))
+#else
+ if (NtOpenObject(_type, &dir_handle, 0, wbuffer))
+#endif
+ return;
+
+#ifdef UNICODE
+ if (p[-1] != '\\')
+ *p++ = '\\';
+#else
+ if (w[-1] != '\\')
+ *w++ = '\\';
+#endif
+
+ NtObjectInfo* info = (NtObjectInfo*)alloca(2048);
+
+ if (!(*g_NTDLL->NtQueryDirectoryObject)(dir_handle, info, 2048, TRUE, TRUE, &idx, NULL)) {
+ WIN32_FIND_DATA w32fd;
+ Entry* last = NULL;
+ Entry* entry;
+
+ do {
+ memset(&w32fd, 0, sizeof(WIN32_FIND_DATA));
+
+#ifdef UNICODE
+ if (info->name.string_ptr) {
+ info->name.string_ptr[info->name.string_len / sizeof(WCHAR)] = 0;
+ } else {
+ info->name.string_ptr = TEXT("");
+ }
+ if (info->type.string_ptr) {
+ info->type.string_ptr[info->type.string_len / sizeof(WCHAR)] = 0;
+ } else {
+ info->type.string_ptr = TEXT("");
+ }
+ lstrcpynW(p, info->name.string_ptr, COUNTOF(buffer));
+#else
+ WideCharToMultiByte(CP_ACP, 0, info->name.string_ptr, info->name.string_len, p, COUNTOF(buffer), 0, 0);
+#endif
+
+ lstrcpyn(w32fd.cFileName, p, sizeof(w32fd.cFileName) / sizeof(0[w32fd.cFileName]));
+
+ const LPCWSTR* tname = NTDLL::s_ObjectTypes;
+ OBJECT_TYPE type = UNKNOWN_OBJECT_TYPE;
+
+ for(; *tname; tname++)
+ if (!wcsncmp(info->type.string_ptr, *tname, 32))
+ {type=OBJECT_TYPE(tname-NTDLL::s_ObjectTypes); break;}
+
+ if (type == DIRECTORY_OBJECT) {
+ w32fd.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+
+ entry = new NtObjDirectory(this, buffer);
+ }
+
+ else if (type == SYMBOLICLINK_OBJECT) {
+ w32fd.dwFileAttributes |= ATTRIBUTE_SYMBOLIC_LINK;
+
+ entry = NULL;
+
+#ifndef _NO_WIN_FS
+ if (*w32fd.cFileName>='A' &&*w32fd.cFileName<='Z' && w32fd.cFileName[1]==':')
+ if (!_tcsncmp(buffer,TEXT("\\??\\"),4) || // NT4
+ !_tcsncmp(buffer,TEXT("\\GLOBAL??"),9)) { // XP
+ w32fd.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+ entry = new WinDirectory(this, w32fd.cFileName);
+ }
+#endif
+
+ if (!entry)
+ entry = new NtObjDirectory(this, buffer);
+ }
+
+ else if (type == KEY_OBJECT) {
+ w32fd.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+
+ entry = new RegistryRoot(this, buffer);
+ }
+ else
+ entry = new NtObjEntry(this, type);
+
+ HANDLE handle;
+
+#ifdef UNICODE
+ lstrcpyW(p, info->name.string_ptr);
+ if (!NtOpenObject(type, &handle, 0, buffer))
+#else
+ lstrcpyW(w, info->name.string_ptr);
+ if (!NtOpenObject(type, &handle, 0, wbuffer))
+#endif
+ {
+ NtObject object;
+ DWORD read;
+
+ if (!(*g_NTDLL->NtQueryObject)(handle, 0/*ObjectBasicInformation*/, &object, sizeof(NtObject), &read)) {
+ memcpy(&w32fd.ftCreationTime, &object.creation_time, sizeof(FILETIME));
+
+ memset(&entry->_bhfi, 0, sizeof(BY_HANDLE_FILE_INFORMATION));
+ entry->_bhfi.nNumberOfLinks = object.reference_count - 1;
+ entry->_bhfi_valid = true;
+ }
+
+ if (type == SYMBOLICLINK_OBJECT) {
+ WCHAR wbuffer[_MAX_PATH];
+ UnicodeString link(_MAX_PATH, wbuffer);
+
+ if (!(*g_NTDLL->NtQuerySymbolicLinkObject)(handle, &link, NULL)) {
+ int len = link.string_len/sizeof(WCHAR);
+ entry->_content = (LPTSTR) malloc((len+1)*sizeof(TCHAR));
+#ifdef UNICODE
+ wcsncpy_s(entry->_content, len+1, link, len);
+#else
+ U2nA(link, entry->_content, len);
+#endif
+ entry->_content[len] = '\0';
+ }
+ }
+
+ (*g_NTDLL->NtClose)(handle);
+ }
+
+ memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA));
+
+#ifdef UNICODE
+ entry->_type_name = _wcsdup(info->type.string_ptr);
+#else
+ char type_name[32];
+ WideCharToMultiByte(CP_ACP, 0, info->type.string_ptr, info->type.string_len, type_name, 32, 0, 0);
+ entry->_type_name = _strdup(type_name);
+#endif
+
+ if (!first_entry)
+ first_entry = entry;
+
+ if (last)
+ last->_next = entry;
+
+ entry->_level = level;
+
+ last = entry;
+ } while(!(*g_NTDLL->NtQueryDirectoryObject)(dir_handle, info, 2048, TRUE, FALSE, &idx, NULL));
+
+ last->_next = NULL;
+ }
+
+ (*g_NTDLL->NtClose)(dir_handle);
+
+ _down = first_entry;
+ _scanned = true;
+}
+
+
+Entry* NtObjDirectory::find_entry(const void* p)
+{
+ LPCTSTR name = (LPCTSTR)p;
+
+ for(Entry*entry=_down; entry; entry=entry->_next) {
+ LPCTSTR p = name;
+ LPCTSTR q = entry->_data.cFileName;
+
+ do {
+ if (!*p || *p==TEXT('\\') || *p==TEXT('/'))
+ return entry;
+ } while(tolower(*p++) == tolower(*q++));
+
+ p = name;
+ q = entry->_data.cAlternateFileName;
+
+ do {
+ if (!*p || *p==TEXT('\\') || *p==TEXT('/'))
+ return entry;
+ } while(tolower(*p++) == tolower(*q++));
+ }
+
+ return NULL;
+}
+
+
+ // get full path of specified directory entry
+bool NtObjEntry::get_path(PTSTR path, size_t path_count) const
+{
+ return get_path_base ( path, path_count, ET_NTOBJS );
+}
+
+BOOL NtObjEntry::launch_entry(HWND hwnd, UINT nCmdShow)
+{
+ return FALSE;
+}
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // ntobjfs.h
+ //
+ // Martin Fuchs, 31.01.2004
+ //
+
+
+enum OBJECT_TYPE {
+ DIRECTORY_OBJECT, SYMBOLICLINK_OBJECT,
+ MUTANT_OBJECT, SECTION_OBJECT, EVENT_OBJECT, SEMAPHORE_OBJECT,
+ TIMER_OBJECT, KEY_OBJECT, EVENTPAIR_OBJECT, IOCOMPLETITION_OBJECT,
+ DEVICE_OBJECT, FILE_OBJECT, CONTROLLER_OBJECT, PROFILE_OBJECT,
+ TYPE_OBJECT, DESKTOP_OBJECT, WINDOWSTATION_OBJECT, DRIVER_OBJECT,
+ TOKEN_OBJECT, PROCESS_OBJECT, THREAD_OBJECT, ADAPTER_OBJECT, PORT_OBJECT,
+
+ UNKNOWN_OBJECT_TYPE=-1
+};
+
+struct RtlAnsiString {
+ WORD string_len;
+ WORD alloc_len;
+ LPSTR string_ptr;
+};
+
+struct RtlUnicodeString {
+ WORD string_len;
+ WORD alloc_len;
+ LPWSTR string_ptr;
+};
+
+struct NtObjectInfo {
+ RtlUnicodeString name;
+ RtlUnicodeString type;
+ BYTE padding[16];
+};
+
+struct OpenStruct {
+ DWORD size;
+ DWORD _1;
+ RtlUnicodeString* string;
+ DWORD _3;
+ DWORD _4;
+ DWORD _5;
+};
+
+struct NtObject {
+ DWORD _0;
+ DWORD _1;
+ DWORD handle_count;
+ DWORD reference_count;
+ DWORD _4;
+ DWORD _5;
+ DWORD _6;
+ DWORD _7;
+ DWORD _8;
+ DWORD _9;
+ DWORD _A;
+ DWORD _B;
+ FILETIME creation_time;
+};
+
+
+ /// NtObj file system file-entry
+struct NtObjEntry : public Entry
+{
+ NtObjEntry(Entry* parent, OBJECT_TYPE type) : Entry(parent, ET_NTOBJS), _type(type) {}
+
+ OBJECT_TYPE _type;
+
+protected:
+ NtObjEntry(OBJECT_TYPE type) : Entry(ET_NTOBJS), _type(type) {}
+
+ virtual bool get_path(PTSTR path, size_t path_count) const;
+ virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow);
+};
+
+
+ /// NtObj file system directory-entry
+struct NtObjDirectory : public NtObjEntry, public Directory
+{
+ NtObjDirectory(LPCTSTR root_path)
+ : NtObjEntry(DIRECTORY_OBJECT)
+ {
+ _path = _tcsdup(root_path);
+ }
+
+ NtObjDirectory(Entry* parent, LPCTSTR path)
+ : NtObjEntry(parent, DIRECTORY_OBJECT)
+ {
+ _path = _tcsdup(path);
+ }
+
+ ~NtObjDirectory()
+ {
+ free(_path);
+ _path = NULL;
+ }
+
+ virtual void read_directory(int scan_flags=0);
+ virtual Entry* find_entry(const void*);
+};
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // pane.cpp
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#include <precomp.h>
+
+#include "../resource.h"
+
+
+enum IMAGE {
+ IMG_NONE=-1, IMG_FILE=0, IMG_DOCUMENT, IMG_EXECUTABLE,
+ IMG_FOLDER, IMG_OPEN_FOLDER, IMG_FOLDER_PLUS,IMG_OPEN_PLUS, IMG_OPEN_MINUS,
+ IMG_FOLDER_UP, IMG_FOLDER_CUR
+};
+
+
+#define IMAGE_WIDTH 16
+#define IMAGE_HEIGHT 13
+
+
+static const LPTSTR g_pos_names[COLUMNS] = {
+ TEXT(""), /* symbol */
+ TEXT("Name"),
+ TEXT("Type"),
+ TEXT("Size"),
+ TEXT("CDate"),
+ TEXT("ADate"),
+ TEXT("MDate"),
+ TEXT("Index/Inode"),
+ TEXT("Links"),
+ TEXT("Attributes"),
+ TEXT("Security"),
+ TEXT("Content")
+};
+
+static const int g_pos_align[] = {
+ 0,
+ HDF_LEFT, /* Name */
+ HDF_LEFT, /* Type */
+ HDF_RIGHT, /* Size */
+ HDF_LEFT, /* CDate */
+ HDF_LEFT, /* ADate */
+ HDF_LEFT, /* MDate */
+ HDF_LEFT, /* Index */
+ HDF_RIGHT, /* Links */
+ HDF_CENTER, /* Attributes */
+ HDF_LEFT, /* Security */
+ HDF_LEFT /* Content / Description */
+};
+
+
+Pane::Pane(HWND hparent, int id, int id_header, Entry* root, bool treePane, int visible_cols)
+ : super(CreateWindow(TEXT("ListBox"), TEXT(""), WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|
+ LBS_DISABLENOSCROLL|LBS_NOINTEGRALHEIGHT|LBS_OWNERDRAWFIXED|LBS_NOTIFY,
+ 0, 0, 0, 0, hparent, (HMENU)id, g_Globals._hInstance, 0)),
+ _root(root),
+ _visible_cols(visible_cols),
+ _treePane(treePane)
+{
+ // insert entries into listbox
+ Entry* entry = _root;
+
+ if (entry)
+ insert_entries(entry);
+
+ init();
+
+ create_header(hparent, id_header);
+}
+
+Pane::~Pane()
+{
+ ImageList_Destroy(_himl);
+}
+
+
+LRESULT Pane::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_HSCROLL:
+ set_header();
+ break;
+
+ case WM_SETFOCUS: {
+ FileChildWindow* child = (FileChildWindow*) SendMessage(GetParent(_hwnd), PM_GET_FILEWND_PTR, 0, 0);
+
+ child->set_focus_pane(this);
+ ListBox_SetSel(_hwnd, TRUE, 1);
+ /*@todo check menu items */
+ break;}
+
+ case WM_KEYDOWN: {
+ FileChildWindow* child = (FileChildWindow*) SendMessage(GetParent(_hwnd), PM_GET_FILEWND_PTR, 0, 0);
+
+ if (wparam == VK_TAB) {
+ /*@todo SetFocus(g_Globals.hdrivebar) */
+ child->switch_focus_pane();
+ }
+ break;}
+ }
+
+ return super::WndProc(nmsg, wparam, lparam);
+}
+
+
+bool Pane::create_header(HWND hparent, int id)
+{
+ HWND hwnd = CreateWindow(WC_HEADER, 0, WS_CHILD|WS_VISIBLE|HDS_HORZ/*@todo |HDS_BUTTONS + sort orders*/,
+ 0, 0, 0, 0, hparent, (HMENU)id, g_Globals._hInstance, 0);
+ if (!hwnd)
+ return false;
+
+ SetWindowFont(hwnd, GetStockFont(DEFAULT_GUI_FONT), FALSE);
+
+ HD_ITEM hdi;
+
+ hdi.mask = HDI_TEXT|HDI_WIDTH|HDI_FORMAT;
+
+ for(int idx=0; idx<COLUMNS; idx++) {
+ hdi.pszText = g_pos_names[idx];
+ hdi.fmt = HDF_STRING | g_pos_align[idx];
+ hdi.cxy = _widths[idx];
+ Header_InsertItem(hwnd, idx, &hdi);
+ }
+
+ _hwndHeader = hwnd;
+
+ return true;
+}
+
+
+void Pane::init()
+{
+ _himl = ImageList_LoadBitmap(g_Globals._hInstance, MAKEINTRESOURCE(IDB_IMAGES), 16, 0, RGB(0,255,0));
+
+ SetWindowFont(_hwnd, _out_wrkr._hfont, FALSE);
+
+ // read the color for compressed files from registry
+ HKEY hkeyExplorer = 0;
+ DWORD len = sizeof(_clrCompressed);
+
+ if (RegOpenKey(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer"), &hkeyExplorer) ||
+ RegQueryValueEx(hkeyExplorer, TEXT("AltColor"), 0, NULL, (LPBYTE)&_clrCompressed, &len) || len!=sizeof(_clrCompressed))
+ _clrCompressed = RGB(0,0,255);
+
+ if (hkeyExplorer)
+ RegCloseKey(hkeyExplorer);
+
+ // calculate column widths
+ _out_wrkr.init_output(_hwnd);
+ calc_widths(true);
+}
+
+
+ // calculate prefered width for all visible columns
+
+bool Pane::calc_widths(bool anyway)
+{
+ int col, x, cx, spc=3*_out_wrkr._spaceSize.cx;
+ int entries = ListBox_GetCount(_hwnd);
+ int orgWidths[COLUMNS];
+ int orgPositions[COLUMNS+1];
+ HFONT hfontOld;
+ HDC hdc;
+ int cnt;
+
+ if (!anyway) {
+ memcpy(orgWidths, _widths, sizeof(orgWidths));
+ memcpy(orgPositions, _positions, sizeof(orgPositions));
+ }
+
+ for(col=0; col<COLUMNS; col++)
+ _widths[col] = 0;
+
+ hdc = GetDC(_hwnd);
+ hfontOld = SelectFont(hdc, _out_wrkr._hfont);
+
+ for(cnt=0; cnt<entries; cnt++) {
+ Entry* entry = (Entry*) ListBox_GetItemData(_hwnd, cnt);
+
+ DRAWITEMSTRUCT dis;
+
+ dis.CtlType = 0;
+ dis.CtlID = 0;
+ dis.itemID = 0;
+ dis.itemAction = 0;
+ dis.itemState = 0;
+ dis.hwndItem = _hwnd;
+ dis.hDC = hdc;
+ dis.rcItem.left = 0;
+ dis.rcItem.top = 0;
+ dis.rcItem.right = 0;
+ dis.rcItem.bottom = 0;
+ /*dis.itemData = 0; */
+
+ draw_item(&dis, entry, COLUMNS);
+ }
+
+ SelectObject(hdc, hfontOld);
+ ReleaseDC(_hwnd, hdc);
+
+ x = 0;
+ for(col=0; col<COLUMNS; col++) {
+ _positions[col] = x;
+ cx = _widths[col];
+
+ if (cx) {
+ cx += spc;
+
+ if (cx < IMAGE_WIDTH)
+ cx = IMAGE_WIDTH;
+
+ _widths[col] = cx;
+ }
+
+ x += cx;
+ }
+
+ _positions[COLUMNS] = x;
+
+ ListBox_SetHorizontalExtent(_hwnd, x);
+
+ // no change?
+ if (!memcmp(orgWidths, _widths, sizeof(orgWidths)))
+ return FALSE;
+
+ // don't move, if only collapsing an entry
+ if (!anyway && _widths[0]<orgWidths[0] &&
+ !memcmp(orgWidths+1, _widths+1, sizeof(orgWidths)-sizeof(int))) {
+ _widths[0] = orgWidths[0];
+ memcpy(_positions, orgPositions, sizeof(orgPositions));
+
+ return FALSE;
+ }
+
+ InvalidateRect(_hwnd, 0, TRUE);
+
+ return TRUE;
+}
+
+
+static void format_date(const FILETIME* ft, TCHAR* buffer, int visible_cols)
+{
+ SYSTEMTIME systime;
+ FILETIME lft;
+ int len = 0;
+
+ *buffer = TEXT('\0');
+
+ if (!ft->dwLowDateTime && !ft->dwHighDateTime)
+ return;
+
+ if (!FileTimeToLocalFileTime(ft, &lft))
+ {err: lstrcpy(buffer,TEXT("???")); return;}
+
+ if (!FileTimeToSystemTime(&lft, &systime))
+ goto err;
+
+ if (visible_cols & COL_DATE) {
+ len = GetDateFormat(LOCALE_USER_DEFAULT, 0, &systime, 0, buffer, BUFFER_LEN);
+ if (!len)
+ goto err;
+ }
+
+ if (visible_cols & COL_TIME) {
+ if (len)
+ buffer[len-1] = ' ';
+
+ buffer[len++] = ' ';
+
+ if (!GetTimeFormat(LOCALE_USER_DEFAULT, 0, &systime, 0, buffer+len, BUFFER_LEN-len))
+ buffer[len] = TEXT('\0');
+ }
+}
+
+
+void Pane::draw_item(LPDRAWITEMSTRUCT dis, Entry* entry, int calcWidthCol)
+{
+ TCHAR buffer[BUFFER_LEN];
+ DWORD attrs;
+ int visible_cols = _visible_cols;
+ COLORREF bkcolor, textcolor;
+ RECT focusRect = dis->rcItem;
+ enum IMAGE img;
+ int img_pos, cx;
+ int col = 0;
+
+ if (entry) {
+ attrs = entry->_data.dwFileAttributes;
+
+ if (attrs & FILE_ATTRIBUTE_DIRECTORY) {
+ if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('.')
+ && entry->_data.cFileName[2]==TEXT('\0'))
+ img = IMG_FOLDER_UP;
+ else if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('\0'))
+ img = IMG_FOLDER_CUR;
+ else if ((_treePane && (dis->itemState&ODS_FOCUS)))
+ img = IMG_OPEN_FOLDER;
+ else
+ img = IMG_FOLDER;
+ } else {
+ if (attrs & ATTRIBUTE_EXECUTABLE)
+ img = IMG_EXECUTABLE;
+ else if (entry->_type_name)
+ img = IMG_DOCUMENT;
+ else
+ img = IMG_FILE;
+ }
+ } else {
+ attrs = 0;
+ img = IMG_NONE;
+ }
+
+ if (_treePane) {
+ if (entry) {
+ img_pos = dis->rcItem.left + entry->_level*(IMAGE_WIDTH+_out_wrkr._spaceSize.cx);
+
+ if (calcWidthCol == -1) {
+ int x;
+ int y = dis->rcItem.top + IMAGE_HEIGHT/2;
+ Entry* up;
+ RECT rt_clip;
+ HRGN hrgn_org = CreateRectRgn(0, 0, 0, 0);
+ HRGN hrgn;
+
+ rt_clip.left = dis->rcItem.left;
+ rt_clip.top = dis->rcItem.top;
+ rt_clip.right = dis->rcItem.left+_widths[col];
+ rt_clip.bottom = dis->rcItem.bottom;
+
+ hrgn = CreateRectRgnIndirect(&rt_clip);
+
+ if (!GetClipRgn(dis->hDC, hrgn_org)) {
+ DeleteObject(hrgn_org);
+ hrgn_org = 0;
+ }
+
+ //HGDIOBJ holdPen = SelectObject(dis->hDC, GetStockObject(BLACK_PEN));
+ ExtSelectClipRgn(dis->hDC, hrgn, RGN_AND);
+ DeleteObject(hrgn);
+
+ if ((up=entry->_up) != NULL) {
+ MoveToEx(dis->hDC, img_pos-IMAGE_WIDTH/2, y, 0);
+ LineTo(dis->hDC, img_pos-2, y);
+
+ x = img_pos - IMAGE_WIDTH/2;
+
+ do {
+ x -= IMAGE_WIDTH+_out_wrkr._spaceSize.cx;
+
+ if (up->_next) {
+#ifndef _LEFT_FILES
+ bool following_child = (up->_next->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0; // a directory?
+
+ if (!following_child)
+ for(Entry*n=up->_next; n; n=n->_next)
+ if (n->_down) { // any file with NTFS sub-streams?
+ following_child = true;
+ break;
+ }
+
+ if (following_child)
+#endif
+ {
+ MoveToEx(dis->hDC, x, dis->rcItem.top, 0);
+ LineTo(dis->hDC, x, dis->rcItem.bottom);
+ }
+ }
+ } while((up=up->_up) != NULL);
+ }
+
+ x = img_pos - IMAGE_WIDTH/2;
+
+ MoveToEx(dis->hDC, x, dis->rcItem.top, 0);
+ LineTo(dis->hDC, x, y);
+
+ if (entry->_next) {
+#ifndef _LEFT_FILES
+ bool following_child = (entry->_next->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0; // a directory?
+
+ if (!following_child)
+ for(Entry*n=entry->_next; n; n=n->_next)
+ if (n->_down) { // any file with NTFS sub-streams?
+ following_child = true;
+ break;
+ }
+
+ if (following_child)
+#endif
+ LineTo(dis->hDC, x, dis->rcItem.bottom);
+ }
+
+ if (entry->_down && entry->_expanded) {
+ x += IMAGE_WIDTH + _out_wrkr._spaceSize.cx;
+ MoveToEx(dis->hDC, x, dis->rcItem.top+IMAGE_HEIGHT, 0);
+ LineTo(dis->hDC, x, dis->rcItem.bottom);
+ }
+
+ SelectClipRgn(dis->hDC, hrgn_org);
+ if (hrgn_org) DeleteObject(hrgn_org);
+ //SelectObject(dis->hDC, holdPen);
+ } else if (calcWidthCol==col || calcWidthCol==COLUMNS) {
+ int right = img_pos + IMAGE_WIDTH - _out_wrkr._spaceSize.cx;
+
+ if (right > _widths[col])
+ _widths[col] = right;
+ }
+ } else {
+ img_pos = dis->rcItem.left;
+ }
+ } else {
+ img_pos = dis->rcItem.left;
+
+ if (calcWidthCol==col || calcWidthCol==COLUMNS)
+ _widths[col] = IMAGE_WIDTH;
+ }
+
+ if (calcWidthCol == -1) {
+ focusRect.left = img_pos -2;
+
+ if (attrs & FILE_ATTRIBUTE_COMPRESSED)
+ textcolor = _clrCompressed;
+ else
+ textcolor = RGB(0,0,0);
+
+ if (dis->itemState & ODS_FOCUS) {
+ textcolor = GetSysColor(COLOR_HIGHLIGHTTEXT);
+ bkcolor = GetSysColor(COLOR_HIGHLIGHT);
+ } else {
+ bkcolor = GetSysColor(COLOR_WINDOW);
+ }
+
+ HBRUSH hbrush = CreateSolidBrush(bkcolor);
+ FillRect(dis->hDC, &focusRect, hbrush);
+ DeleteObject(hbrush);
+
+ SetBkMode(dis->hDC, TRANSPARENT);
+ SetTextColor(dis->hDC, textcolor);
+
+ cx = _widths[col];
+
+ if (cx && img!=IMG_NONE) {
+ if (cx > IMAGE_WIDTH)
+ cx = IMAGE_WIDTH;
+
+ if (entry->_icon_id > ICID_NONE)
+ g_Globals._icon_cache.get_icon(entry->_icon_id).draw(dis->hDC, img_pos, dis->rcItem.top, cx, GetSystemMetrics(SM_CYSMICON), bkcolor, 0);
+ else
+ ImageList_DrawEx(_himl, img, dis->hDC,
+ img_pos, dis->rcItem.top, cx,
+ IMAGE_HEIGHT, bkcolor, CLR_DEFAULT, ILD_NORMAL);
+ }
+ }
+
+ if (!entry)
+ return;
+
+ ++col;
+
+ // output file name
+ if (calcWidthCol == -1)
+ _out_wrkr.output_text(dis, _positions, col, entry->_display_name, 0);
+ else if (calcWidthCol==col || calcWidthCol==COLUMNS)
+ calc_width(dis, col, entry->_display_name);
+ ++col;
+
+ // output type/class name
+ if (visible_cols & COL_TYPE) {
+ if (calcWidthCol == -1)
+ _out_wrkr.output_text(dis, _positions, col, entry->_type_name? entry->_type_name: TEXT(""), 0);
+ else if (calcWidthCol==col || calcWidthCol==COLUMNS)
+ calc_width(dis, col, entry->_type_name? entry->_type_name: TEXT(""));
+ }
+ ++col;
+
+ // display file size
+ if (visible_cols & COL_SIZE) {
+ ULONGLONG size = ((ULONGLONG)entry->_data.nFileSizeHigh << 32) | entry->_data.nFileSizeLow;
+
+ _stprintf(buffer, TEXT("%") LONGLONGARG TEXT("d"), size);
+
+ if (calcWidthCol == -1)
+ _out_wrkr.output_number(dis, _positions, col, buffer);
+ else if (calcWidthCol==col || calcWidthCol==COLUMNS)
+ calc_width(dis, col, buffer); ///@todo not in every case time enough
+ }
+ ++col;
+
+ // display file date
+ if (visible_cols & (COL_DATE|COL_TIME)) {
+ format_date(&entry->_data.ftCreationTime, buffer, visible_cols);
+ if (calcWidthCol == -1)
+ _out_wrkr.output_text(dis, _positions, col, buffer, 0);
+ else if (calcWidthCol==col || calcWidthCol==COLUMNS)
+ calc_width(dis, col, buffer);
+ ++col;
+
+ format_date(&entry->_data.ftLastAccessTime, buffer, visible_cols);
+ if (calcWidthCol == -1)
+ _out_wrkr.output_text(dis,_positions, col, buffer, 0);
+ else if (calcWidthCol==col || calcWidthCol==COLUMNS)
+ calc_width(dis, col, buffer);
+ ++col;
+
+ format_date(&entry->_data.ftLastWriteTime, buffer, visible_cols);
+ if (calcWidthCol == -1)
+ _out_wrkr.output_text(dis, _positions, col, buffer, 0);
+ else if (calcWidthCol==col || calcWidthCol==COLUMNS)
+ calc_width(dis, col, buffer);
+ ++col;
+ } else
+ col += 3;
+
+ if (entry->_bhfi_valid) {
+ ULONGLONG index = ((ULONGLONG)entry->_bhfi.nFileIndexHigh << 32) | entry->_bhfi.nFileIndexLow;
+
+ if (visible_cols & COL_INDEX) {
+ _stprintf(buffer, TEXT("%") LONGLONGARG TEXT("X"), index);
+
+ if (calcWidthCol == -1)
+ _out_wrkr.output_text(dis, _positions, col, buffer, DT_RIGHT);
+ else if (calcWidthCol==col || calcWidthCol==COLUMNS)
+ calc_width(dis, col, buffer);
+
+ ++col;
+ }
+
+ if (visible_cols & COL_LINKS) {
+ wsprintf(buffer, TEXT("%d"), entry->_bhfi.nNumberOfLinks);
+
+ if (calcWidthCol == -1)
+ _out_wrkr.output_text(dis, _positions, col, buffer, DT_RIGHT);
+ else if (calcWidthCol==col || calcWidthCol==COLUMNS)
+ calc_width(dis, col, buffer);
+
+ ++col;
+ }
+ } else
+ col += 2;
+
+ // show file attributes
+ if (visible_cols & COL_ATTRIBUTES) {
+ lstrcpy(buffer, TEXT(" \t \t \t \t \t \t \t \t \t \t \t \t \t \t "));
+
+ if (attrs & FILE_ATTRIBUTE_NORMAL) buffer[ 0] = 'N';
+ else {
+ if (attrs & FILE_ATTRIBUTE_READONLY) buffer[ 2] = 'R';
+ if (attrs & FILE_ATTRIBUTE_HIDDEN) buffer[ 4] = 'H';
+ if (attrs & FILE_ATTRIBUTE_SYSTEM) buffer[ 6] = 'S';
+ if (attrs & FILE_ATTRIBUTE_ARCHIVE) buffer[ 8] = 'A';
+ if (attrs & FILE_ATTRIBUTE_COMPRESSED) buffer[10] = 'C';
+ if (attrs & FILE_ATTRIBUTE_DIRECTORY) buffer[12] = 'D';
+ if (attrs & FILE_ATTRIBUTE_ENCRYPTED) buffer[14] = 'E';
+ if (attrs & FILE_ATTRIBUTE_TEMPORARY) buffer[16] = 'T';
+ if (attrs & FILE_ATTRIBUTE_SPARSE_FILE) buffer[18] = 'P';
+ if (attrs & FILE_ATTRIBUTE_REPARSE_POINT) buffer[20] = 'Q';
+ if (attrs & FILE_ATTRIBUTE_OFFLINE) buffer[22] = 'O';
+ if (attrs & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) buffer[24] = 'X';
+ if (attrs & ATTRIBUTE_EXECUTABLE) buffer[26] = 'x';
+ if (attrs & ATTRIBUTE_SYMBOLIC_LINK) buffer[28] = 'L';
+ }
+
+ if (calcWidthCol == -1)
+ _out_wrkr.output_tabbed_text(dis, _positions, col, buffer);
+ else if (calcWidthCol==col || calcWidthCol==COLUMNS)
+ calc_tabbed_width(dis, col, buffer);
+ }
+ ++col;
+
+/*TODO
+ if (flags.security) {
+ DWORD rights = get_access_mask();
+
+ tcscpy(buffer, TEXT(" \t \t \t \t \t \t \t \t \t \t \t "));
+
+ if (rights & FILE_READ_DATA) buffer[ 0] = 'R';
+ if (rights & FILE_WRITE_DATA) buffer[ 2] = 'W';
+ if (rights & FILE_APPEND_DATA) buffer[ 4] = 'A';
+ if (rights & FILE_READ_EA) {buffer[6] = 'entry'; buffer[ 7] = 'R';}
+ if (rights & FILE_WRITE_EA) {buffer[9] = 'entry'; buffer[10] = 'W';}
+ if (rights & FILE_EXECUTE) buffer[12] = 'X';
+ if (rights & FILE_DELETE_CHILD) buffer[14] = 'D';
+ if (rights & FILE_READ_ATTRIBUTES) {buffer[16] = 'a'; buffer[17] = 'R';}
+ if (rights & FILE_WRITE_ATTRIBUTES) {buffer[19] = 'a'; buffer[20] = 'W';}
+ if (rights & WRITE_DAC) buffer[22] = 'C';
+ if (rights & WRITE_OWNER) buffer[24] = 'O';
+ if (rights & SYNCHRONIZE) buffer[26] = 'S';
+
+ output_text(dis, col++, buffer, DT_LEFT, 3, psize);
+ }
+
+ if (flags.description) {
+ get_description(buffer);
+ output_text(dis, col++, buffer, 0, psize);
+ }
+*/
+ ++col;
+
+ // output content / symbolic link target / comment
+ if (visible_cols & COL_CONTENT) {
+ if (calcWidthCol == -1)
+ _out_wrkr.output_text(dis, _positions, col, entry->_content? entry->_content: TEXT(""), 0);
+ else if (calcWidthCol==col || calcWidthCol==COLUMNS)
+ calc_width(dis, col, entry->_content? entry->_content: TEXT(""));
+ }
+}
+
+
+void Pane::calc_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str)
+{
+ RECT rt = {0, 0, 0, 0};
+
+ DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_NOPREFIX);
+
+ if (rt.right > _widths[col])
+ _widths[col] = rt.right;
+}
+
+void Pane::calc_tabbed_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str)
+{
+ RECT rt = {0, 0, 0, 0};
+
+/* DRAWTEXTPARAMS dtp = {sizeof(DRAWTEXTPARAMS), 2};
+ DrawTextEx(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_NOPREFIX|DT_EXPANDTABS|DT_TABSTOP, &dtp);*/
+
+ DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_EXPANDTABS|DT_TABSTOP|(2<<8));
+
+ if (rt.right > _widths[col])
+ _widths[col] = rt.right;
+}
+
+
+ // insert listbox entries after index idx
+
+int Pane::insert_entries(Entry* dir, int idx)
+{
+ Entry* entry = dir;
+
+ if (!entry)
+ return idx;
+
+ for(; entry; entry=entry->_next) {
+#ifndef _LEFT_FILES
+ if (_treePane &&
+ !(entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && // not a directory?
+ !entry->_down) // not a file with NTFS sub-streams?
+ continue;
+#endif
+
+ // don't display entries "." and ".." in the left pane
+ if (_treePane && (entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
+ && entry->_data.cFileName[0]==TEXT('.'))
+ if (entry->_data.cFileName[1]==TEXT('\0') ||
+ (entry->_data.cFileName[1]==TEXT('.') && entry->_data.cFileName[2]==TEXT('\0')))
+ continue;
+
+ if (idx != -1)
+ ++idx;
+
+ ListBox_InsertItemData(_hwnd, idx, entry);
+
+ if (_treePane && entry->_expanded)
+ idx = insert_entries(entry->_down, idx);
+ }
+
+ return idx;
+}
+
+
+void Pane::set_header()
+{
+ HD_ITEM item;
+ int scroll_pos = GetScrollPos(_hwnd, SB_HORZ);
+ int i=0, x=0;
+
+ item.mask = HDI_WIDTH;
+ item.cxy = 0;
+
+ for(; x+_widths[i]<scroll_pos && i<COLUMNS; i++) {
+ x += _widths[i];
+ Header_SetItem(_hwndHeader, i, &item);
+ }
+
+ if (i < COLUMNS) {
+ x += _widths[i];
+ item.cxy = x - scroll_pos;
+ Header_SetItem(_hwndHeader, i++, &item);
+
+ for(; i<COLUMNS; i++) {
+ item.cxy = _widths[i];
+ x += _widths[i];
+ Header_SetItem(_hwndHeader, i, &item);
+ }
+ }
+}
+
+
+ // calculate one prefered column width
+
+void Pane::calc_single_width(int col)
+{
+ HFONT hfontOld;
+ int x, cx;
+ int cnt;
+ HDC hdc;
+
+ int entries = ListBox_GetCount(_hwnd);
+
+ _widths[col] = 0;
+
+ hdc = GetDC(_hwnd);
+ hfontOld = SelectFont(hdc, _out_wrkr._hfont);
+
+ for(cnt=0; cnt<entries; cnt++) {
+ Entry* entry = (Entry*) ListBox_GetItemData(_hwnd, cnt);
+
+ DRAWITEMSTRUCT dis;
+
+ dis.CtlType = 0;
+ dis.CtlID = 0;
+ dis.itemID = 0;
+ dis.itemAction = 0;
+ dis.itemState = 0;
+ dis.hwndItem = _hwnd;
+ dis.hDC = hdc;
+ dis.rcItem.left = 0;
+ dis.rcItem.top = 0;
+ dis.rcItem.right = 0;
+ dis.rcItem.bottom = 0;
+ /*dis.itemData = 0; */
+
+ draw_item(&dis, entry, col);
+ }
+
+ SelectObject(hdc, hfontOld);
+ ReleaseDC(_hwnd, hdc);
+
+ cx = _widths[col];
+
+ if (cx) {
+ cx += 3*_out_wrkr._spaceSize.cx;
+
+ if (cx < IMAGE_WIDTH)
+ cx = IMAGE_WIDTH;
+ }
+
+ _widths[col] = cx;
+
+ x = _positions[col] + cx;
+
+ for(; col<COLUMNS; ) {
+ _positions[++col] = x;
+ x += _widths[col];
+ }
+
+ ListBox_SetHorizontalExtent(_hwnd, x);
+}
+
+
+int Pane::Notify(int id, NMHDR* pnmh)
+{
+ switch(pnmh->code) {
+ case HDN_TRACK:
+ case HDN_ENDTRACK: {
+ HD_NOTIFY* phdn = (HD_NOTIFY*) pnmh;
+ int idx = phdn->iItem;
+ int dx = phdn->pitem->cxy - _widths[idx];
+ int i;
+
+ ClientRect clnt(_hwnd);
+
+ // move immediate to simulate HDS_FULLDRAG (for now [04/2000] not realy needed with WINELIB)
+ Header_SetItem(_hwndHeader, idx, phdn->pitem);
+
+ _widths[idx] += dx;
+
+ for(i=idx; ++i<=COLUMNS; )
+ _positions[i] += dx;
+
+ {
+ int scroll_pos = GetScrollPos(_hwnd, SB_HORZ);
+ RECT rt_scr;
+ RECT rt_clip;
+
+ rt_scr.left = _positions[idx+1]-scroll_pos;
+ rt_scr.top = 0;
+ rt_scr.right = clnt.right;
+ rt_scr.bottom = clnt.bottom;
+
+ rt_clip.left = _positions[idx]-scroll_pos;
+ rt_clip.top = 0;
+ rt_clip.right = clnt.right;
+ rt_clip.bottom = clnt.bottom;
+
+ if (rt_scr.left < 0) rt_scr.left = 0;
+ if (rt_clip.left < 0) rt_clip.left = 0;
+
+ ScrollWindowEx(_hwnd, dx, 0, &rt_scr, &rt_clip, 0, 0, SW_INVALIDATE);
+
+ rt_clip.right = _positions[idx+1];
+ RedrawWindow(_hwnd, &rt_clip, 0, RDW_INVALIDATE|RDW_UPDATENOW);
+
+ if (pnmh->code == HDN_ENDTRACK) {
+ ListBox_SetHorizontalExtent(_hwnd, _positions[COLUMNS]);
+
+ if (GetScrollPos(_hwnd, SB_HORZ) != scroll_pos)
+ set_header();
+ }
+ }
+
+ return 0;
+ }
+
+ case HDN_DIVIDERDBLCLICK: {
+ HD_NOTIFY* phdn = (HD_NOTIFY*) pnmh;
+ HD_ITEM item;
+
+ calc_single_width(phdn->iItem);
+ item.mask = HDI_WIDTH;
+ item.cxy = _widths[phdn->iItem];
+
+ Header_SetItem(_hwndHeader, phdn->iItem, &item);
+ InvalidateRect(_hwnd, 0, TRUE);
+ break;}
+
+ default:
+ return super::Notify(id, pnmh);
+ }
+
+ return 0;
+}
+
+
+OutputWorker::OutputWorker()
+{
+ _hfont = CreateFont(-MulDiv(8,GetDeviceCaps(WindowCanvas(0),LOGPIXELSY),72), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("MS Sans Serif"));
+}
+
+void OutputWorker::init_output(HWND hwnd)
+{
+ TCHAR b[16];
+
+ WindowCanvas canvas(hwnd);
+
+ if (GetNumberFormat(LOCALE_USER_DEFAULT, 0, TEXT("1000"), 0, b, 16) > 4)
+ _num_sep = b[1];
+ else
+ _num_sep = TEXT('.');
+
+ FontSelection font(canvas, _hfont);
+ GetTextExtentPoint32(canvas, TEXT(" "), 1, &_spaceSize);
+}
+
+
+void OutputWorker::output_text(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str, DWORD flags)
+{
+ int x = dis->rcItem.left;
+ RECT rt;
+
+ rt.left = x+positions[col]+_spaceSize.cx;
+ rt.top = dis->rcItem.top;
+ rt.right = x+positions[col+1]-_spaceSize.cx;
+ rt.bottom = dis->rcItem.bottom;
+
+ DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_SINGLELINE|DT_NOPREFIX|flags);
+}
+
+void OutputWorker::output_tabbed_text(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str)
+{
+ int x = dis->rcItem.left;
+ RECT rt;
+
+ rt.left = x+positions[col]+_spaceSize.cx;
+ rt.top = dis->rcItem.top;
+ rt.right = x+positions[col+1]-_spaceSize.cx;
+ rt.bottom = dis->rcItem.bottom;
+
+/* DRAWTEXTPARAMS dtp = {sizeof(DRAWTEXTPARAMS), 2};
+ DrawTextEx(dis->hDC, (LPTSTR)str, -1, &rt, DT_SINGLELINE|DT_NOPREFIX|DT_EXPANDTABS|DT_TABSTOP, &dtp);*/
+
+ DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_SINGLELINE|DT_EXPANDTABS|DT_TABSTOP|(2<<8));
+}
+
+void OutputWorker::output_number(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str)
+{
+ int x = dis->rcItem.left;
+ RECT rt;
+ LPCTSTR s = str;
+ TCHAR b[128];
+ LPTSTR d = b;
+ int pos;
+
+ rt.left = x+positions[col]+_spaceSize.cx;
+ rt.top = dis->rcItem.top;
+ rt.right = x+positions[col+1]-_spaceSize.cx;
+ rt.bottom = dis->rcItem.bottom;
+
+ if (*s)
+ *d++ = *s++;
+
+ // insert number separator characters
+ pos = lstrlen(s) % 3;
+
+ while(*s)
+ if (pos--)
+ *d++ = *s++;
+ else {
+ *d++ = _num_sep;
+ pos = 3;
+ }
+
+ DrawText(dis->hDC, b, d-b, &rt, DT_RIGHT|DT_SINGLELINE|DT_NOPREFIX|DT_END_ELLIPSIS);
+}
+
+
+BOOL Pane::command(UINT cmd)
+{
+ switch(cmd) {
+ case ID_VIEW_NAME:
+ if (_visible_cols) {
+ _visible_cols = 0;
+ calc_widths(true);
+ set_header();
+ InvalidateRect(_hwnd, 0, TRUE);
+ MenuInfo* menu_info = Frame_GetMenuInfo(GetParent(_hwnd));
+ if (menu_info) {
+ CheckMenuItem(menu_info->_hMenuView, ID_VIEW_NAME, MF_BYCOMMAND|MF_CHECKED);
+ CheckMenuItem(menu_info->_hMenuView, ID_VIEW_ALL_ATTRIBUTES, MF_BYCOMMAND);
+ CheckMenuItem(menu_info->_hMenuView, ID_VIEW_SELECTED_ATTRIBUTES, MF_BYCOMMAND);
+ }
+ }
+ break;
+
+ case ID_VIEW_ALL_ATTRIBUTES:
+ if (_visible_cols != COL_ALL) {
+ _visible_cols = COL_ALL;
+ calc_widths(true);
+ set_header();
+ InvalidateRect(_hwnd, 0, TRUE);
+ MenuInfo* menu_info = Frame_GetMenuInfo(GetParent(_hwnd));
+ if (menu_info) {
+ CheckMenuItem(menu_info->_hMenuView, ID_VIEW_NAME, MF_BYCOMMAND);
+ CheckMenuItem(menu_info->_hMenuView, ID_VIEW_ALL_ATTRIBUTES, MF_BYCOMMAND|MF_CHECKED);
+ CheckMenuItem(menu_info->_hMenuView, ID_VIEW_SELECTED_ATTRIBUTES, MF_BYCOMMAND);
+ }
+ }
+ break;
+
+ case ID_PREFERED_SIZES: {
+ calc_widths(true);
+ set_header();
+ InvalidateRect(_hwnd, 0, TRUE);
+ break;}
+
+ /*@todo more command ids... */
+
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+MainFrameBase* Pane::get_frame()
+{
+ HWND owner = GetParent(_hwnd);
+
+ return (MainFrameBase*)owner;
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // pane.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#define IDW_TREE_LEFT 3
+#define IDW_TREE_RIGHT 6
+#define IDW_HEADER_LEFT 2
+#define IDW_HEADER_RIGHT 5
+
+
+enum COLUMN_FLAGS {
+ COL_TYPE = 0x0001,
+ COL_SIZE = 0x0002,
+ COL_DATE = 0x0004,
+ COL_TIME = 0x0008,
+ COL_ATTRIBUTES = 0x0010,
+ COL_DOSNAMES = 0x0020,
+ COL_INDEX = 0x0040,
+ COL_LINKS = 0x0080,
+ COL_CONTENT = 0x0100,
+ COL_ALL = COL_TYPE|COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_DOSNAMES|COL_INDEX|COL_LINKS|COL_CONTENT
+};
+
+
+ /// Worker for drawing contents of file lists in child pane
+struct OutputWorker
+{
+ OutputWorker();
+
+ void init_output(HWND hwnd);
+ void output_text(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str, DWORD flags);
+ void output_tabbed_text(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str);
+ void output_number(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str);
+
+ SIZE _spaceSize;
+ TCHAR _num_sep;
+ HFONT _hfont;
+};
+
+
+ /// child window pane for displaying file lists
+struct Pane : public SubclassedWindow
+{
+ typedef SubclassedWindow super;
+
+ Pane(HWND hparent, int id, int id_header, Entry* rool, bool treePane, int visible_cols);
+ ~Pane();
+
+#define COLUMNS 12
+ int _widths[COLUMNS];
+ int _positions[COLUMNS+1];
+
+ WindowHandle _hwndHeader;
+
+ Entry* _root;
+ Entry* _cur;
+
+ COLORREF _clrCompressed;
+
+ int _visible_cols;
+ bool _treePane;
+
+ void init();
+ void set_header();
+ bool create_header(HWND parent, int id);
+
+ bool calc_widths(bool anyway);
+ void calc_single_width(int col);
+ void draw_item(LPDRAWITEMSTRUCT dis, Entry* entry, int calcWidthCol=-1);
+
+ int insert_entries(Entry* dir, int idx=-1);
+ BOOL command(UINT cmd);
+ int Notify(int id, NMHDR* pnmh);
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ void calc_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str);
+ void calc_tabbed_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str);
+ struct MainFrameBase* get_frame();
+
+protected:
+ HIMAGELIST _himl;
+ OutputWorker _out_wrkr;
+};
+
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // ntobjfs.cpp
+ //
+ // Martin Fuchs, 31.01.2004
+ //
+
+
+#include <precomp.h>
+
+#include "regfs.h"
+
+
+void RegDirectory::read_directory(int scan_flags)
+{
+ CONTEXT("RegDirectory::read_directory()");
+
+ Entry* first_entry = NULL;
+ int level = _level + 1;
+
+ TCHAR buffer[MAX_PATH];
+
+ _tcscpy(buffer, (LPCTSTR)_path);
+ LPTSTR pname = buffer + _tcslen(buffer);
+ int plen = MAX_PATH - _tcslen(buffer);
+
+ HKEY hkey;
+
+ if (!RegOpenKeyEx(_hKeyRoot, *buffer=='\\'?buffer+1:buffer, 0, STANDARD_RIGHTS_READ|KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS, &hkey)) {
+ if (pname[-1] != '\\')
+ *pname++ = '\\', plen--;
+
+ TCHAR name[MAX_PATH], class_name[MAX_PATH];
+ WIN32_FIND_DATA w32fd;
+ Entry* last = NULL;
+ RegEntry* entry;
+
+ for(int idx=0; ; ++idx) {
+ memset(&w32fd, 0, sizeof(WIN32_FIND_DATA));
+
+ DWORD name_len = MAX_PATH;
+ DWORD class_len = MAX_PATH;
+
+ if (RegEnumKeyEx(hkey, idx, name, &name_len, 0, class_name, &class_len, &w32fd.ftLastWriteTime))
+ break;
+
+ w32fd.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+ _tcsncpy(w32fd.cFileName, name, name_len);
+
+ _tcscpy_s(pname, plen, name);
+ entry = new RegDirectory(this, buffer, _hKeyRoot);
+
+ memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA));
+
+ if (class_len)
+ entry->_type_name = _tcsdup(String(class_name, class_len));
+
+ if (!first_entry)
+ first_entry = entry;
+
+ if (last)
+ last->_next = entry;
+
+ entry->_level = level;
+
+ last = entry;
+ }
+/*
+ TCHAR value[MAX_PATH];
+ LONG value_len = sizeof(value);
+
+ if (!RegQueryValue(hkey, NULL, value, &value_len) && value_len>1) {
+ memset(&w32fd, 0, sizeof(WIN32_FIND_DATA));
+
+ lstrcpy(w32fd.cFileName, TEXT("(Default)"));
+
+ entry = new RegEntry(this);
+
+ memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA));
+
+ entry->_content = _tcsdup(value);
+
+ if (!first_entry)
+ first_entry = entry;
+
+ if (last)
+ last->_next = entry;
+
+ entry->_level = level;
+
+ last = entry;
+ }
+*/
+ DWORD type;
+ for(int idx=0; ; ++idx) {
+ DWORD name_len = MAX_PATH;
+
+ if (RegEnumValue(hkey, idx, name, &name_len, 0, &type, NULL, NULL))
+ break;
+
+ memset(&w32fd, 0, sizeof(WIN32_FIND_DATA));
+
+ if (name[0])
+ lstrcpy(w32fd.cFileName, name);
+ else
+ lstrcpy(w32fd.cFileName, TEXT("(Default)"));
+
+ entry = new RegEntry(this);
+
+ memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA));
+
+ switch(type) {
+ case REG_NONE: entry->_type_name = _tcsdup(TEXT("REG_NONE")); break;
+ case REG_SZ: entry->_type_name = _tcsdup(TEXT("REG_SZ")); break;
+ case REG_EXPAND_SZ: entry->_type_name = _tcsdup(TEXT("REG_EXPAND_SZ")); break;
+ case REG_BINARY: entry->_type_name = _tcsdup(TEXT("REG_BINARY")); break;
+ case REG_DWORD: entry->_type_name = _tcsdup(TEXT("REG_DWORD")); break;
+ case REG_DWORD_BIG_ENDIAN: entry->_type_name = _tcsdup(TEXT("REG_DWORD_BIG_ENDIAN")); break;
+ case REG_LINK: entry->_type_name = _tcsdup(TEXT("REG_LINK")); break;
+ case REG_MULTI_SZ: entry->_type_name = _tcsdup(TEXT("REG_MULTI_SZ")); break;
+ case REG_RESOURCE_LIST: entry->_type_name = _tcsdup(TEXT("REG_RESOURCE_LIST")); break;
+ case REG_FULL_RESOURCE_DESCRIPTOR: entry->_type_name = _tcsdup(TEXT("REG_FULL_RESOURCE_DESCRIPTOR")); break;
+ case REG_RESOURCE_REQUIREMENTS_LIST: entry->_type_name = _tcsdup(TEXT("REG_RESOURCE_REQUIREMENTS_LIST"));break;
+ case REG_QWORD: entry->_type_name = _tcsdup(TEXT("REG_QWORD")); break;
+ }
+
+ ///@todo This can also be done in the RegEnumValue() call if we dynamically adjust the return buffer size.
+ TCHAR value[MAX_PATH];
+ DWORD value_len = sizeof(value);
+
+ if (!RegQueryValueEx(hkey, name, NULL, NULL, (LPBYTE)value, &value_len)) {
+ if (type==REG_SZ || type==REG_EXPAND_SZ || type==REG_LINK)
+ entry->_content = _tcsdup(value);
+ else if (type == REG_DWORD) {
+ TCHAR b[32];
+ _stprintf(b, TEXT("%ld"), *(DWORD*)&value);
+ entry->_content = _tcsdup(b);
+ }
+ }
+
+ if (!first_entry)
+ first_entry = entry;
+
+ if (last)
+ last->_next = entry;
+
+ entry->_level = level;
+
+ last = entry;
+ }
+
+ if (last)
+ last->_next = NULL;
+
+ RegCloseKey(hkey);
+ }
+
+ _down = first_entry;
+ _scanned = true;
+}
+
+
+const void* RegDirectory::get_next_path_component(const void* p) const
+{
+ LPCTSTR s = (LPCTSTR) p;
+
+ while(*s && *s!=TEXT('\\'))
+ ++s;
+
+ while(*s==TEXT('\\'))
+ ++s;
+
+ if (!*s)
+ return NULL;
+
+ return s;
+}
+
+
+Entry* RegDirectory::find_entry(const void* p)
+{
+ LPCTSTR name = (LPCTSTR)p;
+
+ for(Entry*entry=_down; entry; entry=entry->_next) {
+ LPCTSTR p = name;
+ LPCTSTR q = entry->_data.cFileName;
+
+ do {
+ if (!*p || *p==TEXT('\\') || *p==TEXT('/'))
+ return entry;
+ } while(tolower(*p++) == tolower(*q++));
+
+ p = name;
+ q = entry->_data.cAlternateFileName;
+
+ do {
+ if (!*p || *p==TEXT('\\') || *p==TEXT('/'))
+ return entry;
+ } while(tolower(*p++) == tolower(*q++));
+ }
+
+ return NULL;
+}
+
+
+ // get full path of specified registry entry
+bool RegEntry::get_path(PTSTR path, size_t path_count) const
+{
+ return get_path_base ( path, path_count, ET_REGISTRY );
+}
+
+BOOL RegEntry::launch_entry(HWND hwnd, UINT nCmdShow)
+{
+ return FALSE;
+}
+
+
+RegDirectory::RegDirectory(Entry* parent, LPCTSTR path, HKEY hKeyRoot)
+ : RegEntry(parent),
+ _hKeyRoot(hKeyRoot)
+{
+ _path = _tcsdup(path);
+
+ memset(&_data, 0, sizeof(WIN32_FIND_DATA));
+ _data.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+}
+
+
+void RegistryRoot::read_directory(int scan_flags)
+{
+ Entry *entry, *last, *first_entry;
+ int level = _level + 1;
+
+ _data.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+
+ entry = new RegDirectory(this, TEXT("\\"), HKEY_CURRENT_USER);
+ _tcscpy(entry->_data.cFileName, TEXT("HKEY_CURRENT_USER"));
+ entry->_level = level;
+
+ first_entry = entry;
+ last = entry;
+
+ entry = new RegDirectory(this, TEXT("\\"), HKEY_LOCAL_MACHINE);
+ _tcscpy(entry->_data.cFileName, TEXT("HKEY_LOCAL_MACHINE"));
+ entry->_level = level;
+
+ last->_next = entry;
+ last = entry;
+
+ entry = new RegDirectory(this, TEXT("\\"), HKEY_CLASSES_ROOT);
+ _tcscpy(entry->_data.cFileName, TEXT("HKEY_CLASSES_ROOT"));
+ entry->_level = level;
+
+ last->_next = entry;
+ last = entry;
+
+ entry = new RegDirectory(this, TEXT("\\"), HKEY_USERS);
+ _tcscpy(entry->_data.cFileName, TEXT("HKEY_USERS"));
+ entry->_level = level;
+
+ last->_next = entry;
+ last = entry;
+/*
+ entry = new RegDirectory(this, TEXT("\\"), HKEY_PERFORMANCE_DATA);
+ _tcscpy(entry->_data.cFileName, TEXT("HKEY_PERFORMANCE_DATA"));
+ entry->_level = level;
+
+ last->_next = entry;
+ last = entry;
+*/
+ entry = new RegDirectory(this, TEXT("\\"), HKEY_CURRENT_CONFIG);
+ _tcscpy(entry->_data.cFileName, TEXT("HKEY_CURRENT_CONFIG"));
+ entry->_level = level;
+
+ last->_next = entry;
+ last = entry;
+/*
+ entry = new RegDirectory(this, TEXT("\\"), HKEY_DYN_DATA);
+ _tcscpy(entry->_data.cFileName, TEXT("HKEY_DYN_DATA"));
+ entry->_level = level;
+
+ last->_next = entry;
+ last = entry;
+*/
+ last->_next = NULL;
+
+ _down = first_entry;
+ _scanned = true;
+}
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // regfs.h
+ //
+ // Martin Fuchs, 31.01.2004
+ //
+
+
+ /// Registry entry
+struct RegEntry : public Entry
+{
+ RegEntry(Entry* parent) : Entry(parent, ET_REGISTRY) {}
+
+protected:
+ RegEntry() : Entry(ET_REGISTRY) {}
+
+ virtual bool get_path(PTSTR path, size_t path_count) const;
+ virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow);
+};
+
+
+ /// Registry key entry
+struct RegDirectory : public RegEntry, public Directory
+{
+ RegDirectory(Entry* parent, LPCTSTR path, HKEY hKeyRoot);
+
+ ~RegDirectory()
+ {
+ free(_path);
+ _path = NULL;
+ }
+
+ virtual void read_directory(int scan_flags=0);
+ virtual const void* get_next_path_component(const void*) const;
+ virtual Entry* find_entry(const void*);
+
+protected:
+ HKEY _hKeyRoot;
+};
+
+
+ /// Registry key entry
+struct RegistryRoot : public RegEntry, public Directory
+{
+ RegistryRoot()
+ {
+ }
+
+ RegistryRoot(Entry* parent, LPCTSTR path)
+ : RegEntry(parent)
+ {
+ _path = _tcsdup(path);
+ }
+
+ ~RegistryRoot()
+ {
+ free(_path);
+ _path = NULL;
+ }
+
+ virtual void read_directory(int scan_flags=0);
+};
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005, 2006 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // shellbrowser.cpp
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#include <precomp.h>
+
+#include "../resource.h"
+
+
+ // work around GCC's wide string constant bug
+#ifdef __GNUC__
+const LPCTSTR C_DRIVE = C_DRIVE_STR;
+#endif
+
+
+ShellBrowser::ShellBrowser(HWND hwnd, HWND hwndFrame, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info,
+ BrowserCallback* cb, CtxMenuInterfaces& cm_ifs)
+#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
+ : super(IID_IShellFolderViewCB),
+#else
+ :
+#endif
+ _hwnd(hwnd),
+ _hwndFrame(hwndFrame),
+ _left_hwnd(left_hwnd),
+ _right_hwnd(right_hwnd),
+ _create_info(create_info),
+ _callback(cb),
+ _cm_ifs(cm_ifs)
+{
+ _pShellView = NULL;
+ _pDropTarget = NULL;
+ _last_sel = 0;
+
+ _cur_dir = NULL;
+
+ _himl = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLOR24, 2, 0);
+ ImageList_SetBkColor(_himl, GetSysColor(COLOR_WINDOW));
+}
+
+ShellBrowser::~ShellBrowser()
+{
+ (void)TreeView_SetImageList(_left_hwnd, _himl_old, TVSIL_NORMAL);
+ ImageList_Destroy(_himl);
+
+ if (_pShellView)
+ _pShellView->Release();
+
+ if (_pDropTarget) {
+ _pDropTarget->Release();
+ _pDropTarget = NULL;
+ }
+
+ if (_right_hwnd) {
+ DestroyWindow(_right_hwnd);
+ _right_hwnd = 0;
+ }
+}
+
+
+void ShellBrowser::Init()
+{
+ CONTEXT("ShellBrowser::Init()");
+
+ const String& root_name = GetDesktopFolder().get_name(_create_info._root_shell_path, SHGDN_FORADDRESSBAR);
+
+ _root._drive_type = DRIVE_UNKNOWN;
+ lstrcpy(_root._volname, root_name);
+ _root._fs_flags = 0;
+ lstrcpy(_root._fs, TEXT("Desktop"));
+
+ _root._entry = new ShellDirectory(GetDesktopFolder(), _create_info._root_shell_path, _hwnd);
+
+ _root._entry->read_directory(SCAN_DONT_ACCESS|SCAN_NO_FILESYSTEM); // avoid to handle desktop root folder as file system directory
+
+ if (_left_hwnd) {
+ InitializeTree();
+ InitDragDrop();
+ }
+
+ jump_to(_create_info._shell_path);
+
+ /* already filled by ShellDirectory constructor
+ lstrcpy(_root._entry->_data.cFileName, TEXT("Desktop")); */
+}
+
+void ShellBrowser::jump_to(LPCITEMIDLIST pidl)
+{
+ Entry* entry = NULL;
+
+ if (!_cur_dir)
+ _cur_dir = static_cast<ShellDirectory*>(_root._entry);
+
+ //LOG(FmtString(TEXT("ShellBrowser::jump_to(): pidl=%s"), (LPCTSTR)FileSysShellPath(pidl)));
+
+ // We could call read_tree() here to iterate through the hierarchy and open all folders
+ // from _create_info._root_shell_path (_cur_dir) to _create_info._shell_path (pidl).
+ // To make it easier we just use ILFindChild() instead.
+ if (_cur_dir) {
+ static DynamicFct<LPITEMIDLIST(WINAPI*)(LPCITEMIDLIST, LPCITEMIDLIST)> ILFindChild(TEXT("SHELL32"), 24);
+
+ if (ILFindChild) {
+ for(;;) {
+ LPCITEMIDLIST child_pidl = (*ILFindChild)(_cur_dir->create_absolute_pidl(), pidl);
+ if (!child_pidl || !child_pidl->mkid.cb)
+ break;
+
+ _cur_dir->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
+
+ entry = _cur_dir->find_entry(child_pidl);
+ if (!entry)
+ break;
+
+ _cur_dir = static_cast<ShellDirectory*>(entry);
+ _callback->entry_selected(entry);
+ }
+ } else {
+ _cur_dir->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
+
+ entry = _cur_dir->find_entry(pidl); // This is not correct in the common case, but works on the desktop level.
+
+ if (entry) {
+ _cur_dir = static_cast<ShellDirectory*>(entry);
+ _callback->entry_selected(entry);
+ }
+ }
+ }
+
+ // If not already called, now directly call UpdateFolderView() using pidl
+ if (!entry)
+ UpdateFolderView(ShellFolder(pidl));
+}
+
+
+void ShellBrowser::InitializeTree()
+{
+ CONTEXT("ShellBrowserChild::InitializeTree()");
+
+ _himl_old = TreeView_SetImageList(_left_hwnd, _himl, TVSIL_NORMAL);
+ TreeView_SetScrollTime(_left_hwnd, 100);
+
+ TV_INSERTSTRUCT tvInsert;
+ TV_ITEM& tvItem = tvInsert.item;
+
+ tvInsert.hParent = 0;
+ tvInsert.hInsertAfter = TVI_LAST;
+
+ tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;
+ tvItem.lParam = (LPARAM)_root._entry;
+ tvItem.pszText = _root._volname; //LPSTR_TEXTCALLBACK;
+ tvItem.iImage = tvItem.iSelectedImage = I_IMAGECALLBACK;
+ tvItem.cChildren = 1;
+
+ HTREEITEM hItem = TreeView_InsertItem(_left_hwnd, &tvInsert);
+ TreeView_SelectItem(_left_hwnd, hItem);
+ TreeView_Expand(_left_hwnd, hItem, TVE_EXPAND);
+}
+
+bool ShellBrowser::InitDragDrop()
+{
+ CONTEXT("ShellBrowser::InitDragDrop()");
+
+ _pDropTarget = new TreeDropTarget(_left_hwnd);
+
+ if (!_pDropTarget)
+ return false;
+
+ _pDropTarget->AddRef();
+
+ if (FAILED(RegisterDragDrop(_left_hwnd, _pDropTarget))) {//calls addref
+ _pDropTarget->Release(); // free TreeDropTarget
+ _pDropTarget = NULL;
+ return false;
+ } else
+ _pDropTarget->Release();
+
+ FORMATETC ftetc;
+
+ ftetc.dwAspect = DVASPECT_CONTENT;
+ ftetc.lindex = -1;
+ ftetc.tymed = TYMED_HGLOBAL;
+ ftetc.cfFormat = CF_HDROP;
+
+ _pDropTarget->AddSuportedFormat(ftetc);
+
+ return true;
+}
+
+
+void ShellBrowser::OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh)
+{
+ CONTEXT("ShellBrowser::OnTreeGetDispInfo()");
+
+ LPNMTVDISPINFO lpdi = (LPNMTVDISPINFO)pnmh;
+ ShellEntry* entry = (ShellEntry*)lpdi->item.lParam;
+
+ if (entry) {
+ if (lpdi->item.mask & TVIF_TEXT)
+ lpdi->item.pszText = entry->_display_name;
+
+ if (lpdi->item.mask & (TVIF_IMAGE|TVIF_SELECTEDIMAGE)) {
+ if (lpdi->item.mask & TVIF_IMAGE)
+ lpdi->item.iImage = get_image_idx(
+ entry->safe_extract_icon((ICONCACHE_FLAGS)(ICF_HICON|ICF_OVERLAYS)));
+
+ if (lpdi->item.mask & TVIF_SELECTEDIMAGE)
+ lpdi->item.iSelectedImage = get_image_idx(
+ entry->safe_extract_icon((ICONCACHE_FLAGS)(ICF_HICON|ICF_OVERLAYS|ICF_OPEN)));
+ }
+ }
+}
+
+int ShellBrowser::get_image_idx(int icon_id)
+{
+ if (icon_id != ICID_NONE) {
+ map<int,int>::const_iterator found = _image_map.find(icon_id);
+
+ if (found != _image_map.end())
+ return found->second;
+
+ int idx = ImageList_AddIcon(_himl, g_Globals._icon_cache.get_icon(icon_id).get_hicon());
+
+ _image_map[icon_id] = idx;
+
+ return idx;
+ } else
+ return -1;
+}
+
+void ShellBrowser::invalidate_cache()
+{
+ (void)TreeView_SetImageList(_left_hwnd, _himl_old, TVSIL_NORMAL);
+ ImageList_Destroy(_himl);
+
+ _himl_old = TreeView_SetImageList(_left_hwnd, _himl, TVSIL_NORMAL);
+ _himl = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_MASK|ILC_COLOR24, 2, 0);
+
+ for(map<int,int>::const_iterator it=_image_map.begin(); it!=_image_map.end(); ++it)
+ g_Globals._icon_cache.free_icon(it->first);
+
+ _image_map.clear();
+}
+
+
+void ShellBrowser::OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv)
+{
+ CONTEXT("ShellBrowser::OnTreeItemExpanding()");
+
+ if (pnmtv->action == TVE_COLLAPSE)
+ TreeView_Expand(_left_hwnd, pnmtv->itemNew.hItem, TVE_COLLAPSE|TVE_COLLAPSERESET);
+ else if (pnmtv->action == TVE_EXPAND) {
+ ShellDirectory* entry = (ShellDirectory*)TreeView_GetItemData(_left_hwnd, pnmtv->itemNew.hItem);
+
+ if (entry)
+ if (!InsertSubitems(pnmtv->itemNew.hItem, entry, entry->_folder)) {
+ entry->_shell_attribs &= ~SFGAO_HASSUBFOLDER;
+
+ // remove subitem "+"
+ TV_ITEM tvItem;
+
+ tvItem.mask = TVIF_CHILDREN;
+ tvItem.hItem = pnmtv->itemNew.hItem;
+ tvItem.cChildren = 0;
+
+ TreeView_SetItem(_left_hwnd, &tvItem);
+ }
+ }
+}
+
+int ShellBrowser::InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder)
+{
+ CONTEXT("ShellBrowser::InsertSubitems()");
+
+ WaitCursor wait;
+
+ int cnt = 0;
+
+ SendMessage(_left_hwnd, WM_SETREDRAW, FALSE, 0);
+
+ try {
+ entry->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
+ } catch(COMException& e) {
+ HandleException(e, g_Globals._hMainWnd);
+ }
+
+ // remove old children items
+ HTREEITEM hchild, hnext;
+
+ hnext = TreeView_GetChild(_left_hwnd, hParentItem);
+
+ while((hchild=hnext) != 0) {
+ hnext = TreeView_GetNextSibling(_left_hwnd, hchild);
+ TreeView_DeleteItem(_left_hwnd, hchild);
+ }
+
+ TV_ITEM tvItem;
+ TV_INSERTSTRUCT tvInsert;
+
+ for(entry=entry->_down; entry; entry=entry->_next) {
+#ifndef _LEFT_FILES
+ if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+#endif
+ {
+ // ignore hidden directories
+ if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
+ continue;
+
+ // ignore directory entries "." and ".."
+ if (entry->_data.cFileName[0]==TEXT('.') &&
+ (entry->_data.cFileName[1]==TEXT('\0') ||
+ (entry->_data.cFileName[1]==TEXT('.') && entry->_data.cFileName[2]==TEXT('\0'))))
+ continue;
+
+ ZeroMemory(&tvItem, sizeof(tvItem));
+
+ tvItem.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN;
+ tvItem.pszText = LPSTR_TEXTCALLBACK;
+ tvItem.iImage = tvItem.iSelectedImage = I_IMAGECALLBACK;
+ tvItem.lParam = (LPARAM)entry;
+ tvItem.cChildren = entry->_shell_attribs & SFGAO_HASSUBFOLDER? 1: 0;
+
+ if (entry->_shell_attribs & SFGAO_SHARE) {
+ tvItem.mask |= TVIF_STATE;
+ tvItem.stateMask |= TVIS_OVERLAYMASK;
+ tvItem.state |= INDEXTOOVERLAYMASK(1);
+ }
+
+ tvInsert.item = tvItem;
+ tvInsert.hInsertAfter = TVI_LAST;
+ tvInsert.hParent = hParentItem;
+
+ (void)TreeView_InsertItem(_left_hwnd, &tvInsert);
+
+ ++cnt;
+ }
+ }
+
+ SendMessage(_left_hwnd, WM_SETREDRAW, TRUE, 0);
+
+ return cnt;
+}
+
+
+void ShellBrowser::OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv)
+{
+ CONTEXT("ShellBrowser::OnTreeItemSelected()");
+
+ Entry* entry = (Entry*)pnmtv->itemNew.lParam;
+
+ _last_sel = pnmtv->itemNew.hItem;
+
+ if (entry)
+ _callback->entry_selected(entry);
+}
+
+
+void ShellBrowser::OnTreeItemRClick(int idCtrl, LPNMHDR pnmh)
+{
+ CONTEXT("ShellBrowser::OnTreeItemRClick()");
+
+ TVHITTESTINFO tvhti;
+
+ GetCursorPos(&tvhti.pt);
+ ScreenToClient(_left_hwnd, &tvhti.pt);
+
+ tvhti.flags = LVHT_NOWHERE;
+ (void)TreeView_HitTest(_left_hwnd, &tvhti);
+
+ if (TVHT_ONITEM & tvhti.flags) {
+ LPARAM itemData = TreeView_GetItemData(_left_hwnd, tvhti.hItem);
+
+ if (itemData) {
+ Entry* entry = (Entry*)itemData;
+ ClientToScreen(_left_hwnd, &tvhti.pt);
+
+ CHECKERROR(entry->do_context_menu(_hwnd, tvhti.pt, _cm_ifs));
+ }
+ }
+}
+
+
+void ShellBrowser::UpdateFolderView(IShellFolder* folder)
+{
+ CONTEXT("ShellBrowser::UpdateFolderView()");
+
+ FOLDERSETTINGS fs;
+ IShellView* pLastShellView = _pShellView;
+
+ _folder = folder;
+
+ if (pLastShellView)
+ pLastShellView->GetCurrentInfo(&fs);
+ else {
+ fs.ViewMode = _create_info._open_mode&OWM_DETAILS? FVM_DETAILS: FVM_ICON;
+ fs.fFlags = FWF_NOCLIENTEDGE|FWF_BESTFITWINDOW;
+ }
+
+#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
+ SFV_CREATE sfv_create;
+
+ sfv_create.cbSize = sizeof(SFV_CREATE);
+ sfv_create.pshf = folder;
+ sfv_create.psvOuter = NULL;
+ sfv_create.psfvcb = this;
+
+ HRESULT hr = SHCreateShellFolderView(&sfv_create, &_pShellView);
+#else
+ HRESULT hr = folder->CreateViewObject(_hwnd, IID_IShellView, (void**)&_pShellView);
+#endif
+
+ if (FAILED(hr)) {
+ _pShellView = NULL;
+ return;
+ }
+
+ RECT rect = {CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT};
+ hr = _pShellView->CreateViewWindow(pLastShellView, &fs, static_cast<IShellBrowser*>(this), &rect, &_right_hwnd/*&m_hWndListView*/);
+
+ if (pLastShellView) {
+ pLastShellView->GetCurrentInfo(&fs);
+ pLastShellView->UIActivate(SVUIA_DEACTIVATE);
+ pLastShellView->DestroyViewWindow();
+ pLastShellView->Release();
+ }
+
+ _pShellView->UIActivate(SVUIA_ACTIVATE_NOFOCUS);
+}
+
+
+#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
+
+ /// shell view callback
+HRESULT STDMETHODCALLTYPE ShellBrowser::MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ if (uMsg == SFVM_INITMENUPOPUP) {
+ //@todo never reached
+ InsertMenu((HMENU)lParam, 0, MF_BYPOSITION, 12345, TEXT("TEST ENTRY"));
+ return S_OK;
+ }
+
+ return E_NOTIMPL;
+}
+
+#endif
+
+
+HRESULT ShellBrowser::OnDefaultCommand(LPIDA pida)
+{
+ CONTEXT("ShellBrowser::OnDefaultCommand()");
+
+ if (pida->cidl >= 1) {
+ if (_left_hwnd) { // explorer mode
+ if (_last_sel) {
+ ShellDirectory* parent = (ShellDirectory*)TreeView_GetItemData(_left_hwnd, _last_sel);
+
+ if (parent) {
+ try {
+ parent->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
+ } catch(COMException& e) {
+ return e.Error();
+ }
+
+ UINT firstOffset = pida->aoffset[1];
+ LPITEMIDLIST pidl = (LPITEMIDLIST)((LPBYTE)pida+firstOffset);
+
+ Entry* entry = parent->find_entry(pidl);
+
+ if (entry && (entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
+ if (entry->_etype == ET_SHELL)
+ if (_last_sel && select_entry(_last_sel, entry))
+ return S_OK;
+
+ //@todo look for hidden or new subfolders and refresh/add new entry instead of opening a new window
+ return E_NOTIMPL;
+ }
+ }
+ } else { // no tree control
+ if (MainFrameBase::OpenShellFolders(pida, _hwndFrame))
+ return S_OK;
+
+/* create new Frame Window
+ if (MainFrame::OpenShellFolders(pida, 0))
+ return S_OK;
+*/
+ }
+ }
+
+ return E_NOTIMPL;
+}
+
+
+HTREEITEM ShellBrowser::select_entry(HTREEITEM hitem, Entry* entry, bool expand)
+{
+ CONTEXT("ShellBrowser::select_entry()");
+
+ if (expand && !TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND))
+ return 0;
+
+ for(hitem=TreeView_GetChild(_left_hwnd,hitem); hitem; hitem=TreeView_GetNextSibling(_left_hwnd,hitem)) {
+ if ((Entry*)TreeView_GetItemData(_left_hwnd,hitem) == entry) {
+ if (TreeView_SelectItem(_left_hwnd, hitem)) {
+ if (expand)
+ TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND);
+
+ return hitem;
+ }
+
+ break;
+ }
+ }
+
+ return 0;
+}
+
+
+bool ShellBrowser::jump_to_pidl(LPCITEMIDLIST pidl)
+{
+ if (!_root._entry)
+ return false;
+
+ // iterate through the hierarchy and open all folders to reach pidl
+ WaitCursor wait;
+
+ HTREEITEM hitem = TreeView_GetRoot(_left_hwnd);
+ Entry* entry = _root._entry;
+
+ for(const void*p=pidl;;) {
+ if (!p)
+ return true;
+
+ if (!entry || !hitem)
+ break;
+
+ entry->smart_scan(SORT_NAME, SCAN_DONT_ACCESS);
+
+ Entry* found = entry->find_entry(p);
+ p = entry->get_next_path_component(p);
+
+ if (found)
+ hitem = select_entry(hitem, found);
+
+ entry = found;
+ }
+
+ return false;
+}
+
+
+bool ShellBrowser::select_folder(Entry* entry, bool expand)
+{
+ CONTEXT("ShellBrowser::expand_folder()");
+
+ if (!_last_sel)
+ return false;
+
+ if (!TreeView_Expand(_left_hwnd, _last_sel, TVE_EXPAND))
+ return false;
+
+ for(HTREEITEM hitem=TreeView_GetChild(_left_hwnd,_last_sel); hitem; hitem=TreeView_GetNextSibling(_left_hwnd,hitem)) {
+ if ((ShellDirectory*)TreeView_GetItemData(_left_hwnd,hitem) == entry) {
+ if (TreeView_SelectItem(_left_hwnd, hitem)) {
+ if (expand)
+ if (!TreeView_Expand(_left_hwnd, hitem, TVE_EXPAND))
+ return false;
+
+ return true;
+ }
+
+ break;
+ }
+ }
+
+ return false;
+}
+
+
+#ifndef _NO_MDI
+
+MDIShellBrowserChild::MDIShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info)
+ : super(hwnd, info),
+ _create_info(info),
+ _shellpath_info(info) //@@ copies info -> no reference to _create_info !
+{
+/**todo Conversion of shell path into path string -> store into URL history
+ const String& path = GetDesktopFolder().get_name(info._shell_path, SHGDN_FORADDRESSBAR);
+ const String& parsingpath = GetDesktopFolder().get_name(info._shell_path, SHGDN_FORPARSING);
+
+ // store path into history
+ if (info._path && *info._path)
+ _url_history.push(info._path);
+*/
+}
+
+
+MDIShellBrowserChild* MDIShellBrowserChild::create(const ShellChildWndInfo& info)
+{
+ ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition,
+ WINDOW_CREATOR_INFO(MDIShellBrowserChild,ShellChildWndInfo), CLASSNAME_CHILDWND, NULL, info._pos.showCmd==SW_SHOWMAXIMIZED? WS_MAXIMIZE: 0);
+
+ return static_cast<MDIShellBrowserChild*>(child);
+}
+
+
+LRESULT MDIShellBrowserChild::Init(LPCREATESTRUCT pcs)
+{
+ CONTEXT("MDIShellBrowserChild::Init()");
+
+ if (super::Init(pcs))
+ return 1;
+
+ update_shell_browser();
+
+ return 0;
+}
+
+
+LRESULT MDIShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case PM_DISPATCH_COMMAND: {
+ switch(LOWORD(wparam)) {
+ case ID_WINDOW_NEW: {CONTEXT("MDIShellBrowserChild PM_DISPATCH_COMMAND ID_WINDOW_NEW");
+ MDIShellBrowserChild::create(_create_info);
+ break;}
+
+ case ID_REFRESH:
+ //@todo refresh shell child
+ _shellBrowser->invalidate_cache();
+ break;
+
+ case ID_VIEW_SDI:
+ MainFrameBase::Create(ExplorerCmd(_url, false));
+ break;
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+ return TRUE;}
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+void MDIShellBrowserChild::update_shell_browser()
+{
+ int split_pos = DEFAULT_SPLIT_POS;
+
+ if (_shellBrowser.get()) {
+ split_pos = _split_pos;
+ delete _shellBrowser.release();
+ }
+
+ // create explorer treeview
+ if (_create_info._open_mode & OWM_EXPLORE) {
+ if (!_left_hwnd) {
+ ClientRect rect(_hwnd);
+
+ _left_hwnd = CreateWindowEx(0, WC_TREEVIEW, NULL,
+ WS_CHILD|WS_TABSTOP|WS_VISIBLE|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_SHOWSELALWAYS,//|TVS_NOTOOLTIPS
+ 0, rect.top, split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top,
+ _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0);
+ }
+ } else {
+ if (_left_hwnd) {
+ DestroyWindow(_left_hwnd);
+ _left_hwnd = 0;
+ }
+ }
+
+ _shellBrowser = auto_ptr<ShellBrowser>(new ShellBrowser(_hwnd, _hwndFrame, _left_hwnd, _right_hwnd,
+ _shellpath_info, this, _cm_ifs));
+
+ _shellBrowser->Init();
+}
+
+
+String MDIShellBrowserChild::jump_to_int(LPCTSTR url)
+{
+ String dir, fname;
+
+ if (!_tcsnicmp(url, TEXT("shell://"), 8)) {
+ if (_shellBrowser->jump_to_pidl(ShellPath(url+8)))
+ return url;
+ }
+
+ if (SplitFileSysURL(url, dir, fname)) {
+
+ ///@todo use fname
+
+ if (_shellBrowser->jump_to_pidl(ShellPath(dir)))
+ return FmtString(TEXT("file://%s"), (LPCTSTR)dir);
+ }
+
+ return String();
+}
+
+
+void MDIShellBrowserChild::entry_selected(Entry* entry)
+{
+ if (_left_hwnd)
+ _shellBrowser->select_folder(entry, false);
+
+ _shellBrowser->UpdateFolderView(entry->get_shell_folder());
+
+ // set size of new created shell view windows
+ ClientRect rt(_hwnd);
+ resize_children(rt.right, rt.bottom);
+
+ // set new URL
+ TCHAR path[MAX_PATH];
+
+ if (entry->get_path(path, COUNTOF(path))) {
+ String url;
+
+ if (path[0] == ':')
+ url.printf(TEXT("shell://%s"), path);
+ else
+ url.printf(TEXT("file://%s"), path);
+
+ set_url(url);
+ }
+}
+
+#endif
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // shellbrowser.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+#include "../utility/treedroptarget.h"
+#include "../utility/shellbrowserimpl.h"
+
+
+ /// information structure to hold current shell folder information
+struct ShellPathInfo
+{
+ ShellPathInfo(int mode=0) : _open_mode(mode) {}
+
+ ShellPathInfo(const ShellChildWndInfo& info)
+ : _shell_path(info._shell_path),
+ _root_shell_path(info._root_shell_path),
+ _open_mode(info._open_mode)
+ {
+ }
+
+ ShellPath _shell_path;
+ ShellPath _root_shell_path;
+
+ int _open_mode; //OPEN_WINDOW_MODE
+};
+
+
+struct BrowserCallback
+{
+ virtual ~BrowserCallback() {}
+ virtual void entry_selected(Entry* entry) = 0;
+};
+
+
+ /// Implementation of IShellBrowserImpl interface in explorer child windows
+struct ShellBrowser : public IShellBrowserImpl
+#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
+ , public IComSrvBase<IShellFolderViewCB, ShellBrowser>, public SimpleComObject
+#endif
+{
+ ShellBrowser(HWND hwnd, HWND hwndFrame, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info,
+ BrowserCallback* cb, CtxMenuInterfaces& cm_ifs);
+ virtual ~ShellBrowser();
+
+ //IOleWindow
+ virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND* lphwnd)
+ {
+ *lphwnd = _hwnd;
+ return S_OK;
+ }
+
+ //IShellBrowser
+ virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(IShellView** ppshv)
+ {
+ _pShellView->AddRef();
+ *ppshv = _pShellView;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetControlWindow(UINT id, HWND* lphwnd)
+ {
+ if (!lphwnd)
+ return E_POINTER;
+
+ if (id == FCW_TREE) {
+ *lphwnd = _left_hwnd;
+ return S_OK;
+ }
+
+ HWND hwnd = (HWND)SendMessage(_hwndFrame, PM_GET_CONTROLWINDOW, id, 0);
+
+ if (hwnd) {
+ *lphwnd = hwnd;
+ return S_OK;
+ }
+
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pret)
+ {
+ if (!pret)
+ return E_POINTER;
+
+ HWND hstatusbar = (HWND)SendMessage(_hwndFrame, PM_GET_CONTROLWINDOW, id, 0);
+
+ if (hstatusbar) {
+ *pret = ::SendMessage(hstatusbar, uMsg, wParam, lParam);
+ return S_OK;
+ }
+
+ return E_NOTIMPL;
+ }
+
+ const Root& get_root() const {return _root;}
+
+ void OnTreeGetDispInfo(int idCtrl, LPNMHDR pnmh);
+ void OnTreeItemExpanding(int idCtrl, LPNMTREEVIEW pnmtv);
+ void OnTreeItemRClick(int idCtrl, LPNMHDR pnmh);
+ void OnTreeItemSelected(int idCtrl, LPNMTREEVIEW pnmtv);
+
+ void Init();
+
+ int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder);
+
+ bool jump_to_pidl(LPCITEMIDLIST pidl);
+
+ HRESULT OnDefaultCommand(LPIDA pida);
+
+ void UpdateFolderView(IShellFolder* folder);
+ HTREEITEM select_entry(HTREEITEM hitem, Entry* entry, bool expand=true);
+
+ bool select_folder(Entry* entry, bool expand);
+
+ // for SDIMainFrame
+ void jump_to(LPCITEMIDLIST pidl);
+
+ void invalidate_cache();
+
+protected:
+ HWND _hwnd;
+ HWND _hwndFrame;
+ HWND _left_hwnd;
+ WindowHandle& _right_hwnd;
+ ShellPathInfo& _create_info;
+ HIMAGELIST _himl;
+ HIMAGELIST _himl_old;
+ BrowserCallback* _callback;
+
+ ShellFolder _folder;
+
+ IShellView* _pShellView; // current hosted shellview
+ TreeDropTarget* _pDropTarget;
+
+ HTREEITEM _last_sel;
+
+ Root _root;
+ ShellDirectory* _cur_dir;
+
+ CtxMenuInterfaces& _cm_ifs;
+
+ void InitializeTree();
+ bool InitDragDrop();
+
+#ifndef __MINGW32__ // IShellFolderViewCB missing in MinGW (as of 25.09.2005)
+ typedef IComSrvBase<IShellFolderViewCB, ShellBrowser> super;
+
+ // IShellFolderViewCB
+ virtual HRESULT STDMETHODCALLTYPE MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam);
+#endif
+
+ map<int, int> _image_map;
+
+ int get_image_idx(int icon_id);
+};
+
+
+#define C_DRIVE_STR TEXT("C:\\")
+
+ // work around GCC's wide string constant bug
+#ifdef __GNUC__
+extern const LPCTSTR C_DRIVE;
+#else
+#define C_DRIVE C_DRIVE_STR
+#endif
+
+template<typename BASE> struct ShellBrowserChildT
+ : public BASE, public BrowserCallback
+{
+ typedef BASE super;
+
+ // constructor for SDIMainFrame
+ ShellBrowserChildT(HWND hwnd)
+ : super(hwnd)
+ {
+ }
+
+ // constructor for MDIShellBrowserChild
+ ShellBrowserChildT(HWND hwnd, const ShellChildWndInfo& info)
+ : super(hwnd, info)
+ {
+ }
+
+protected:
+ auto_ptr<ShellBrowser> _shellBrowser;
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+ {
+ switch(nmsg) {
+ case PM_GET_SHELLBROWSER_PTR:
+ return (LRESULT)&*_shellBrowser;
+
+ case WM_GETISHELLBROWSER: // for Registry Explorer Plugin
+ return (LRESULT)static_cast<IShellBrowser*>(&*_shellBrowser);
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+ }
+
+ int Notify(int id, NMHDR* pnmh)
+ {
+ if (_shellBrowser.get())
+ switch(pnmh->code) {
+ case TVN_GETDISPINFO: _shellBrowser->OnTreeGetDispInfo(id, pnmh); break;
+ case TVN_SELCHANGED: _shellBrowser->OnTreeItemSelected(id, (LPNMTREEVIEW)pnmh); break;
+ case TVN_ITEMEXPANDING: _shellBrowser->OnTreeItemExpanding(id, (LPNMTREEVIEW)pnmh); break;
+ case NM_RCLICK: _shellBrowser->OnTreeItemRClick(id, pnmh); break;
+ default: return super::Notify(id, pnmh);
+ }
+ else
+ return super::Notify(id, pnmh);
+
+ return 0;
+ }
+};
+
+
+#ifndef _NO_MDI
+
+struct MDIShellBrowserChild : public ExtContextMenuHandlerT<
+ ShellBrowserChildT<ChildWindow>
+ >
+{
+ typedef ExtContextMenuHandlerT<
+ ShellBrowserChildT<ChildWindow>
+ > super;
+
+ MDIShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info);
+
+ static MDIShellBrowserChild* create(const ShellChildWndInfo& info);
+
+ LRESULT Init(LPCREATESTRUCT);
+
+ virtual String jump_to_int(LPCTSTR url);
+
+protected:
+ ShellChildWndInfo _create_info;
+ ShellPathInfo _shellpath_info;
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ void update_shell_browser();
+
+ // interface BrowserCallback
+ virtual void entry_selected(Entry* entry);
+};
+
+#endif
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005, 2006 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // shellfs.cpp
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#include <precomp.h>
+
+//#include "shellfs.h"
+//#include "winfs.h"
+
+#include <shlwapi.h>
+
+
+bool ShellDirectory::fill_w32fdata_shell(LPCITEMIDLIST pidl, SFGAOF attribs, WIN32_FIND_DATA* pw32fdata, BY_HANDLE_FILE_INFORMATION* pbhfi, bool do_access)
+{
+ CONTEXT("ShellDirectory::fill_w32fdata_shell()");
+
+ bool bhfi_valid = false;
+
+ if (do_access && !( (attribs&SFGAO_FILESYSTEM) && SUCCEEDED(
+ SHGetDataFromIDList(_folder, pidl, SHGDFIL_FINDDATA, pw32fdata, sizeof(WIN32_FIND_DATA))) )) {
+ WIN32_FILE_ATTRIBUTE_DATA fad;
+ IDataObject* pDataObj;
+
+ STGMEDIUM medium = {0, {0}, 0};
+ FORMATETC fmt = {g_Globals._cfStrFName, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
+
+ HRESULT hr = _folder->GetUIObjectOf(0, 1, &pidl, IID_IDataObject, 0, (LPVOID*)&pDataObj);
+
+ if (SUCCEEDED(hr)) {
+ hr = pDataObj->GetData(&fmt, &medium);
+
+ pDataObj->Release();
+
+ if (SUCCEEDED(hr)) {
+ LPCTSTR path = (LPCTSTR)GlobalLock(medium.UNION_MEMBER(hGlobal));
+
+ if (path) {
+ // fill with drive names "C:", ...
+ assert(_tcslen(path) < GlobalSize(medium.UNION_MEMBER(hGlobal)));
+ _tcscpy(pw32fdata->cFileName, path);
+
+ UINT sem_org = SetErrorMode(SEM_FAILCRITICALERRORS);
+
+ if (GetFileAttributesEx(path, GetFileExInfoStandard, &fad)) {
+ pw32fdata->dwFileAttributes = fad.dwFileAttributes;
+ pw32fdata->ftCreationTime = fad.ftCreationTime;
+ pw32fdata->ftLastAccessTime = fad.ftLastAccessTime;
+ pw32fdata->ftLastWriteTime = fad.ftLastWriteTime;
+
+ if (!(fad.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
+ // copy file size
+ pw32fdata->nFileSizeLow = fad.nFileSizeLow;
+ pw32fdata->nFileSizeHigh = fad.nFileSizeHigh;
+ } else {
+ // ignore FILE_ATTRIBUTE_HIDDEN attribute of NTFS drives - this would hide those drives in ShellBrowser
+ if (pw32fdata->dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) {
+ if (path[1]==':' && path[2]=='\\' && !path[3]) // Is it a drive path?
+ pw32fdata->dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
+ }
+ }
+ }
+
+ HANDLE hFile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+ 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
+
+ if (hFile != INVALID_HANDLE_VALUE) {
+ if (GetFileInformationByHandle(hFile, pbhfi))
+ bhfi_valid = true;
+
+ CloseHandle(hFile);
+ }
+
+ SetErrorMode(sem_org);
+
+ GlobalUnlock(medium.UNION_MEMBER(hGlobal));
+ GlobalFree(medium.UNION_MEMBER(hGlobal));
+ }
+ }
+ }
+ }
+
+ if (!do_access || !(attribs&SFGAO_FILESYSTEM)) // Archiv files should not be displayed as folders in explorer view.
+ if (attribs & (SFGAO_FOLDER|SFGAO_HASSUBFOLDER))
+ pw32fdata->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+
+ if (attribs & SFGAO_READONLY)
+ pw32fdata->dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
+
+ if (attribs & SFGAO_COMPRESSED)
+ pw32fdata->dwFileAttributes |= FILE_ATTRIBUTE_COMPRESSED;
+
+ return bhfi_valid;
+}
+
+
+ShellPath ShellEntry::create_absolute_pidl() const
+{
+ CONTEXT("ShellEntry::create_absolute_pidl()");
+
+ if (_up)
+ if (_up->_etype == ET_SHELL) {
+ ShellDirectory* dir = static_cast<ShellDirectory*>(_up);
+
+ if (dir->_pidl->mkid.cb) // Caching of absolute PIDLs could enhance performance.
+ return _pidl.create_absolute_pidl(dir->create_absolute_pidl());
+ } else
+ return _pidl.create_absolute_pidl(_up->create_absolute_pidl());
+
+ return _pidl;
+}
+
+
+ // get full path of a shell entry
+bool ShellEntry::get_path(PTSTR path, size_t path_count) const
+{
+ if (!path || path_count==0)
+ return false;
+/*
+ path[0] = TEXT('\0');
+
+ if (FAILED(path_from_pidl(get_parent_folder(), &*_pidl, path, path_count)))
+ return false;
+*/
+ FileSysShellPath fs_path(create_absolute_pidl());
+ LPCTSTR ret = fs_path;
+
+ if (ret) {
+ lstrcpyn(path, ret, path_count);
+ return true;
+ } else
+ return false;
+}
+
+
+ // get full path of a shell folder
+bool ShellDirectory::get_path(PTSTR path, size_t path_count) const
+{
+ CONTEXT("ShellDirectory::get_path()");
+
+ if (!path || path_count==0)
+ return false;
+
+ path[0] = TEXT('\0');
+
+ if (_folder.empty())
+ return false;
+
+ SFGAOF attribs = SFGAO_FILESYSTEM;
+
+ if (FAILED(const_cast<ShellFolder&>(_folder)->GetAttributesOf(1, (LPCITEMIDLIST*)&_pidl, &attribs)))
+ return false;
+
+ if (!(attribs & SFGAO_FILESYSTEM))
+ return false;
+
+ if (FAILED(path_from_pidl(get_parent_folder(), &*_pidl, path, path_count)))
+ return false;
+
+ return true;
+}
+
+
+BOOL ShellEntry::launch_entry(HWND hwnd, UINT nCmdShow)
+{
+ CONTEXT("ShellEntry::launch_entry()");
+
+ SHELLEXECUTEINFO shexinfo;
+
+ shexinfo.cbSize = sizeof(SHELLEXECUTEINFO);
+ shexinfo.fMask = SEE_MASK_INVOKEIDLIST; // SEE_MASK_IDLIST is also possible.
+ shexinfo.hwnd = hwnd;
+ shexinfo.lpVerb = NULL;
+ shexinfo.lpFile = NULL;
+ shexinfo.lpParameters = NULL;
+ shexinfo.lpDirectory = NULL;
+ shexinfo.nShow = nCmdShow;
+
+ ShellPath shell_path = create_absolute_pidl();
+ shexinfo.lpIDList = &*shell_path;
+
+ // add PIDL to the recent file list
+ SHAddToRecentDocs(SHARD_PIDL, shexinfo.lpIDList);
+
+ BOOL ret = TRUE;
+
+ if (!ShellExecuteEx(&shexinfo)) {
+ display_error(hwnd, GetLastError());
+ ret = FALSE;
+ }
+
+ return ret;
+}
+
+
+HRESULT ShellEntry::do_context_menu(HWND hwnd, LPPOINT pptScreen, CtxMenuInterfaces& cm_ifs)
+{
+ ShellDirectory* dir = static_cast<ShellDirectory*>(_up);
+
+ ShellFolder folder = dir? dir->_folder: GetDesktopFolder();
+ LPCITEMIDLIST pidl = _pidl;
+
+ return ShellFolderContextMenu(folder, hwnd, 1, &pidl, pptScreen->x, pptScreen->y, cm_ifs);
+}
+
+
+HRESULT ShellEntry::GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut)
+{
+ LPCITEMIDLIST pidl = _pidl;
+
+ return get_parent_folder()->GetUIObjectOf(hWnd, 1, &pidl, riid, NULL, ppvOut);
+}
+
+
+ShellFolder Entry::get_shell_folder() const
+{
+ return ShellFolder(create_absolute_pidl());
+}
+
+ShellFolder ShellEntry::get_shell_folder() const
+{
+ return get_parent_folder();
+}
+
+ShellFolder ShellDirectory::get_shell_folder() const
+{
+ return _folder;
+}
+
+
+void ShellDirectory::read_directory(int scan_flags)
+{
+ CONTEXT("ShellDirectory::read_directory()");
+
+ int level = _level + 1;
+
+ Entry* first_entry = NULL;
+ Entry* last = NULL;
+
+ /*if (_folder.empty())
+ return;*/
+
+#ifndef _NO_WIN_FS
+ TCHAR buffer[_MAX_PATH+_MAX_FNAME];
+
+ if (!(scan_flags&SCAN_NO_FILESYSTEM) && get_path(buffer, COUNTOF(buffer)) && _tcsncmp(buffer,TEXT("::{"),3)) {
+ Entry* entry = NULL; // eliminate useless GCC warning by initializing entry
+
+ LPTSTR p = buffer + _tcslen(buffer);
+
+ lstrcpy(p, TEXT("\\*"));
+
+ WIN32_FIND_DATA w32fd;
+ HANDLE hFind = FindFirstFile(buffer, &w32fd);
+
+ if (hFind != INVALID_HANDLE_VALUE) {
+ do {
+ // ignore hidden files (usefull in the start menu)
+ if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
+ continue;
+
+ // ignore directory entries "." and ".."
+ if ((w32fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) &&
+ w32fd.cFileName[0]==TEXT('.') &&
+ (w32fd.cFileName[1]==TEXT('\0') ||
+ (w32fd.cFileName[1]==TEXT('.') && w32fd.cFileName[2]==TEXT('\0'))))
+ continue;
+
+ lstrcpy(p+1, w32fd.cFileName);
+
+ if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ entry = new WinDirectory(this, buffer);
+ else
+ entry = new WinEntry(this);
+
+ if (!first_entry)
+ first_entry = entry;
+
+ if (last)
+ last->_next = entry;
+
+ memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA));
+
+ entry->_level = level;
+
+ if (!(scan_flags & SCAN_DONT_ACCESS)) {
+ HANDLE hFile = CreateFile(buffer, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+ 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
+
+ if (hFile != INVALID_HANDLE_VALUE) {
+ if (GetFileInformationByHandle(hFile, &entry->_bhfi))
+ entry->_bhfi_valid = true;
+
+ if (ScanNTFSStreams(entry, hFile))
+ entry->_scanned = true; // There exist named NTFS sub-streams in this file.
+
+ CloseHandle(hFile);
+ }
+ }
+
+ // set file type name
+ LPCTSTR ext = g_Globals._ftype_mgr.set_type(entry);
+
+ DWORD attribs = SFGAO_FILESYSTEM;
+
+ if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ attribs |= SFGAO_FOLDER|SFGAO_HASSUBFOLDER;
+
+ if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
+ attribs |= SFGAO_READONLY;
+
+ //if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
+ // attribs |= SFGAO_HIDDEN;
+
+ if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED)
+ attribs |= SFGAO_COMPRESSED;
+
+ if (ext && !_tcsicmp(ext, _T(".lnk"))) {
+ attribs |= SFGAO_LINK;
+ w32fd.dwFileAttributes |= ATTRIBUTE_SYMBOLIC_LINK;
+ }
+
+ entry->_shell_attribs = attribs;
+
+ if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ entry->_icon_id = ICID_FOLDER;
+ else if (!(scan_flags & SCAN_DONT_EXTRACT_ICONS))
+ entry->_icon_id = entry->safe_extract_icon(); // Assume small icon, we can extract the large icon later on demand.
+
+ last = entry;
+ } while(FindNextFile(hFind, &w32fd));
+
+ FindClose(hFind);
+ }
+ }
+ else // SCAN_NO_FILESYSTEM
+#endif
+ {
+ ShellItemEnumerator enumerator(_folder, SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN|SHCONTF_SHAREABLE|SHCONTF_STORAGE);
+
+ TCHAR name[MAX_PATH];
+ TCHAR path[MAX_PATH];
+ HRESULT hr_next = S_OK;
+
+ do {
+#define FETCH_ITEM_COUNT 32
+ LPITEMIDLIST pidls[FETCH_ITEM_COUNT];
+ ULONG cnt = 0;
+
+ memset(pidls, 0, sizeof(pidls));
+
+ hr_next = enumerator->Next(FETCH_ITEM_COUNT, pidls, &cnt);
+
+ /* don't break yet now: Registry Explorer Plugin returns E_FAIL!
+ if (!SUCCEEDED(hr_next))
+ break; */
+
+ if (hr_next == S_FALSE)
+ break;
+
+ for(ULONG n=0; n<cnt; ++n) {
+ WIN32_FIND_DATA w32fd;
+ BY_HANDLE_FILE_INFORMATION bhfi;
+ bool bhfi_valid = false;
+
+ memset(&w32fd, 0, sizeof(WIN32_FIND_DATA));
+
+ SFGAOF attribs_before = ~SFGAO_READONLY & ~SFGAO_VALIDATE;
+ SFGAOF attribs = attribs_before;
+ HRESULT hr = _folder->GetAttributesOf(1, (LPCITEMIDLIST*)&pidls[n], &attribs);
+ bool removeable = false;
+
+ if (SUCCEEDED(hr) && attribs!=attribs_before) {
+ // avoid accessing floppy drives when browsing "My Computer"
+ if (attribs & SFGAO_REMOVABLE) {
+ attribs |= SFGAO_HASSUBFOLDER;
+ removeable = true;
+ } else if (!(scan_flags & SCAN_DONT_ACCESS)) {
+ DWORD attribs2 = SFGAO_READONLY;
+
+ HRESULT hr = _folder->GetAttributesOf(1, (LPCITEMIDLIST*)&pidls[n], &attribs2);
+
+ if (SUCCEEDED(hr))
+ attribs |= attribs2;
+ }
+ } else
+ attribs = 0;
+
+ bhfi_valid = fill_w32fdata_shell(pidls[n], attribs, &w32fd, &bhfi,
+ !(scan_flags&SCAN_DONT_ACCESS) && !removeable);
+
+ try {
+ Entry* entry = NULL; // eliminate useless GCC warning by initializing entry
+
+ if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ entry = new ShellDirectory(this, pidls[n], _hwnd);
+ else
+ entry = new ShellEntry(this, pidls[n]);
+
+ if (!first_entry)
+ first_entry = entry;
+
+ if (last)
+ last->_next = entry;
+
+ memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA));
+
+ if (bhfi_valid)
+ memcpy(&entry->_bhfi, &bhfi, sizeof(BY_HANDLE_FILE_INFORMATION));
+
+ // store path in entry->_data.cFileName in case fill_w32fdata_shell() didn't already fill it
+ if (!entry->_data.cFileName[0])
+ if (SUCCEEDED(path_from_pidl(_folder, pidls[n], path, COUNTOF(path))))
+ _tcscpy(entry->_data.cFileName, path);
+
+ if (SUCCEEDED(name_from_pidl(_folder, pidls[n], name, COUNTOF(name), SHGDN_INFOLDER|0x2000/*0x2000=SHGDN_INCLUDE_NONFILESYS*/))) {
+ if (!entry->_data.cFileName[0])
+ _tcscpy(entry->_data.cFileName, name);
+ else if (_tcscmp(entry->_display_name, name))
+ entry->_display_name = _tcsdup(name); // store display name separate from file name; sort display by file name
+ }
+
+ if (attribs & SFGAO_LINK)
+ w32fd.dwFileAttributes |= ATTRIBUTE_SYMBOLIC_LINK;
+
+ entry->_level = level;
+ entry->_shell_attribs = attribs;
+ entry->_bhfi_valid = bhfi_valid;
+
+ // set file type name
+ g_Globals._ftype_mgr.set_type(entry);
+
+ // get icons for files and virtual objects
+ if (!(entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
+ !(attribs & SFGAO_FILESYSTEM)) {
+ if (!(scan_flags & SCAN_DONT_EXTRACT_ICONS))
+ entry->_icon_id = entry->safe_extract_icon(); // Assume small icon, we can extract the large icon later on demand.
+ } else if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ entry->_icon_id = ICID_FOLDER;
+ else
+ entry->_icon_id = ICID_NONE; // don't try again later
+
+ last = entry;
+ } catch(COMException& e) {
+ HandleException(e, _hwnd);
+ }
+ }
+ } while(SUCCEEDED(hr_next));
+ }
+
+ if (last)
+ last->_next = NULL;
+
+ _down = first_entry;
+ _scanned = true;
+}
+
+const void* ShellDirectory::get_next_path_component(const void* p) const
+{
+ LPITEMIDLIST pidl = (LPITEMIDLIST)p;
+
+ if (!pidl || !pidl->mkid.cb)
+ return NULL;
+
+ // go to next element
+ pidl = (LPITEMIDLIST)((LPBYTE)pidl+pidl->mkid.cb);
+
+ return pidl;
+}
+
+Entry* ShellDirectory::find_entry(const void* p)
+{
+ LPITEMIDLIST pidl = (LPITEMIDLIST) p;
+
+ // handle special case of empty trailing id list entry
+ if (!pidl->mkid.cb)
+ return this;
+
+ for(Entry*entry=_down; entry; entry=entry->_next)
+ if (entry->_etype == ET_SHELL) {
+ ShellEntry* se = static_cast<ShellEntry*>(entry);
+
+ if (se->_pidl && se->_pidl->mkid.cb==pidl->mkid.cb && !memcmp(se->_pidl, pidl, se->_pidl->mkid.cb))
+ return entry;
+ } else {
+ const ShellPath& sp = entry->create_absolute_pidl();
+ static DynamicFct<LPITEMIDLIST(WINAPI*)(LPCITEMIDLIST)> ILFindLastID(TEXT("SHELL32"), "ILFindLastID");
+
+ if (ILFindLastID) {
+ LPCITEMIDLIST entry_pidl = (*ILFindLastID)(sp);
+
+ if (entry_pidl && entry_pidl->mkid.cb==pidl->mkid.cb && !memcmp(entry_pidl, pidl, entry_pidl->mkid.cb))
+ return entry;
+ }
+ }
+
+ return NULL;
+}
+
+int ShellDirectory::extract_icons(ICONCACHE_FLAGS flags)
+{
+ int cnt = 0;
+
+ for(Entry*entry=_down; entry; entry=entry->_next)
+ if (entry->_icon_id == ICID_UNKNOWN) {
+ entry->_icon_id = entry->extract_icon(flags);
+
+ if (entry->_icon_id != ICID_NONE)
+ ++cnt;
+ }
+
+ return cnt;
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // shellfs.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+ /// shell file/directory entry
+struct ShellEntry : public Entry
+{
+ ShellEntry(Entry* parent, LPITEMIDLIST shell_path) : Entry(parent, ET_SHELL), _pidl(shell_path) {}
+ ShellEntry(Entry* parent, const ShellPath& shell_path) : Entry(parent, ET_SHELL), _pidl(shell_path) {}
+
+ virtual bool get_path(PTSTR path, size_t path_count) const;
+ virtual ShellPath create_absolute_pidl() const;
+ virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut);
+ virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL);
+ virtual HRESULT do_context_menu(HWND hwnd, LPPOINT pptScreen, CtxMenuInterfaces& cm_ifs);
+ virtual ShellFolder get_shell_folder() const;
+
+ IShellFolder* get_parent_folder() const;
+
+ ShellPath _pidl; // parent relative PIDL
+
+protected:
+ ShellEntry(LPITEMIDLIST shell_path) : Entry(ET_SHELL), _pidl(shell_path) {}
+ ShellEntry(const ShellPath& shell_path) : Entry(ET_SHELL), _pidl(shell_path) {}
+};
+
+
+ /// shell folder entry
+struct ShellDirectory : public ShellEntry, public Directory
+{
+ ShellDirectory(ShellFolder& root_folder, const ShellPath& shell_path, HWND hwnd)
+ : ShellEntry(shell_path),
+ _folder(root_folder, shell_path),
+ _hwnd(hwnd)
+ {
+ CONTEXT("ShellDirectory::ShellDirectory()");
+
+ lstrcpy(_data.cFileName, root_folder.get_name(shell_path, SHGDN_FORADDRESSBAR));
+ _data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
+ _shell_attribs = SFGAO_FOLDER;
+
+ ShellFolder subfolder(root_folder, shell_path);
+ IShellFolder* pFolder = subfolder;
+ pFolder->AddRef();
+ _path = pFolder;
+ }
+
+ explicit ShellDirectory(ShellDirectory* parent, LPITEMIDLIST shell_path, HWND hwnd)
+ : ShellEntry(parent, shell_path),
+ _folder(parent->_folder, shell_path),
+ _hwnd(hwnd)
+ {
+ /* not neccessary - the caller will fill the info
+ lstrcpy(_data.cFileName, _folder.get_name(shell_path));
+ _data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
+ _shell_attribs = SFGAO_FOLDER; */
+
+ _folder->AddRef();
+ _path = _folder;
+ }
+
+ ShellDirectory(const ShellDirectory& other)
+ : ShellEntry(other),
+ Directory(other),
+ _folder(other._folder),
+ _hwnd(other._hwnd)
+ {
+ IShellFolder* pFolder = (IShellFolder*)_path;
+ pFolder->AddRef();
+ }
+
+ ~ShellDirectory()
+ {
+ IShellFolder* pFolder = (IShellFolder*)_path;
+ _path = NULL;
+ pFolder->Release();
+ }
+
+ virtual void read_directory(int scan_flags=0);
+ virtual const void* get_next_path_component(const void*) const;
+ virtual Entry* find_entry(const void*);
+
+ virtual bool get_path(PTSTR path, size_t path_count) const;
+ virtual ShellFolder get_shell_folder() const;
+
+ int extract_icons(ICONCACHE_FLAGS flags);
+
+ ShellFolder _folder;
+ HWND _hwnd;
+
+protected:
+ bool fill_w32fdata_shell(LPCITEMIDLIST pidl, SFGAOF attribs, WIN32_FIND_DATA*, BY_HANDLE_FILE_INFORMATION*, bool do_access=true);
+};
+
+
+inline IShellFolder* ShellEntry::get_parent_folder() const
+{
+ if (_up)
+ return static_cast<ShellDirectory*>(_up)->_folder;
+ else
+ return GetDesktopFolder();
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // unixfs.cpp
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#ifdef __WINE__
+
+#include <precomp.h>
+
+//#include "unixfs.h"
+
+ // for UnixDirectory::read_directory()
+#include <dirent.h>
+#include <sys/stat.h>
+#include <time.h>
+
+
+void UnixDirectory::read_directory()
+{
+ Entry* first_entry = NULL;
+ Entry* last = NULL;
+ Entry* entry;
+
+ int level = _level + 1;
+
+ LPCTSTR path = (LPCTSTR)_path;
+ DIR* pdir = opendir(path);
+
+ if (pdir) {
+ struct stat st;
+ struct dirent* ent;
+ TCHAR buffer[MAX_PATH], *p;
+
+ for(p=buffer; *path; )
+ *p++ = *path++;
+
+ if (p==buffer || p[-1]!='/')
+ *p++ = '/';
+
+ while((ent=readdir(pdir))) {
+ int statres = stat(buffer, &st);
+
+ if (!statres && S_ISDIR(st.st_mode))
+ entry = new UnixDirectory(this, buffer);
+ else
+ entry = new UnixEntry(this);
+
+ if (!first_entry)
+ first_entry = entry;
+
+ if (last)
+ last->_next = entry;
+
+ lstrcpy(entry->_data.cFileName, ent->d_name);
+ entry->_data.dwFileAttributes = ent->d_name[0]=='.'? FILE_ATTRIBUTE_HIDDEN: 0;
+
+ strcpy(p, ent->d_name);
+
+ if (!statres) {
+ if (S_ISDIR(st.st_mode))
+ entry->_data.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
+
+ entry->_data.nFileSizeLow = st.st_size & 0xFFFFFFFF;
+ entry->_data.nFileSizeHigh = st.st_size >> 32;
+
+ memset(&entry->_data.ftCreationTime, 0, sizeof(FILETIME));
+ time_to_filetime(&st.st_atime, &entry->_data.ftLastAccessTime);
+ time_to_filetime(&st.st_mtime, &entry->_data.ftLastWriteTime);
+
+ entry->_bhfi.nFileIndexLow = ent->d_ino;
+ entry->_bhfi.nFileIndexHigh = 0;
+
+ entry->_bhfi.nNumberOfLinks = st.st_nlink;
+
+ entry->_bhfi_valid = TRUE;
+ } else {
+ entry->_data.nFileSizeLow = 0;
+ entry->_data.nFileSizeHigh = 0;
+ entry->_bhfi_valid = FALSE;
+ }
+
+ entry->_up = this;
+ entry->_expanded = FALSE;
+ entry->_scanned = FALSE;
+ entry->_level = level;
+
+ last = entry;
+ }
+
+ last->_next = NULL;
+
+ closedir(pdir);
+ }
+
+ _down = first_entry;
+ _scanned = true;
+}
+
+
+const void* UnixDirectory::get_next_path_component(const void* p)
+{
+ LPCTSTR s = (LPCTSTR) p;
+
+ while(*s && *s!=TEXT('/'))
+ ++s;
+
+ while(*s == TEXT('/'))
+ ++s;
+
+ if (!*s)
+ return NULL;
+
+ return s;
+}
+
+
+Entry* UnixDirectory::find_entry(const void* p)
+{
+ LPCTSTR name = (LPCTSTR)p;
+
+ for(Entry*entry=_down; entry; entry=entry->_next) {
+ LPCTSTR p = name;
+ LPCTSTR q = entry->_data.cFileName;
+
+ do {
+ if (!*p || *p==TEXT('/'))
+ return entry;
+ } while(*p++ == *q++);
+ }
+
+ return NULL;
+}
+
+
+ // get full path of specified directory entry
+bool UnixEntry::get_path(PTSTR path, size_t path_count) const
+{
+ int level = 0;
+ size_t len = 0;
+
+ if (!path || path_count==0)
+ return false;
+
+ if ( path_count > 1 )
+ {
+ for(const Entry* entry=this; entry; level++) {
+ LPCTSTR name = entry->_data.cFileName;
+ size_t l = 0;
+
+ for(LPCTSTR s=name; *s && *s!=TEXT('/'); s++)
+ ++l;
+
+ if (entry->_up) {
+ if (l > 0) {
+ if ( len+l+1 >= path_count )
+ {
+ /* compare to 2 here because of terminator plus the '\\' we prepend */
+ if ( l + 2 > path_count )
+ len = 0;
+ else
+ len = path_count - l - 2;
+ }
+ memmove(path+l+1, path, len*sizeof(TCHAR));
+ /* compare to 2 here because of terminator plus the '\\' we prepend */
+ if ( l+2 >= path_count )
+ l = path_count - 2;
+ memcpy(path+1, name, l*sizeof(TCHAR));
+ len += l+1;
+
+ path[0] = TEXT('/');
+ }
+
+ entry = entry->_up;
+ } else {
+ if ( len+l >= path_count )
+ {
+ if ( l + 1 > path_count )
+ len = 0;
+ else
+ len = path_count - l - 1;
+ }
+ memmove(path+l, path, len*sizeof(TCHAR));
+ if ( l+1 >= path_count )
+ l = path_count - 1;
+ memcpy(path, name, l*sizeof(TCHAR));
+ len += l;
+ break;
+ }
+ }
+
+ if ( !level && (len+1 < path_count) )
+ path[len++] = TEXT('/');
+ }
+
+ path[len] = TEXT('\0');
+
+ return true;
+}
+
+#endif // __WINE__
--- /dev/null
+/*
+ * Copyright 2003 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // unixfs.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#ifdef __WINE__
+
+struct UnixEntry : public Entry
+{
+ UnixEntry(Entry* parent) : Entry(parent) {}
+
+protected:
+ UnixEntry() : Entry(ET_UNIX) {}
+
+ virtual bool get_path(PTSTR path, size_t path_count) const;
+};
+
+struct UnixDirectory : public UnixEntry, public Directory
+{
+ UnixDirectory(LPCTSTR root_path)
+ : UnixEntry()
+ {
+ _path = _tcsdup(root_path);
+ }
+
+ UnixDirectory(UnixDirectory* parent, LPCTSTR path)
+ : UnixEntry(parent)
+ {
+ _path = _tcsdup(path);
+ }
+
+ ~UnixDirectory()
+ {
+ free(_path);
+ _path = NULL;
+ }
+
+ virtual void read_directory();
+ virtual const void* get_next_path_component(const void*);
+ virtual Entry* find_entry(const void*);
+};
+
+#endif
--- /dev/null
+/*
+ * Copyright 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // webchild.cpp
+ //
+ // Martin Fuchs, 08.02.2004
+ //
+
+
+#include <precomp.h>
+
+#include "../resource.h"
+
+#include "webchild.h"
+
+
+#ifdef _MSC_VER
+
+#if _MSC_VER>=1300 // vtMissing for VS.Net
+#include <comutil.h>
+#pragma comment(lib, "comsupp")
+#endif
+
+#else
+
+#ifdef __MINGW32__ // MinGW is lacking vtMissing (as of 07.02.2004)
+static Variant vtMissing;
+#endif
+
+#endif
+
+//#include <mshtml.h>
+
+
+Variant::Variant(const VARIANT& var)
+{
+ VariantInit(this);
+ CheckError(VariantCopy(this, const_cast<VARIANT*>(&var)));
+}
+
+Variant::Variant(const VARIANT* var)
+{
+ VariantInit(this);
+ CheckError(VariantCopy(this, const_cast<VARIANT*>(var)));
+}
+
+Variant::~Variant()
+{
+ VariantClear(this);
+}
+
+
+Variant::operator long() const
+{
+ Variant v;
+ CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_I4));
+ return V_I4(&v);
+}
+
+Variant::operator bool() const
+{
+ Variant v;
+ CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_BOOL));
+ return V_BOOL(&v)? true: false;
+}
+
+Variant::operator IDispatch*() const
+{
+ Variant v;
+ CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_DISPATCH));
+ return V_DISPATCH(&v);
+}
+
+Variant::operator VARIANT_BOOL() const
+{
+ Variant v;
+ CheckError(VariantChangeType(&v, (VARIANT*)this, 0, VT_BOOL));
+ return V_BOOL(&v);
+}
+
+
+void BStr::assign(BSTR s)
+{
+ if (!SysReAllocString(&_p, s))
+ THROW_EXCEPTION(E_OUTOFMEMORY);
+}
+
+void BStr::assign(const VARIANT& var)
+{
+ if (V_VT(&var) == VT_BSTR)
+ assign(V_BSTR(&var));
+ else {
+ Variant v;
+ CheckError(VariantChangeType(&v, const_cast<VARIANT*>(&var), 0, VT_BSTR));
+ assign(V_BSTR(&v));
+ }
+}
+
+
+BrowserNavigator::BrowserNavigator()
+ : _browser_initialized(false)
+{
+}
+
+void BrowserNavigator::attach(IWebBrowser* browser)
+{
+ _browser = browser;
+}
+
+void BrowserNavigator::goto_url(LPCTSTR url)
+{
+ if (_browser_initialized)
+ _browser->Navigate(BStr(url), NULL, NULL, NULL, NULL);
+ else {
+ _new_url = url;
+
+ _browser->Navigate(L"about:blank", NULL, NULL, NULL, NULL);
+ }
+}
+
+void BrowserNavigator::set_html_page(const String& html_txt)
+{
+ _new_html_txt = html_txt;
+
+ goto_url(TEXT("about:blank"));
+}
+
+void T2nA_binary(LPCTSTR s, LPSTR d, int len)
+{
+ while(len-- > 0)
+ *d++ = (unsigned char)*s++;
+}
+
+void BrowserNavigator::navigated(LPCTSTR url)
+{
+ _browser_initialized = true;
+
+ bool nav = false;
+
+ if (!_new_url.empty()) {
+ if (!_tcscmp(url,TEXT("about:blank")) && _new_url!=TEXT("about:blank")) {
+ _browser->Navigate(BStr(_new_url), NULL, NULL, NULL, NULL);
+ ++nav;
+ }
+
+ _new_url.erase();
+ }
+
+ if (!nav && !_new_html_txt.empty()) { ///@todo move this into DocumentComplete() ?
+ int len = _new_html_txt.length();
+ HGLOBAL hHtmlText = GlobalAlloc(GPTR, len);
+
+ if (!hHtmlText) {
+ T2nA_binary(_new_html_txt, (char*)hHtmlText, len);
+ _new_html_txt.erase();
+
+ SIfacePtr<IStream> pStream;
+ HRESULT hr = CreateStreamOnHGlobal(hHtmlText, TRUE, &pStream);
+
+ if (SUCCEEDED(hr)) {
+ SIfacePtr<IDispatch> pHtmlDoc;
+ CheckError(_browser->get_Document(&pHtmlDoc));
+
+ SIfacePtr<IPersistStreamInit> pPersistStreamInit;
+ pHtmlDoc.QueryInterface(IID_IPersistStreamInit, &pPersistStreamInit);
+
+ CheckError(pPersistStreamInit->InitNew());
+ CheckError(pPersistStreamInit->Load(pStream));
+ } else
+ GlobalFree(hHtmlText);
+ }
+ }
+}
+
+
+HWND create_webchildwindow(const WebChildWndInfo& info)
+{
+ WebChildWindow* pWnd = WebChildWindow::create(info);
+
+ if (!pWnd)
+ return 0;
+
+ return *pWnd;
+}
+
+static const CLSID CLSID_MozillaBrowser =
+ {0x1339B54C, 0x3453, 0x11D2, {0x93, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+
+
+WebChildWindow::WebChildWindow(HWND hwnd, const WebChildWndInfo& info)
+ : super(hwnd, info),
+ web_super(_navigator)
+{
+ // first try to create a web control with MS IE's CLASSID
+ HRESULT hr = create_control(hwnd, CLSID_WebBrowser, IID_IWebBrowser2);
+
+ // If this failed, try to use Mozilla's web control
+ if (FAILED(hr))
+ hr = create_control(hwnd, CLSID_MozillaBrowser, IID_IWebBrowser2);
+
+ if (SUCCEEDED(hr)) {
+ _navigator.attach(_control);
+
+ _connector = auto_ptr<EventConnector>(new EventConnector(_control, DIID_DWebBrowserEvents2, this));
+
+ _control->Navigate(BStr(info._path), &vtMissing, &vtMissing, &vtMissing, &vtMissing);
+ //browser->Navigate2(&Variant(info._path), &vtMissing, &vtMissing, &vtMissing, &vtMissing);
+ }
+}
+
+LRESULT WebChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ try {
+ switch(nmsg) {
+ case WM_ERASEBKGND:
+ if (!_control) {
+ HDC hdc = (HDC)wparam;
+ ClientRect rect(_hwnd);
+
+ HBRUSH hbrush = CreateSolidBrush(RGB(200,200,235));
+ BkMode mode(hdc, TRANSPARENT);
+ TextColor color(hdc, RGB(200,40,40));
+ FillRect(hdc, &rect, hbrush);
+ DrawText(hdc, TEXT("Sorry - no web browser control could be loaded."), -1, &rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
+ DeleteObject(hbrush);
+ }
+
+ return TRUE;
+
+ case PM_DISPATCH_COMMAND: {
+ if (!_control)
+ return FALSE;
+
+ HRESULT hr = E_FAIL;
+
+ switch(LOWORD(wparam)) {
+ case ID_GO_BACK:
+ hr = _control->GoBack();
+ break;
+
+ case ID_GO_FORWARD:
+ hr = _control->GoForward();
+ break;
+
+ case ID_GO_UP:
+ ///@todo
+ break;
+
+ case ID_GO_HOME:
+ hr = _control->GoHome();
+ break;
+
+ case ID_GO_SEARCH:
+ hr = _control->GoSearch();
+ break;
+
+ case ID_REFRESH:
+ hr = _control->Refresh();
+ break;
+
+ case ID_STOP:
+ hr = _control->Stop();
+ break;
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ if (FAILED(hr) && hr!=E_FAIL)
+ THROW_EXCEPTION(hr);
+
+ return TRUE;}
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+ } catch(COMException& e) {
+ HandleException(e, _hwnd);
+ }
+
+ return 0;
+}
+
+
+String WebChildWindow::jump_to_int(LPCTSTR url)
+{
+ _navigator.goto_url(url);
+
+ return url;
+}
--- /dev/null
+/*
+ * Copyright 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // webchild.h
+ //
+ // Martin Fuchs, 08.02.2004
+ //
+
+
+#ifndef _MSC_VER
+#include <exdisp.h> // for IConnectionPointContainer
+#include <exdispid.h> // for DWebBrowserEvents2 IDs
+#endif
+
+#ifndef DISPID_BEFORENAVIGATE // missing in MinGW (as of 07.02.2004)
+#define DISPID_BEFORENAVIGATE 100
+#define DISPID_NAVIGATECOMPLETE 101
+#define DISPID_STATUSTEXTCHANGE 102
+#define DISPID_QUIT 103
+#define DISPID_DOWNLOADCOMPLETE 104
+#define DISPID_COMMANDSTATECHANGE 105
+#define DISPID_DOWNLOADBEGIN 106
+#define DISPID_NEWWINDOW 107
+#define DISPID_PROGRESSCHANGE 108
+#define DISPID_WINDOWMOVE 109
+#define DISPID_WINDOWRESIZE 110
+#define DISPID_WINDOWACTIVATE 111
+#define DISPID_PROPERTYCHANGE 112
+#define DISPID_TITLECHANGE 113
+#define DISPID_TITLEICONCHANGE 114
+#define DISPID_FRAMEBEFORENAVIGATE 200
+#define DISPID_FRAMENAVIGATECOMPLETE 201
+#define DISPID_FRAMENEWWINDOW 204
+
+#define DISPID_NAVIGATECOMPLETE2 252
+#define DISPID_ONQUIT 253
+#define DISPID_ONVISIBLE 254
+#define DISPID_ONTOOLBAR 255
+#define DISPID_ONMENUBAR 256
+#define DISPID_ONSTATUSBAR 257
+#define DISPID_ONFULLSCREEN 258
+#define DISPID_DOCUMENTCOMPLETE 259
+#define DISPID_ONTHEATERMODE 260
+#define DISPID_ONADDRESSBAR 261
+#define DISPID_WINDOWSETRESIZABLE 262
+#define DISPID_WINDOWCLOSING 263
+#define DISPID_WINDOWSETLEFT 264
+#define DISPID_WINDOWSETTOP 265
+#define DISPID_WINDOWSETWIDTH 266
+#define DISPID_WINDOWSETHEIGHT 267
+#define DISPID_CLIENTTOHOSTWINDOW 268
+#define DISPID_SETSECURELOCKICON 269
+#define DISPID_FILEDOWNLOAD 270
+#define DISPID_NAVIGATEERROR 271
+#define DISPID_PRIVACYIMPACTEDSTATECHANGE 272
+#endif
+
+#ifndef V_INT // missing in MinGW (as of 07.02.2004)
+#define V_INT(x) V_UNION(x, intVal)
+#endif
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4355) // use of 'this' for initialization of _connector
+#endif
+
+
+template<typename T> struct ConnectionPoint : public SIfacePtr<T>
+{
+ ConnectionPoint(IConnectionPointContainer* pCPC, REFIID riid)
+ {
+ CheckError(pCPC->FindConnectionPoint(riid, &this->_p));
+ }
+};
+
+struct EventConnection
+{
+ EventConnection(IConnectionPoint* connectionpoint, IUnknown* sink)
+ {
+ CheckError(connectionpoint->Advise(sink, &_cookie));
+ _connectionpoint = connectionpoint;
+ }
+
+ template<typename T> EventConnection(T& connectionpoint, IUnknown* sink)
+ {
+ CheckError(connectionpoint->Advise(sink, &_cookie));
+ _connectionpoint = connectionpoint;
+ }
+
+/* template<typename T> EventConnection(SIfacePtr<T>& connectionpoint, IUnknown* sink)
+ {
+ CheckError(connectionpoint->Advise(sink, &_cookie));
+ _connectionpoint = connectionpoint.GetPtr();
+ } */
+
+/* template<typename T> EventConnection(T& connectionpoint, IUnknown* sink)
+ {
+ CheckError(connectionpoint->Advise(sink, &_cookie));
+ _connectionpoint = connectionpoint;
+ } */
+
+ ~EventConnection()
+ {
+ if (_connectionpoint)
+ _connectionpoint->Unadvise(_cookie);
+ }
+
+protected:
+ SIfacePtr<IConnectionPoint> _connectionpoint;
+ DWORD _cookie;
+};
+
+struct EventConnector : public EventConnection
+{
+ EventConnector(IUnknown* unknown, REFIID riid, IUnknown* sink)
+ : EventConnection(ConnectionPoint<IConnectionPoint>(
+ SIfacePtr<IConnectionPointContainer>(unknown, IID_IConnectionPointContainer), riid), sink)
+ {
+ }
+};
+
+
+struct OleInPlaceClient : public SimpleComObject,
+ public IOleClientSite,
+ public IOleInPlaceSite
+{
+protected:
+ HWND _hwnd;
+
+public:
+ OleInPlaceClient(HWND hwnd=0)
+ : _hwnd(hwnd)
+ {
+ }
+
+ void attach(HWND hwnd)
+ {
+ _hwnd = hwnd;
+ }
+
+ HRESULT attach_control(IOleObject* ole_obj, LONG iVerb=OLEIVERB_INPLACEACTIVATE, HWND hwndParent=0, LPCRECT pRect=NULL)
+ {
+ HRESULT hr = ole_obj->SetClientSite(this);
+ if (FAILED(hr))
+ return hr;
+
+// hr = ole_obj->SetHostNames(app, doc));
+
+ hr = ole_obj->DoVerb(iVerb, NULL, this, 0, 0/*hwnd*/, NULL/*&rcPos*/);
+
+ return hr;
+ }
+
+ HRESULT detach(IOleObject* ole_obj, DWORD dwSaveOption=OLECLOSE_SAVEIFDIRTY)
+ {
+ HRESULT hr = ole_obj->Close(dwSaveOption);
+
+ _hwnd = 0;
+
+ return hr;
+ }
+
+ STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv)
+ {
+ if (IsEqualIID(riid, IID_IOleClientSite))
+ {*ppv=static_cast<IOleClientSite*>(this); IncRef(); return S_OK;}
+
+ if (IsEqualIID(riid, IID_IOleInPlaceSite))
+ {*ppv=static_cast<IOleInPlaceSite*>(this); IncRef(); return S_OK;}
+
+ if (IsEqualIID(riid, IID_IUnknown))
+ {*ppv=static_cast<IOleClientSite/*oder auch IOleInPlaceSite*/*>(this); IncRef(); return S_OK;}
+
+ return E_NOINTERFACE;
+ }
+
+ STDMETHODIMP_(ULONG) AddRef() {return IncRef();}
+ STDMETHODIMP_(ULONG) Release() {return DecRef();}
+
+
+ // IOleWindow:
+
+ virtual /* [input_sync] */ HRESULT STDMETHODCALLTYPE GetWindow(/* [out] */ HWND __RPC_FAR *phwnd)
+ {
+ *phwnd = _hwnd;
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(/* [in] */ BOOL fEnterMode)
+ {
+ return E_NOTIMPL;
+ }
+
+
+ // IOleClientSite:
+
+ virtual HRESULT STDMETHODCALLTYPE SaveObject()
+ {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker __RPC_FAR *__RPC_FAR *ppmk)
+ {
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetContainer(IOleContainer __RPC_FAR *__RPC_FAR *ppContainer)
+ {
+ ppContainer = 0;
+ return E_NOINTERFACE;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE ShowObject()
+ {
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE OnShowWindow(BOOL fShow)
+ {
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE RequestNewObjectLayout()
+ {
+ return S_OK;
+ }
+
+
+ // IOleInPlaceSite:
+
+ virtual HRESULT STDMETHODCALLTYPE CanInPlaceActivate()
+ {
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE OnInPlaceActivate()
+ {
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE OnUIActivate()
+ {
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE GetWindowContext(
+ /* [out] */ IOleInPlaceFrame __RPC_FAR *__RPC_FAR *ppFrame,
+ /* [out] */ IOleInPlaceUIWindow __RPC_FAR *__RPC_FAR *ppDoc,
+ /* [out] */ LPRECT lprcPosRect,
+ /* [out] */ LPRECT lprcClipRect,
+ /* [out][in] */ LPOLEINPLACEFRAMEINFO lpFrameInfo)
+ {
+ ClientRect rect(_hwnd);
+
+ ppFrame = 0;
+ ppDoc = 0;
+ *lprcPosRect = rect;
+ *lprcClipRect = rect;
+
+ assert(lpFrameInfo->cb>=sizeof(OLEINPLACEFRAMEINFO));
+ lpFrameInfo->fMDIApp = FALSE; //@@
+ lpFrameInfo->hwndFrame = 0;
+ lpFrameInfo->haccel = 0;
+ lpFrameInfo->cAccelEntries = 0;
+
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE Scroll(/* [in] */ SIZE scrollExtant)
+ {
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE OnUIDeactivate(/* [in] */ BOOL fUndoable)
+ {
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE OnInPlaceDeactivate()
+ {
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE DiscardUndoState()
+ {
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE DeactivateAndUndo()
+ {
+ return S_OK;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE OnPosRectChange(/* [in] */ LPCRECT lprcPosRect)
+ {
+ return S_OK;
+ }
+};
+
+
+ // window with in place activates Active-X Control
+
+template<typename BASE, typename SMARTPTR> struct IPCtrlWindow : public BASE
+{
+ typedef BASE super;
+
+ IPCtrlWindow(HWND hwnd)
+ : super(hwnd)
+ {
+ }
+
+ template<typename T> IPCtrlWindow(HWND hwnd, T& info)
+ : super(hwnd, info)
+ {
+ }
+
+ HRESULT create_control(HWND hwnd, REFIID clsid, REFIID riid)
+ {
+ // Erzeugen einer Instanz des Controls
+ HRESULT hr = _control.CreateInstance(clsid, riid);
+ if (FAILED(hr))
+ return hr;
+
+ _client_side.attach(hwnd);
+
+ hr = _client_side.attach_control(SIfacePtr<IOleObject>(_control, IID_IOleObject)/*, OLEIVERB_INPLACEACTIVATE,
+ hwnd, &Rect(10, 10, 500, 500)*/);
+ if (FAILED(hr))
+ return hr;
+
+ // try to get a IOleInPlaceObject interface for window resizing
+ return _control.QueryInterface(IID_IOleInPlaceObject, &_in_place_object); // _in_place_object = _control
+ }
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+ {
+ if (nmsg == WM_SIZE) {
+ if (_in_place_object) {
+ RECT rect = {0, 0, LOWORD(lparam), HIWORD(lparam)};
+
+ _in_place_object->SetObjectRects(&rect, &rect);
+ }
+ } else if (nmsg == WM_CLOSE) {
+ _in_place_object = NULL;
+
+ if (_control) {
+ _client_side.detach(SIfacePtr<IOleObject>(_control, IID_IOleObject), OLECLOSE_NOSAVE);
+ _control = NULL;
+ }
+ }
+
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ ComInit _usingCOM;
+ SMARTPTR _control;
+ OleInPlaceClient _client_side;
+ SIfacePtr<IOleInPlaceObject> _in_place_object;
+};
+
+
+
+#include "exdispid.h"
+
+
+struct DWebBrowserEvents2IF
+{
+ virtual ~DWebBrowserEvents2IF() {}
+
+ virtual void StatusTextChange(const BStr& text)
+ {}
+
+ virtual void ProgressChange(long progress, long progressMax)
+ {}
+
+ virtual void WindowMove()
+ {}
+
+ virtual void WindowResize()
+ {}
+
+ virtual void WindowActivate()
+ {}
+
+ virtual void PropertyChange(const BStr& property)
+ {}
+
+ virtual void DownloadComplete()
+ {}
+
+ virtual void CommandStateChange(long command, bool enable)
+ {}
+
+ virtual void DownloadBegin()
+ {}
+
+ virtual void NewWindow2(IDispatch** ppDisp, VARIANT_BOOL& cancel)
+ {}
+
+ virtual void TitleChange(const BStr& text)
+ {}
+
+ virtual void TitleIconChange(const BStr& text)
+ {}
+
+ virtual void FrameBeforeNavigate(const BStr& url, long flags, const BStr& targetFrameName, VARIANT* postData, const BStr& headers, VARIANT_BOOL& cancel)
+ {}
+
+ virtual void FrameNavigateComplete(const BStr& url)
+ {}
+
+ virtual void FrameNewWindow(const BStr&url, long flags, const BStr& targetFrameName, VARIANT* postData, const BStr& headers, VARIANT_BOOL& processed)
+ {}
+
+ virtual void BeforeNavigate2(IDispatch* pDisp, const Variant& url, const Variant& flags,
+ const Variant& targetFrameName, const Variant& postData,
+ const Variant& headers, VARIANT_BOOL& cancel)
+ {}
+
+ virtual void NavigateComplete2(IDispatch* pDisp, const Variant& url)
+ {}
+
+ virtual void OnQuit()
+ {}
+
+ virtual void OnVisible(bool Visible)
+ {}
+
+ virtual void OnToolbar(bool Visible)
+ {}
+
+ virtual void OnMenubar(bool Visible)
+ {}
+
+ virtual void OnStatusbar(bool Visible)
+ {}
+
+ virtual void OnFullscreen(bool Visible)
+ {}
+
+ virtual void DocumentComplete()
+ {}
+
+ virtual void OnTheatermode(bool Visible)
+ {}
+
+ virtual void OnAddressbar(bool Visible)
+ {}
+
+ virtual void WindowSetResizable(bool Visible)
+ {}
+
+ virtual void WindowClosing(VARIANT_BOOL IsChildWindow, VARIANT_BOOL& cancel)
+ {}
+
+ virtual void WindowSetLeft(long Left)
+ {}
+
+ virtual void WindowSetTop(long Top)
+ {}
+
+ virtual void WindowSetWidth(long Width)
+ {}
+
+ virtual void WindowSetHeight(long Height)
+ {}
+
+ virtual void ClientToHostWindow(long& CX, long& CY)
+ {}
+
+ virtual void SetSecureLockIcon(long SecureLockIcon)
+ {}
+
+ virtual void FileDownload(Variant& cancel)
+ {}
+
+ virtual void NavigateError(IDispatch* pDisp, const Variant& url, const Variant& Frame, const Variant& StatusCode, VARIANT_BOOL& cancel)
+ {}
+
+ virtual void PrivacyImpactedStateChange(bool bImpacted)
+ {}
+};
+
+
+ // The web browser control has to be initialized completely before being able,
+ // to display a page, that does not access internet.
+struct ANSUNC BrowserNavigator
+{
+ BrowserNavigator();
+
+ void attach(IWebBrowser* browser);
+ void goto_url(LPCTSTR url);
+ void set_html_page(const String& html_txt);
+ void navigated(LPCTSTR url);
+
+ IWebBrowser* get_browser() {return _browser.get();}
+
+protected:
+ SIfacePtr<IWebBrowser> _browser;
+ String _new_url;
+ String _new_html_txt;
+ bool _browser_initialized;
+};
+
+
+ // MinGW defines a wrong FixedDWebBrowserEvents2 interface with virtual functions for DISPID calls, so we use our own, corrected version:
+interface FixedDWebBrowserEvents2 : public IDispatch
+{
+#ifdef __GNUC__
+ virtual ~FixedDWebBrowserEvents2() {}
+#endif
+};
+
+struct ANSUNC DWebBrowserEvents2Impl
+ : public IComSrvBase<FixedDWebBrowserEvents2, DWebBrowserEvents2Impl>, public SimpleComObject,
+ public DWebBrowserEvents2IF
+{
+ typedef IComSrvBase<FixedDWebBrowserEvents2, DWebBrowserEvents2Impl> super;
+
+
+ DWebBrowserEvents2IF* _callback;
+
+
+ DWebBrowserEvents2Impl(BrowserNavigator& navigator)
+ : super(DIID_DWebBrowserEvents2),
+ _navigator(navigator)
+ {
+ _callback = this;
+ }
+
+
+/* // IUnknown
+ STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv)
+ {
+ *ppv = NULL;
+
+ if (SUCCEEDED(super::QueryInterface(riid, ppv)))
+ return S_OK;
+
+ return E_NOINTERFACE;
+ } */
+
+
+ // IDispatch
+ STDMETHOD(GetTypeInfoCount)(UINT* pctinfo)
+ {return E_NOTIMPL;}
+
+ STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo)
+ {return E_NOTIMPL;}
+
+ STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId)
+ {return E_NOTIMPL;}
+
+ STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
+ DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult, EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr)
+ {
+ switch(dispIdMember) {
+ case DISPID_STATUSTEXTCHANGE:
+ _callback->StatusTextChange((BStr)Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_COMMANDSTATECHANGE:
+ _callback->CommandStateChange(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_DOWNLOADBEGIN:
+ _callback->DownloadBegin();
+ break;
+
+ case DISPID_PROGRESSCHANGE: // sent when download progress is updated
+ _callback->ProgressChange(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_WINDOWMOVE: // sent when main window has been moved
+ _callback->WindowMove();
+ break;
+
+ case DISPID_WINDOWRESIZE: // sent when main window has been sized
+ _callback->WindowResize();
+ break;
+
+ case DISPID_WINDOWACTIVATE: // sent when main window has been activated
+ _callback->WindowActivate();
+ break;
+
+ case DISPID_PROPERTYCHANGE: // sent when the PutProperty method is called
+ _callback->PropertyChange((BStr)Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_TITLECHANGE: // sent when the document title changes
+ _callback->TitleChange((BStr)Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_TITLEICONCHANGE: // sent when the top level window icon may have changed.
+ _callback->TitleIconChange((BStr)Variant(pDispParams->rgvarg[0]));
+ break;
+
+
+ // anything below here is not present in DWebBrowserEvents, only in DWebBrowserEvents2: ->
+
+ case DISPID_FRAMEBEFORENAVIGATE:
+ if (pDispParams->cArgs != 6)
+ return E_INVALIDARG;
+ if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
+ return E_INVALIDARG;
+ _callback->FrameBeforeNavigate(
+ (BStr)Variant(&pDispParams->rgvarg[5]), Variant(&pDispParams->rgvarg[4]),
+ (BStr)Variant(&pDispParams->rgvarg[3]), &pDispParams->rgvarg[2],
+ (BStr)Variant(&pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_FRAMENAVIGATECOMPLETE:
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->FrameNavigateComplete((BStr)Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_FRAMENEWWINDOW:
+ if (pDispParams->cArgs != 6)
+ return E_INVALIDARG;
+ if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
+ return E_INVALIDARG;
+ _callback->FrameNewWindow((BStr)Variant(&pDispParams->rgvarg[5]), Variant(&pDispParams->rgvarg[4]),
+ (BStr)Variant(&pDispParams->rgvarg[3]), &pDispParams->rgvarg[2],
+ (BStr)Variant(&pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_BEFORENAVIGATE2: // hyperlink clicked on
+ if (pDispParams->cArgs != 7)
+ return E_INVALIDARG;
+ if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
+ return E_INVALIDARG;
+ _callback->BeforeNavigate2(Variant(pDispParams->rgvarg[6]),
+ pDispParams->rgvarg[5], &pDispParams->rgvarg[4],
+ pDispParams->rgvarg[3], &pDispParams->rgvarg[2],
+ pDispParams->rgvarg[1], *V_BOOLREF(&pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_NEWWINDOW2: // sent when a new window should be created
+ if (pDispParams->cArgs != 2)
+ return E_INVALIDARG;
+ if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
+ return E_INVALIDARG;
+ if (V_VT(&pDispParams->rgvarg[1]) != (VT_DISPATCH|VT_BYREF))
+ return E_INVALIDARG;
+ _callback->NewWindow2(V_DISPATCHREF(&pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_NAVIGATECOMPLETE2:// UIActivate new document
+ if (pDispParams->cArgs != 2)
+ return E_INVALIDARG;
+
+ // notify the navigator
+ NavigateComplete2(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
+
+ _callback->NavigateComplete2(Variant(pDispParams->rgvarg[1]), Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_ONQUIT:
+ _callback->OnQuit();
+ break;
+
+ case DISPID_ONVISIBLE: // sent when the window goes visible/hidden
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->OnVisible(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_ONTOOLBAR: // sent when the toolbar should be shown/hidden
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->OnToolbar(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_ONMENUBAR: // sent when the menubar should be shown/hidden
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->OnMenubar(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_ONSTATUSBAR: // sent when the statusbar should be shown/hidden
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->OnStatusbar(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_ONFULLSCREEN: // sent when kiosk mode should be on/off
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->OnFullscreen(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_DOCUMENTCOMPLETE:// new document goes ReadyState_Complete
+ _callback->DocumentComplete();
+ break;
+
+ case DISPID_DOWNLOADCOMPLETE:
+ _callback->DownloadComplete();
+ break;
+
+ case DISPID_ONTHEATERMODE: // sent when theater mode should be on/off
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->OnTheatermode(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_ONADDRESSBAR: // sent when the address bar should be shown/hidden
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->OnAddressbar(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_WINDOWSETRESIZABLE:// sent to set the style of the host window frame
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->WindowSetResizable(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_WINDOWCLOSING: // sent before script window.close closes the window
+ if (pDispParams->cArgs != 2)
+ return E_INVALIDARG;
+ if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
+ return E_INVALIDARG;
+ _callback->WindowClosing(Variant(pDispParams->rgvarg[1]), *V_BOOLREF(&pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_WINDOWSETLEFT: // sent when the put_left method is called on the WebOC
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->WindowSetLeft(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_WINDOWSETTOP: // sent when the put_top method is called on the WebOC
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->WindowSetTop(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_WINDOWSETWIDTH: // sent when the put_width method is called on the WebOC
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->WindowSetWidth(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_WINDOWSETHEIGHT: // sent when the put_height method is called on the WebOC
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->WindowSetHeight(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_CLIENTTOHOSTWINDOW:// sent during window.open to request conversion of dimensions
+ if (pDispParams->cArgs != 2)
+ return E_INVALIDARG;
+ if (V_VT(&pDispParams->rgvarg[0]) != (VT_I4|VT_BYREF))
+ return E_INVALIDARG;
+ if (V_VT(&pDispParams->rgvarg[1]) != (VT_I4|VT_BYREF))
+ return E_INVALIDARG;
+ _callback->ClientToHostWindow(*V_I4REF(&pDispParams->rgvarg[1]), *V_I4REF(&pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_SETSECURELOCKICON:// sent to suggest the appropriate security icon to show
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->SetSecureLockIcon(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_FILEDOWNLOAD: { // Fired to indicate the File Download dialog is opening
+ if (pDispParams->cArgs != 1) //@@ every time 2 ?!
+ return E_INVALIDARG;
+ Variant var(pDispParams->rgvarg[0]);
+ _callback->FileDownload(var);}
+ break;
+
+ case DISPID_NAVIGATEERROR: // Fired to indicate the a binding error has occured
+ if (pDispParams->cArgs != 5)
+ return E_INVALIDARG;
+ if (V_VT(&pDispParams->rgvarg[0]) != (VT_BOOL|VT_BYREF))
+ return E_INVALIDARG;
+ _callback->NavigateError(Variant(pDispParams->rgvarg[4]), Variant(pDispParams->rgvarg[3]),
+ Variant(pDispParams->rgvarg[2]), Variant(pDispParams->rgvarg[1]),
+ *V_BOOLREF(&pDispParams->rgvarg[0]));
+ break;
+
+ case DISPID_PRIVACYIMPACTEDSTATECHANGE:// Fired when the user's browsing experience is impacted
+ if (pDispParams->cArgs != 1)
+ return E_INVALIDARG;
+ _callback->PrivacyImpactedStateChange(Variant(pDispParams->rgvarg[0]));
+ break;
+
+ default:
+ return NOERROR;
+ }
+
+ return S_OK;
+ }
+
+protected:
+ BrowserNavigator& _navigator;
+
+ void NavigateComplete2(IDispatch* pDisp, const Variant& url)
+ {
+ String adr = (BStr)url;
+
+ _navigator.navigated(adr);
+ }
+};
+
+
+ /// encapsulation of Web control in MDI child windows
+struct WebChildWindow : public IPCtrlWindow<ChildWindow, SIfacePtr<IWebBrowser2> >,
+ public DWebBrowserEvents2Impl
+{
+ typedef IPCtrlWindow<ChildWindow, SIfacePtr<IWebBrowser2> > super;
+ typedef DWebBrowserEvents2Impl web_super;
+
+ WebChildWindow(HWND hwnd, const WebChildWndInfo& info);
+
+ static WebChildWindow* create(const FileChildWndInfo& info)
+ {
+ ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition,
+ WINDOW_CREATOR_INFO(WebChildWindow,WebChildWndInfo), CLASSNAME_CHILDWND, NULL, info._pos.showCmd==SW_SHOWMAXIMIZED? WS_MAXIMIZE: 0);
+
+ return static_cast<WebChildWindow*>(child);
+ }
+
+
+ // DWebBrowserEvents2Impl overides ->
+
+ void BeforeNavigate2(IDispatch* pDisp, const Variant& url, const Variant& flags,
+ const Variant& targetFrameName, const Variant& postData,
+ const Variant& headers, VARIANT_BOOL& cancel)
+ {
+ //String adr = (BStr)url;
+ }
+
+ void NavigateComplete2(IDispatch* pDisp, const Variant& url)
+ {
+ web_super::NavigateComplete2(pDisp, url);
+
+ set_url(String(BStr(url)));
+ }
+
+ void StatusTextChange(const BStr& text)
+ {
+ _statusText = text;
+ SendMessage(_hwndFrame, PM_SETSTATUSTEXT, 0, (LPARAM)_statusText.c_str());
+ }
+
+ void ProgressChange(long Progress, long ProgressMax)
+ {
+ }
+
+ void WindowMove()
+ {
+ }
+
+ void WindowResize()
+ {
+ }
+
+ void WindowActivate()
+ {
+ }
+
+ void PropertyChange(const BStr& Property)
+ {
+ Variant value;
+ _control->GetProperty(Property, &value);
+ }
+
+ void CommandStateChange(long command/*CSC_NAVIGATEFORWARD, CSC_NAVIGATEBACK*/, bool enable)
+ {
+ }
+
+ void DownloadBegin()
+ {
+ }
+
+ void NewWindow2(IDispatch** ppDisp, VARIANT_BOOL& cancel)
+ {
+ //*ppDisp = ;
+ //cancel = TRUE;
+ }
+
+ void TitleChange(const BStr& text)
+ {
+ SetWindowText(_hwnd, String(text));
+ }
+
+ void TitleIconChange(const BStr& text)
+ {
+ }
+
+ void FrameBeforeNavigate(const BStr& url, long flags, const BStr& targetFrameName, VARIANT* postData, const BStr& headers, VARIANT_BOOL& cancel)
+ {
+ }
+
+ void FrameNavigateComplete(const BStr& url)
+ {
+ }
+
+ void FrameNewWindow(const BStr& url, long flags, const BStr& targetFrameName, VARIANT* postData, const BStr& headers, VARIANT_BOOL& processed)
+ {
+ }
+
+ void OnQuit()
+ {
+ }
+
+ void OnVisible(bool Visible)
+ {
+ }
+
+ void OnToolbar(bool Visible)
+ {
+ }
+
+ void OnMenubar(bool Visible)
+ {
+ }
+
+ void OnStatusbar(bool Visible)
+ {
+ }
+
+ void OnFullscreen(bool Visible)
+ {
+ }
+
+ void DocumentComplete()
+ {
+ }
+
+ void OnTheatermode(bool Visible)
+ {
+ }
+
+ void OnAddressbar(bool Visible)
+ {
+ }
+
+ void WindowSetResizable(bool Visible)
+ {
+ }
+
+ void WindowClosing(VARIANT_BOOL IsChildWindow, VARIANT_BOOL& cancel)
+ {
+ }
+
+ void WindowSetLeft(long Left)
+ {
+ }
+
+ void WindowSetTop(long Top)
+ {
+ }
+
+ void WindowSetWidth(long Width)
+ {
+ }
+
+ void WindowSetHeight(long Height)
+ {
+ }
+
+ void ClientToHostWindow(long& CX, long& CY)
+ {
+ }
+
+ void SetSecureLockIcon(long SecureLockIcon)
+ {
+ }
+
+ void FileDownload(Variant& cancel)
+ {
+ }
+
+ void NavigateError(IDispatch* pDisp, const Variant& url, const Variant& Frame, const Variant& StatusCode, VARIANT_BOOL& cancel)
+ {
+ }
+
+ void PrivacyImpactedStateChange(bool bImpacted)
+ {
+ }
+
+
+protected:
+ BrowserNavigator _navigator;
+ auto_ptr<EventConnector> _connector;
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ virtual String jump_to_int(LPCTSTR url);
+};
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // winfs.cpp
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#include <precomp.h>
+
+#ifndef _NO_WIN_FS
+
+//#include "winfs.h"
+
+
+int ScanNTFSStreams(Entry* entry, HANDLE hFile)
+{
+ PVOID ctx = 0;
+ DWORD read, seek_high;
+ Entry** pnext = &entry->_down;
+ int cnt = 0;
+
+ for(;;) {
+ struct NTFS_StreamHdr : public WIN32_STREAM_ID {
+ WCHAR name_padding[_MAX_FNAME]; // room for reading stream name
+ } hdr;
+
+ if (!BackupRead(hFile, (LPBYTE)&hdr, (LPBYTE)&hdr.cStreamName-(LPBYTE)&hdr, &read, FALSE, FALSE, &ctx) ||
+ (long)read!=(LPBYTE)&hdr.cStreamName-(LPBYTE)&hdr)
+ break;
+
+ if (hdr.dwStreamId == BACKUP_ALTERNATE_DATA) {
+ if (hdr.dwStreamNameSize &&
+ BackupRead(hFile, (LPBYTE)hdr.cStreamName, hdr.dwStreamNameSize, &read, FALSE, FALSE, &ctx) &&
+ read==hdr.dwStreamNameSize)
+ {
+ ++cnt;
+
+ int l = hdr.dwStreamNameSize / sizeof(WCHAR);
+ LPCWSTR p = hdr.cStreamName;
+ LPCWSTR e = hdr.cStreamName + l;
+
+ if (l>0 && *p==':') {
+ ++p, --l;
+
+ e = p;
+
+ while(l>0 && *e!=':')
+ ++e, --l;
+
+ l = e - p;
+ }
+
+ Entry* stream_entry = new WinEntry(entry);
+
+ memcpy(&stream_entry->_data, &entry->_data, sizeof(WIN32_FIND_DATA));
+ lstrcpy(stream_entry->_data.cFileName, String(p, l));
+
+ stream_entry->_down = NULL;
+ stream_entry->_expanded = false;
+ stream_entry->_scanned = false;
+ stream_entry->_level = entry->_level + 1;
+
+ *pnext = stream_entry;
+ pnext = &stream_entry->_next;
+ }
+ }
+
+ // jump to the next stream header
+ if (!BackupSeek(hFile, ~0, ~0, &read, &seek_high, &ctx)) {
+ DWORD error = GetLastError();
+
+ if (error != ERROR_SEEK) {
+ BackupRead(hFile, 0, 0, &read, TRUE, FALSE, &ctx); // terminate BackupRead() loop
+ THROW_EXCEPTION(error);
+ //break;
+ }
+
+ hdr.Size.QuadPart -= read;
+ hdr.Size.HighPart -= seek_high;
+
+ BYTE buffer[4096];
+
+ while(hdr.Size.QuadPart > 0) {
+ if (!BackupRead(hFile, buffer, sizeof(buffer), &read, FALSE, FALSE, &ctx) || read!=sizeof(buffer))
+ break;
+
+ hdr.Size.QuadPart -= read;
+ }
+ }
+ }
+
+ if (ctx)
+ if (!BackupRead(hFile, 0, 0, &read, TRUE, FALSE, &ctx)) // terminate BackupRead() loop
+ THROW_EXCEPTION(GetLastError());
+
+ return cnt;
+}
+
+
+void WinDirectory::read_directory(int scan_flags)
+{
+ CONTEXT("WinDirectory::read_directory()");
+
+ int level = _level + 1;
+
+ Entry* first_entry = NULL;
+ Entry* last = NULL;
+ Entry* entry;
+
+ LPCTSTR path = (LPCTSTR)_path;
+ TCHAR buffer[MAX_PATH], *pname;
+ for(pname=buffer; *path; )
+ *pname++ = *path++;
+
+ lstrcpy(pname, TEXT("\\*"));
+
+ WIN32_FIND_DATA w32fd;
+ HANDLE hFind = FindFirstFile(buffer, &w32fd);
+
+ if (hFind != INVALID_HANDLE_VALUE) {
+ do {
+ lstrcpy(pname+1, w32fd.cFileName);
+
+ if (w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ entry = new WinDirectory(this, buffer);
+ else
+ entry = new WinEntry(this);
+
+ if (!first_entry)
+ first_entry = entry;
+
+ if (last)
+ last->_next = entry;
+
+ memcpy(&entry->_data, &w32fd, sizeof(WIN32_FIND_DATA));
+ entry->_level = level;
+
+ // display file type names, but don't hide file extensions
+ g_Globals._ftype_mgr.set_type(entry, true);
+
+ if (!(scan_flags & SCAN_DONT_ACCESS)) {
+ HANDLE hFile = CreateFile(buffer, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+ 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
+
+ if (hFile != INVALID_HANDLE_VALUE) {
+ if (GetFileInformationByHandle(hFile, &entry->_bhfi))
+ entry->_bhfi_valid = true;
+
+ if (ScanNTFSStreams(entry, hFile))
+ entry->_scanned = true; // There exist named NTFS sub-streams in this file.
+
+ CloseHandle(hFile);
+ }
+ }
+
+ last = entry; // There is always at least one entry, because FindFirstFile() succeeded and we don't filter the file entries.
+ } while(FindNextFile(hFind, &w32fd));
+
+ if (last)
+ last->_next = NULL;
+
+ FindClose(hFind);
+ }
+
+ _down = first_entry;
+ _scanned = true;
+}
+
+
+const void* WinDirectory::get_next_path_component(const void* p) const
+{
+ LPCTSTR s = (LPCTSTR) p;
+
+ while(*s && *s!=TEXT('\\') && *s!=TEXT('/'))
+ ++s;
+
+ while(*s==TEXT('\\') || *s==TEXT('/'))
+ ++s;
+
+ if (!*s)
+ return NULL;
+
+ return s;
+}
+
+
+Entry* WinDirectory::find_entry(const void* p)
+{
+ LPCTSTR name = (LPCTSTR)p;
+
+ for(Entry*entry=_down; entry; entry=entry->_next) {
+ LPCTSTR p = name;
+ LPCTSTR q = entry->_data.cFileName;
+
+ do {
+ if (!*p || *p==TEXT('\\') || *p==TEXT('/'))
+ return entry;
+ } while(tolower(*p++) == tolower(*q++));
+
+ p = name;
+ q = entry->_data.cAlternateFileName;
+
+ do {
+ if (!*p || *p==TEXT('\\') || *p==TEXT('/'))
+ return entry;
+ } while(tolower(*p++) == tolower(*q++));
+ }
+
+ return NULL;
+}
+
+
+ // get full path of specified directory entry
+bool WinEntry::get_path(PTSTR path, size_t path_count) const
+{
+ return get_path_base(path, path_count, ET_WINDOWS);
+}
+
+ShellPath WinEntry::create_absolute_pidl() const
+{
+ CONTEXT("WinEntry::create_absolute_pidl()");
+
+ TCHAR path[MAX_PATH];
+
+ if (get_path(path, COUNTOF(path)))
+ return ShellPath(path);
+
+ return ShellPath();
+}
+
+#endif // _NO_WIN_FS
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // winfs.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+ /// Windows file system file-entry
+struct WinEntry : public Entry
+{
+ WinEntry(Entry* parent) : Entry(parent, ET_WINDOWS) {}
+
+protected:
+ WinEntry() : Entry(ET_WINDOWS) {}
+
+ virtual bool get_path(PTSTR path, size_t path_count) const;
+ virtual ShellPath create_absolute_pidl() const;
+};
+
+
+ /// Windows file system directory-entry
+struct WinDirectory : public WinEntry, public Directory
+{
+ WinDirectory(LPCTSTR root_path)
+ : WinEntry()
+ {
+ _path = _tcsdup(root_path);
+ }
+
+ WinDirectory(Entry* parent, LPCTSTR path)
+ : WinEntry(parent)
+ {
+ _path = _tcsdup(path);
+ }
+
+ ~WinDirectory()
+ {
+ free(_path);
+ _path = NULL;
+ }
+
+ virtual void read_directory(int scan_flags=0);
+ virtual const void* get_next_path_component(const void*) const;
+ virtual Entry* find_entry(const void*);
+};
+
+extern int ScanNTFSStreams(Entry* entry, HANDLE hFile);
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // desktopbar.cpp
+ //
+ // Martin Fuchs, 22.08.2003
+ //
+
+
+#include <precomp.h>
+
+#include "../resource.h"
+
+#include "desktopbar.h"
+#include "taskbar.h"
+#include "startmenu.h"
+#include "traynotify.h"
+#include "quicklaunch.h"
+
+#include "../dialogs/settings.h"
+
+
+DesktopBar::DesktopBar(HWND hwnd)
+ : super(hwnd),
+#ifdef _ROS_
+ _trayIcon(hwnd, ID_TRAY_VOLUME)
+#else
+ WM_TASKBARCREATED(RegisterWindowMessage(WINMSG_TASKBARCREATED))
+#endif
+{
+ SetWindowIcon(hwnd, IDI_REACTOS);
+
+ SystemParametersInfo(SPI_GETWORKAREA, 0, &_work_area_org, 0);
+}
+
+DesktopBar::~DesktopBar()
+{
+ // restore work area to the previous size
+ SystemParametersInfo(SPI_SETWORKAREA, 0, &_work_area_org, 0);
+ PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETWORKAREA, 0);
+
+ // exit application after destroying desktop window
+ PostQuitMessage(0);
+}
+
+
+HWND DesktopBar::Create()
+{
+ static BtnWindowClass wcDesktopBar(CLASSNAME_EXPLORERBAR);
+
+ RECT rect;
+
+ rect.left = -2; // hide left border
+#ifdef TASKBAR_AT_TOP
+ rect.top = -2; // hide top border
+#else
+ rect.top = GetSystemMetrics(SM_CYSCREEN) - DESKTOPBARBAR_HEIGHT;
+#endif
+ rect.right = GetSystemMetrics(SM_CXSCREEN) + 2;
+ rect.bottom = rect.top + DESKTOPBARBAR_HEIGHT + 2;
+
+ return Window::Create(WINDOW_CREATOR(DesktopBar), WS_EX_PALETTEWINDOW,
+ wcDesktopBar, TITLE_EXPLORERBAR,
+ WS_POPUP|WS_THICKFRAME|WS_CLIPCHILDREN|WS_VISIBLE,
+ rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, 0);
+}
+
+
+LRESULT DesktopBar::Init(LPCREATESTRUCT pcs)
+{
+ if (super::Init(pcs))
+ return 1;
+
+ // create start button
+ ResString start_str(IDS_START);
+ WindowCanvas canvas(_hwnd);
+ RECT rect = {0, 0};
+ DrawText(canvas, start_str, -1, &rect, DT_SINGLELINE|DT_CALCRECT);
+ int start_btn_width = rect.right+16+8;
+
+ _taskbar_pos = start_btn_width + 6;
+
+ // create "Start" button
+ HWND hwndStart = Button(_hwnd, start_str, 1, 1, start_btn_width, REBARBAND_HEIGHT, IDC_START, WS_VISIBLE|WS_CHILD|BS_OWNERDRAW);
+ new StartButton(hwndStart);
+ // disable double clicks
+ SetClassLong(hwndStart, GCL_STYLE, GetClassLong(hwndStart, GCL_STYLE) & ~CS_DBLCLKS);
+
+ // create task bar
+ _hwndTaskBar = TaskBar::Create(_hwnd);
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || !SHRestricted(REST_NOTRAYITEMSDISPLAY))
+#endif
+ // create tray notification area
+ _hwndNotify = NotifyArea::Create(_hwnd);
+
+
+ // notify all top level windows about the successfully created desktop bar
+ //@@ Use SendMessage() instead of PostMessage() to avoid problems with delayed created shell service objects?
+ PostMessage(HWND_BROADCAST, WM_TASKBARCREATED, 0, 0);
+
+
+ _hwndQuickLaunch = QuickLaunchBar::Create(_hwnd);
+
+ // create rebar window to manage task and quick launch bar
+#ifndef _NO_REBAR
+ _hwndrebar = CreateWindowEx(WS_EX_TOOLWINDOW, REBARCLASSNAME, NULL,
+ WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
+ RBS_VARHEIGHT|RBS_AUTOSIZE|RBS_DBLCLKTOGGLE| //|RBS_REGISTERDROP
+ CCS_NODIVIDER|CCS_NOPARENTALIGN|CCS_TOP,
+ 0, 0, 0, 0, _hwnd, 0, g_Globals._hInstance, 0);
+
+ REBARBANDINFO rbBand;
+
+ rbBand.cbSize = sizeof(REBARBANDINFO);
+ rbBand.fMask = RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE|RBBIM_ID|RBBIM_IDEALSIZE;
+#ifndef RBBS_HIDETITLE // missing in MinGW headers as of 25.02.2004
+#define RBBS_HIDETITLE 0x400
+#endif
+ rbBand.cyChild = REBARBAND_HEIGHT;
+ rbBand.cyMaxChild = (ULONG)-1;
+ rbBand.cyMinChild = REBARBAND_HEIGHT;
+ rbBand.cyIntegral = REBARBAND_HEIGHT + 3; //@@ OK?
+ rbBand.cxMinChild = rbBand.cyIntegral * 3;
+ rbBand.fStyle = RBBS_VARIABLEHEIGHT|RBBS_GRIPPERALWAYS|RBBS_HIDETITLE;
+
+ rbBand.lpText = TEXT("Quicklaunch");
+ rbBand.hwndChild = _hwndQuickLaunch;
+ rbBand.cx = 250;
+ rbBand.wID = IDW_QUICKLAUNCHBAR;
+ SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
+
+ rbBand.lpText = TEXT("Taskbar");
+ rbBand.hwndChild = _hwndTaskBar;
+ rbBand.cx = 200; //pcs->cx-_taskbar_pos-quicklaunch_width-(notifyarea_width+1);
+ rbBand.wID = IDW_TASKTOOLBAR;
+ SendMessage(_hwndrebar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand);
+#endif
+
+
+ RegisterHotkeys();
+
+ // prepare Startmenu, but hide it for now
+ _startMenuRoot = GET_WINDOW(StartMenuRoot, StartMenuRoot::Create(_hwnd, STARTMENUROOT_ICON_SIZE));
+
+ return 0;
+}
+
+
+StartButton::StartButton(HWND hwnd)
+ : PictureButton(hwnd, SmallIcon(IDI_STARTMENU), GetSysColorBrush(COLOR_BTNFACE))
+{
+}
+
+LRESULT StartButton::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ // one click activation: handle button-down message, don't wait for button-up
+ case WM_LBUTTONDOWN:
+ if (!Button_GetState(_hwnd)) {
+ Button_SetState(_hwnd, TRUE);
+
+ SetCapture(_hwnd);
+
+ SendMessage(GetParent(_hwnd), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(_hwnd),0), 0);
+ }
+
+ Button_SetState(_hwnd, FALSE);
+ break;
+
+ // re-target mouse move messages while moving the mouse cursor through the start menu
+ case WM_MOUSEMOVE:
+ if (GetCapture() == _hwnd) {
+ POINT pt = {GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)};
+
+ ClientToScreen(_hwnd, &pt);
+ HWND hwnd = WindowFromPoint(pt);
+
+ if (hwnd && hwnd!=_hwnd) {
+ ScreenToClient(hwnd, &pt);
+ SendMessage(hwnd, WM_MOUSEMOVE, 0, MAKELPARAM(pt.x, pt.y));
+ }
+ }
+ break;
+
+ case WM_LBUTTONUP:
+ if (GetCapture() == _hwnd) {
+ ReleaseCapture();
+
+ POINT pt = {GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)};
+
+ ClientToScreen(_hwnd, &pt);
+ HWND hwnd = WindowFromPoint(pt);
+
+ if (hwnd && hwnd!=_hwnd) {
+ ScreenToClient(hwnd, &pt);
+ PostMessage(hwnd, WM_LBUTTONDOWN, 0, MAKELPARAM(pt.x, pt.y));
+ PostMessage(hwnd, WM_LBUTTONUP, 0, MAKELPARAM(pt.x, pt.y));
+ }
+ }
+ break;
+
+ case WM_CANCELMODE:
+ ReleaseCapture();
+ break;
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+
+void DesktopBar::RegisterHotkeys()
+{
+ // register hotkey WIN+E opening explorer
+ RegisterHotKey(_hwnd, 0, MOD_WIN, 'E');
+
+ ///@todo register all common hotkeys
+}
+
+void DesktopBar::ProcessHotKey(int id_hotkey)
+{
+ switch(id_hotkey) {
+ case 0: explorer_show_frame(SW_SHOWNORMAL);
+ break;
+
+ ///@todo implement all common hotkeys
+ }
+}
+
+
+LRESULT DesktopBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_NCHITTEST: {
+ LRESULT res = super::WndProc(nmsg, wparam, lparam);
+
+ if (res>=HTSIZEFIRST && res<=HTSIZELAST) {
+#ifdef TASKBAR_AT_TOP
+ if (res == HTBOTTOM) // enable vertical resizing at the lower border
+#else
+ if (res == HTTOP) // enable vertical resizing at the upper border
+#endif
+ return res;
+ else
+ return HTCLIENT; // disable any other resizing
+ }
+ return res;}
+
+ case WM_SYSCOMMAND:
+ if ((wparam&0xFFF0) == SC_SIZE) {
+#ifdef TASKBAR_AT_TOP
+ if (wparam == SC_SIZE+6)// enable vertical resizing at the lower border
+#else
+ if (wparam == SC_SIZE+3)// enable vertical resizing at the upper border
+#endif
+ goto def;
+ else
+ return 0; // disable any other resizing
+ } else if (wparam == SC_TASKLIST)
+ ShowStartMenu();
+ goto def;
+
+ case WM_SIZE:
+ Resize(LOWORD(lparam), HIWORD(lparam));
+ break;
+
+ case WM_SIZING:
+ ControlResize(wparam, lparam);
+ break;
+
+ case PM_RESIZE_CHILDREN: {
+ ClientRect size(_hwnd);
+ Resize(size.right, size.bottom);
+ break;}
+
+ case WM_CLOSE:
+ ShowExitWindowsDialog(_hwnd);
+ break;
+
+ case WM_HOTKEY:
+ ProcessHotKey(wparam);
+ break;
+
+ case WM_COPYDATA:
+ return ProcessCopyData((COPYDATASTRUCT*)lparam);
+
+ case WM_CONTEXTMENU: {
+ PopupMenu menu(IDM_DESKTOPBAR);
+ SetMenuDefaultItem(menu, 0, MF_BYPOSITION);
+ menu.TrackPopupMenu(_hwnd, MAKEPOINTS(lparam));
+ break;}
+
+ case PM_GET_LAST_ACTIVE:
+ if (_hwndTaskBar)
+ return SendMessage(_hwndTaskBar, nmsg, wparam, lparam);
+ break;
+
+ case PM_REFRESH_CONFIG: ///@todo read desktop bar settings
+ SendMessage(_hwndNotify, PM_REFRESH_CONFIG, 0, 0);
+ break;
+
+ case WM_TIMER:
+ if (wparam == ID_TRAY_VOLUME) {
+ KillTimer(_hwnd, wparam);
+ launch_file(_hwnd, TEXT("sndvol32.exe"), SW_SHOWNORMAL, TEXT("-t")); // launch volume control in small mode
+ }
+ break;
+
+ case PM_GET_NOTIFYAREA:
+ return (LRESULT)(HWND)_hwndNotify;
+
+ default: def:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+int DesktopBar::Notify(int id, NMHDR* pnmh)
+{
+ if (pnmh->code == RBN_CHILDSIZE) {
+ /* align the task bands to the top, so it's in row with the Start button */
+ NMREBARCHILDSIZE* childSize = (NMREBARCHILDSIZE*)pnmh;
+
+ if (childSize->wID == IDW_TASKTOOLBAR) {
+ int cy = childSize->rcChild.top - childSize->rcBand.top;
+
+ if (cy) {
+ childSize->rcChild.bottom -= cy;
+ childSize->rcChild.top -= cy;
+ }
+ }
+ }
+
+ return 0;
+}
+
+void DesktopBar::Resize(int cx, int cy)
+{
+ ///@todo general children resizing algorithm
+ int quicklaunch_width = SendMessage(_hwndQuickLaunch, PM_GET_WIDTH, 0, 0);
+ int notifyarea_width = SendMessage(_hwndNotify, PM_GET_WIDTH, 0, 0);
+
+ HDWP hdwp = BeginDeferWindowPos(3);
+
+ if (_hwndrebar)
+ DeferWindowPos(hdwp, _hwndrebar, 0, _taskbar_pos, 1, cx-_taskbar_pos-(notifyarea_width+1), cy-2, SWP_NOZORDER|SWP_NOACTIVATE);
+ else {
+ if (_hwndQuickLaunch)
+ DeferWindowPos(hdwp, _hwndQuickLaunch, 0, _taskbar_pos, 1, quicklaunch_width, cy-2, SWP_NOZORDER|SWP_NOACTIVATE);
+
+ if (_hwndTaskBar)
+ DeferWindowPos(hdwp, _hwndTaskBar, 0, _taskbar_pos+quicklaunch_width, 0, cx-_taskbar_pos-quicklaunch_width-(notifyarea_width+1), cy, SWP_NOZORDER|SWP_NOACTIVATE);
+ }
+
+ if (_hwndNotify)
+ DeferWindowPos(hdwp, _hwndNotify, 0, cx-(notifyarea_width+1), 1, notifyarea_width, cy-2, SWP_NOZORDER|SWP_NOACTIVATE);
+
+ EndDeferWindowPos(hdwp);
+
+ WindowRect rect(_hwnd);
+ RECT work_area = {0, 0, GetSystemMetrics(SM_CXSCREEN), rect.top};
+ SystemParametersInfo(SPI_SETWORKAREA, 0, &work_area, 0); // don't use SPIF_SENDCHANGE because then we have to wait for any message being delivered
+ PostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETWORKAREA, 0);
+}
+
+
+int DesktopBar::Command(int id, int code)
+{
+ switch(id) {
+ case IDC_START:
+ ShowStartMenu();
+ break;
+
+ case ID_ABOUT_EXPLORER:
+ explorer_about(_hwnd);
+ break;
+
+ case ID_DESKTOPBAR_SETTINGS:
+ ExplorerPropertySheet(_hwnd);
+ break;
+
+ case ID_MINIMIZE_ALL:
+ g_Globals._desktops.ToggleMinimize();
+ break;
+
+ case ID_EXPLORE:
+ explorer_show_frame(SW_SHOWNORMAL);
+ break;
+
+ case ID_TASKMGR:
+ launch_file(_hwnd, TEXT("taskmgr.exe"), SW_SHOWNORMAL);
+ break;
+
+ case ID_SWITCH_DESKTOP_1:
+ case ID_SWITCH_DESKTOP_1+1:
+ case ID_SWITCH_DESKTOP_1+2:
+ case ID_SWITCH_DESKTOP_1+3: {
+ int desktop_idx = id - ID_SWITCH_DESKTOP_1;
+
+ g_Globals._desktops.SwitchToDesktop(desktop_idx);
+
+ if (_hwndQuickLaunch)
+ PostMessage(_hwndQuickLaunch, PM_UPDATE_DESKTOP, desktop_idx, 0);
+ break;}
+
+#ifdef _ROS_
+ case ID_TRAY_VOLUME:
+ launch_file(_hwnd, TEXT("sndvol32.exe"), SW_SHOWNORMAL); // launch volume control application
+ break;
+
+ case ID_VOLUME_PROPERTIES:
+ launch_cpanel(_hwnd, TEXT("mmsys.cpl"));
+ break;
+#endif
+
+ default:
+ if (_hwndQuickLaunch)
+ return SendMessage(_hwndQuickLaunch, WM_COMMAND, MAKEWPARAM(id,code), 0);
+ else
+ return 1;
+ }
+
+ return 0;
+}
+
+
+void DesktopBar::ShowStartMenu()
+{
+ if (_startMenuRoot)
+ _startMenuRoot->TrackStartmenu();
+}
+
+
+ /// copy data structure for tray notifications
+struct TrayNotifyCDS {
+ DWORD cookie;
+ DWORD notify_code;
+ NOTIFYICONDATA nicon_data;
+};
+
+LRESULT DesktopBar::ProcessCopyData(COPYDATASTRUCT* pcd)
+{
+ // Is this a tray notification message?
+ if (pcd->dwData == 1) {
+ TrayNotifyCDS* ptr = (TrayNotifyCDS*) pcd->lpData;
+
+ NotifyArea* notify_area = GET_WINDOW(NotifyArea, _hwndNotify);
+
+ if (notify_area)
+ return notify_area->ProcessTrayNotification(ptr->notify_code, &ptr->nicon_data);
+ }
+
+ return FALSE;
+}
+
+
+void DesktopBar::ControlResize(WPARAM wparam, LPARAM lparam)
+{
+ PRECT dragRect = (PRECT) lparam;
+ //int screenWidth = GetSystemMetrics(SM_CXSCREEN);
+ int screenHeight = GetSystemMetrics(SM_CYSCREEN);
+
+ ///@todo write code for taskbar being at sides or top.
+
+ switch(wparam) {
+ case WMSZ_BOTTOM: //@todo Taskbar is at the top of the screen
+ break;
+
+ case WMSZ_TOP: // Taskbar is at the bottom of the screen
+ dragRect->top = screenHeight - (((screenHeight - dragRect->top) + DESKTOPBARBAR_HEIGHT/2) / DESKTOPBARBAR_HEIGHT) * DESKTOPBARBAR_HEIGHT;
+ if (dragRect->top < screenHeight / 2)
+ dragRect->top = screenHeight - (screenHeight/2 / DESKTOPBARBAR_HEIGHT * DESKTOPBARBAR_HEIGHT);
+ else if (dragRect->top > screenHeight - 5)
+ dragRect->top = screenHeight - 5;
+ break;
+
+ case WMSZ_RIGHT: //@todo Taskbar is at the left of the screen
+ break;
+
+ case WMSZ_LEFT: //@todo Taskbar is at the right of the screen
+ break;
+ }
+}
+
+
+#ifdef _ROS_
+
+void DesktopBar::AddTrayIcons()
+{
+ _trayIcon.Add(SmallIcon(IDI_SPEAKER), ResString(IDS_VOLUME));
+}
+
+void DesktopBar::TrayClick(UINT id, int btn)
+{
+ switch(id) {
+ case ID_TRAY_VOLUME:
+ if (btn == TRAYBUTTON_LEFT)
+ SetTimer(_hwnd, ID_TRAY_VOLUME, 500, NULL); // wait a bit to correctly handle double clicks
+ else {
+ PopupMenu menu(IDM_VOLUME);
+ SetMenuDefaultItem(menu, 0, MF_BYPOSITION);
+ menu.TrackPopupMenuAtPos(_hwnd, GetMessagePos());
+ }
+ break;
+ }
+}
+
+void DesktopBar::TrayDblClick(UINT id, int btn)
+{
+ switch(id) {
+ case ID_TRAY_VOLUME:
+ KillTimer(_hwnd, ID_TRAY_VOLUME); // finish one-click timer
+ launch_file(_hwnd, TEXT("sndvol32.exe"), SW_SHOWNORMAL); // launch volume control application
+ break;
+ }
+}
+
+#endif
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer and Desktop clone
+ //
+ // desktopbar.h
+ //
+ // Martin Fuchs, 22.08.2003
+ //
+
+
+#define CLASSNAME_EXPLORERBAR TEXT("Shell_TrayWnd")
+#define TITLE_EXPLORERBAR TEXT("") // use an empty window title, so windows taskmanager does not show the window in its application list
+
+
+#define DESKTOPBARBAR_HEIGHT (GetSystemMetrics(SM_CYSIZE) + 5 * GetSystemMetrics(SM_CYEDGE))
+#define REBARBAND_HEIGHT (GetSystemMetrics(SM_CYSIZE) + 2 * GetSystemMetrics(SM_CYEDGE))
+
+
+#define IDC_START 0x1000
+#define IDC_LOGOFF 0x1001
+#define IDC_SHUTDOWN 0x1002
+#define IDC_LAUNCH 0x1003
+#define IDC_START_HELP 0x1004
+#define IDC_SEARCH_FILES 0x1005
+#define IDC_SEARCH_COMPUTER 0x1006
+#define IDC_SETTINGS 0x1007
+#define IDC_ADMIN 0x1008
+#define IDC_DOCUMENTS 0x1009
+#define IDC_RECENT 0x100A
+#define IDC_FAVORITES 0x100B
+#define IDC_PROGRAMS 0x100C
+#define IDC_EXPLORE 0x100D
+#define IDC_NETWORK 0x100E
+#define IDC_CONNECTIONS 0x100F
+#define IDC_DRIVES 0x1010
+#define IDC_CONTROL_PANEL 0x1011
+#define IDC_SETTINGS_MENU 0x1012
+#define IDC_PRINTERS 0x1013
+#define IDC_PRINTERS_MENU 0x1014
+#define IDC_BROWSE 0x1015
+#define IDC_SEARCH_PROGRAM 0x1016
+#define IDC_SEARCH 0x1017
+#define IDC_TERMINATE 0x1018
+
+#define IDC_FIRST_MENU 0x3000
+
+
+ /// desktop bar window, also known as "system tray"
+struct DesktopBar : public
+#ifdef _ROS_
+ TrayIconControllerTemplate<
+ OwnerDrawParent<Window> >
+#else
+ OwnerDrawParent<Window>
+#endif
+{
+#ifdef _ROS_
+ typedef TrayIconControllerTemplate<
+ OwnerDrawParent<Window> > super;
+#else
+ typedef OwnerDrawParent<Window> super;
+#endif
+
+ DesktopBar(HWND hwnd);
+ ~DesktopBar();
+
+ static HWND Create();
+
+protected:
+ RECT _work_area_org;
+ int _taskbar_pos;
+
+ LRESULT Init(LPCREATESTRUCT pcs);
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Notify(int id, NMHDR* pnmh);
+ int Command(int id, int code);
+
+ void Resize(int cx, int cy);
+ void ControlResize(WPARAM wparam, LPARAM lparam);
+ void RegisterHotkeys();
+ void ProcessHotKey(int id_hotkey);
+ void ShowStartMenu();
+ LRESULT ProcessCopyData(COPYDATASTRUCT* pcd);
+
+ WindowHandle _hwndTaskBar;
+ WindowHandle _hwndNotify;
+ WindowHandle _hwndQuickLaunch;
+ WindowHandle _hwndrebar;
+
+ struct StartMenuRoot* _startMenuRoot;
+
+#ifdef _ROS_
+ TrayIcon _trayIcon;
+
+ void AddTrayIcons();
+ virtual void TrayClick(UINT id, int btn);
+ virtual void TrayDblClick(UINT id, int btn);
+#else
+ const UINT WM_TASKBARCREATED;
+#endif
+};
+
+
+ /// special "Start" button with one click activation
+struct StartButton : public PictureButton
+{
+ typedef PictureButton super;
+
+ StartButton(HWND hwnd);
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+};
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer and Desktop clone
+ //
+ // favorites.cpp
+ //
+ // Martin Fuchs, 04.04.2004
+ //
+
+
+#include <precomp.h>
+
+#include "startmenu.h"
+
+
+String DecodeURLString(const char* s)
+{
+ TCHAR buffer[BUFFER_LEN];
+ LPTSTR o = buffer;
+
+ for(const char* p=s; *p; ++p)
+ if (*p == '%') {
+ if (!strncmp(p+1, "20", 2)) {
+ *o++ = ' ';
+ p += 2;
+ } else
+ *o++ = *p;
+ } else
+ *o++ = *p;
+
+ return String(buffer, o-buffer);
+}
+
+
+ /// read .URL file
+bool Bookmark::read_url(LPCTSTR path)
+{
+ char line[BUFFER_LEN];
+
+ tifstream in(path);
+
+ while(in.good()) {
+ in.getline(line, BUFFER_LEN);
+
+ const char* p = line;
+ while(isspace(*p))
+ ++p;
+
+ const char* keyword = p;
+ const char* eq = strchr(p, '=');
+
+ if (eq) {
+ const char* cont = eq + 1;
+ while(isspace(*cont))
+ ++cont;
+
+ if (!_strnicmp(keyword, "URL", 3))
+ _url = DecodeURLString(cont);
+ else if (!_strnicmp(keyword, "IconFile", 8))
+ _icon_path = DecodeURLString(cont);
+ }
+ }
+
+ return true;
+}
+
+ /// convert XBEL bookmark node
+bool Bookmark::read(const_XMLPos& pos)
+{
+ _url = pos.get("href").c_str();
+
+ if (pos.go_down("title")) {
+ _name = pos->get_content();
+ pos.back();
+ }
+
+ if (pos.go_down("desc")) {
+ _description = pos->get_content();
+ pos.back();
+ }
+
+ if (pos.go_down("info")) {
+ const_XMLChildrenFilter metadata(pos, "metadata");
+
+ for(const_XMLChildrenFilter::const_iterator it=metadata.begin(); it!=metadata.end(); ++it) {
+ const XMLNode& node = **it;
+ const_XMLPos sub_pos(&node);
+
+ if (node.get("owner") == "ros-explorer") {
+ if (sub_pos.go_down("icon")) {
+ _icon_path = sub_pos.get("path").c_str();
+ _icon_idx = XS_toi(sub_pos.get("index"));
+
+ sub_pos.back(); // </icon>
+ }
+ }
+ }
+
+ pos.back(); // </metadata>
+ pos.back(); // </info>
+ }
+
+ return !_url.empty(); // _url is mandatory.
+}
+
+ /// write XBEL bookmark node
+void Bookmark::write(XMLPos& pos) const
+{
+ pos.create("bookmark");
+
+ pos["href"] = _url.c_str();
+
+ if (!_name.empty()) {
+ pos.create("title");
+ pos->set_content(_name);
+ pos.back();
+ }
+
+ if (!_description.empty()) {
+ pos.create("desc");
+ pos->set_content(_description);
+ pos.back();
+ }
+
+ if (!_icon_path.empty()) {
+ pos.create("info");
+ pos.create("metadata");
+ pos["owner"] = "ros-explorer";
+ pos.create("icon");
+ pos["path"] = _icon_path.c_str();
+ pos["index"].printf(XS_TEXT("%d"), _icon_idx);
+ pos.back(); // </icon>
+ pos.back(); // </metadata>
+ pos.back(); // </info>
+ }
+
+ pos.back();
+}
+
+
+ /// read bookmark folder from XBEL formated XML tree
+void BookmarkFolder::read(const_XMLPos& pos)
+{
+ if (pos.go_down("title")) {
+ _name = pos->get_content();
+ pos.back();
+ }
+
+ if (pos.go_down("desc")) {
+ _description = pos->get_content();
+ pos.back();
+ }
+
+ _bookmarks.read(pos);
+}
+
+ /// write bookmark folder content from XBEL formated XML tree
+void BookmarkFolder::write(XMLPos& pos) const
+{
+ pos.create("folder");
+
+ if (!_name.empty()) {
+ pos.create("title");
+ pos->set_content(_name);
+ pos.back();
+ }
+
+ if (!_description.empty()) {
+ pos.create("desc");
+ pos->set_content(_description);
+ pos.back();
+ }
+
+ _bookmarks.write(pos);
+}
+
+
+BookmarkNode::BookmarkNode()
+ : _type(BMNT_NONE)
+{
+ _pbookmark = NULL;
+}
+
+BookmarkNode::BookmarkNode(const Bookmark& bm)
+ : _type(BMNT_BOOKMARK)
+{
+ _pbookmark = new Bookmark(bm);
+}
+
+BookmarkNode::BookmarkNode(const BookmarkFolder& bmf)
+ : _type(BMNT_FOLDER)
+{
+ _pfolder = new BookmarkFolder(bmf);
+}
+
+BookmarkNode::BookmarkNode(const BookmarkNode& other)
+ : _type(other._type)
+{
+ if (other._type == BMNT_BOOKMARK)
+ _pbookmark = new Bookmark(*other._pbookmark);
+ else if (other._type == BMNT_FOLDER)
+ _pfolder = new BookmarkFolder(*other._pfolder);
+ else
+ _pbookmark = NULL;
+}
+
+BookmarkNode::~BookmarkNode()
+{
+ if (_type == BMNT_BOOKMARK)
+ delete _pbookmark;
+ else if (_type == BMNT_FOLDER)
+ delete _pfolder;
+}
+
+BookmarkNode& BookmarkNode::operator=(const Bookmark& bm)
+{
+ clear();
+
+ _pbookmark = new Bookmark(bm);
+
+ return *this;
+}
+
+BookmarkNode& BookmarkNode::operator=(const BookmarkFolder& bmf)
+{
+ clear();
+
+ _pfolder = new BookmarkFolder(bmf);
+
+ return *this;
+}
+
+BookmarkNode& BookmarkNode::operator=(const BookmarkNode& other)
+{
+ clear();
+
+ _type = other._type;
+
+ if (other._type == BMNT_BOOKMARK)
+ _pbookmark = new Bookmark(*other._pbookmark);
+ else if (other._type == BMNT_FOLDER)
+ _pfolder = new BookmarkFolder(*other._pfolder);
+
+ return *this;
+}
+
+void BookmarkNode::clear()
+{
+ if (_type == BMNT_BOOKMARK) {
+ delete _pbookmark;
+ _pbookmark = NULL;
+ }
+ else if (_type == BMNT_FOLDER) {
+ delete _pfolder;
+ _pfolder = NULL;
+ }
+
+ _type = BMNT_NONE;
+}
+
+
+ /// read bookmark list from XBEL formated XML tree
+void BookmarkList::read(const_XMLPos& pos)
+{
+ const XMLNode::Children& children = pos->get_children();
+
+ for(XMLNode::Children::const_iterator it=children.begin(); it!=children.end(); ++it) {
+ const XMLNode& node = **it;
+ const_XMLPos sub_pos(&node);
+
+ if (node == "folder") {
+ BookmarkFolder folder;
+
+ folder.read(sub_pos);
+
+ push_back(folder);
+ } else if (node == "bookmark") {
+ Bookmark bookmark;
+
+ if (bookmark.read(sub_pos))
+ push_back(bookmark);
+ }
+ }
+}
+
+ /// write bookmark list into XBEL formated XML tree
+void BookmarkList::write(XMLPos& pos) const
+{
+ for(const_iterator it=begin(); it!=end(); ++it) {
+ const BookmarkNode& node = *it;
+
+ if (node._type == BookmarkNode::BMNT_FOLDER) {
+ const BookmarkFolder& folder = *node._pfolder;
+
+ folder.write(pos);
+
+ pos.back();
+ } else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
+ const Bookmark& bookmark = *node._pbookmark;
+
+ if (!bookmark._url.empty())
+ bookmark.write(pos);
+ }
+ }
+}
+
+
+ /// fill treeview control with bookmark tree content
+void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist, HDC hdc_wnd) const
+{
+ TV_INSERTSTRUCT tvi;
+
+ tvi.hParent = parent;
+ tvi.hInsertAfter = TVI_LAST;
+
+ TV_ITEM& tv = tvi.item;
+ tv.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM;
+
+ for(const_iterator it=begin(); it!=end(); ++it) {
+ const BookmarkNode& node = *it;
+
+ tv.lParam = (LPARAM)&node;
+
+ if (node._type == BookmarkNode::BMNT_FOLDER) {
+ const BookmarkFolder& folder = *node._pfolder;
+
+ tv.pszText = (LPTSTR)folder._name.c_str();
+ tv.iImage = 3; // folder
+ tv.iSelectedImage = 4; // open folder
+ HTREEITEM hitem = TreeView_InsertItem(hwnd, &tvi);
+
+ folder._bookmarks.fill_tree(hwnd, hitem, himagelist, hdc_wnd);
+ } else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
+ const Bookmark& bookmark = *node._pbookmark;
+
+ tv.pszText = (LPTSTR)bookmark._name.c_str();
+ tv.iImage = 1; // bookmark
+ tv.iSelectedImage = 2; // selected bookmark
+
+ if (!bookmark._icon_path.empty()) {
+ const Icon& icon = g_Globals._icon_cache.extract(bookmark._icon_path, bookmark._icon_idx);
+
+ if ((ICON_ID)icon != ICID_NONE)
+ tv.iImage = tv.iSelectedImage = icon.add_to_imagelist(himagelist, hdc_wnd);
+ }
+
+ (void)TreeView_InsertItem(hwnd, &tvi);
+ }
+ }
+}
+
+
+ /// import Internet Explorer bookmarks from Favorites folder into bookmark list
+void BookmarkList::import_IE_favorites(ShellDirectory& dir, HWND hwnd)
+{
+ TCHAR path[MAX_PATH], ext[_MAX_EXT];
+
+ dir.smart_scan(SORT_NAME, SCAN_DONT_EXTRACT_ICONS);
+
+ for(Entry*entry=dir._down; entry; entry=entry->_next) {
+ if (entry->_shell_attribs & SFGAO_HIDDEN) // ignore files like "desktop.ini"
+ continue;
+
+ String name;
+
+ if (entry->_etype == ET_SHELL)
+ name = dir._folder.get_name(static_cast<ShellEntry*>(entry)->_pidl);
+ else
+ name = entry->_display_name;
+
+ if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ BookmarkFolder new_folder;
+
+ new_folder._name = DecodeXMLString(name);
+
+ if (entry->_etype == ET_SHELL) {
+ ShellDirectory new_dir(dir._folder, static_cast<ShellEntry*>(entry)->_pidl, hwnd);
+ new_folder._bookmarks.import_IE_favorites(new_dir, hwnd);
+ } else {
+ entry->get_path(path, COUNTOF(path));
+ ShellDirectory new_dir(GetDesktopFolder(), path, hwnd);
+ new_folder._bookmarks.import_IE_favorites(new_dir, hwnd);
+ }
+
+ push_back(new_folder);
+ } else {
+ Bookmark bookmark;
+
+ bookmark._name = DecodeXMLString(name);
+
+ entry->get_path(path, COUNTOF(path));
+ _tsplitpath_s(path, NULL, 0, NULL, 0, NULL, 0, ext, COUNTOF(ext));
+
+ if (!_tcsicmp(ext, TEXT(".url"))) {
+ bookmark.read_url(path);
+ push_back(bookmark);
+ } else {
+ ///@todo read shell links
+ //assert(0);
+ }
+ }
+ }
+}
+
+
+ /// read XBEL bookmark file
+bool Favorites::read(LPCTSTR path)
+{
+ XMLDoc xbel;
+
+ if (!xbel.read(path))
+ if (xbel._last_error == XML_ERROR_NO_ELEMENTS)
+ return false;
+ else
+ MessageBox(g_Globals._hwndDesktop, String(xbel._last_error_msg.c_str()),
+ TEXT("ROS Explorer - reading bookmark file"), MB_OK);
+
+ const_XMLPos pos(&xbel);
+
+ if (!pos.go_down("xbel"))
+ return false;
+
+ super::read(pos);
+
+ pos.back();
+
+ return true;
+}
+
+ /// write XBEL bookmark file
+void Favorites::write(LPCTSTR path) const
+{
+ XMLDoc xbel;
+
+ XMLPos pos(&xbel);
+ pos.create("xbel");
+ super::write(pos);
+ pos.back();
+
+ xbel._header._doctype = "<!DOCTYPE xbel"
+ " PUBLIC \"+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML\"\n"
+ " \"http://www.python.org/topics/xml/dtds/xbel-1.0.dtd\">";
+
+ xbel.write(path);
+}
+
+ /// import Internet Explorer bookmarks from Favorites folder
+bool Favorites::import_IE_favorites(HWND hwnd)
+{
+ WaitCursor wait;
+
+ StartMenuShellDirs dirs;
+
+ try {
+ dirs.push_back(ShellDirectory(GetDesktopFolder(), SpecialFolderPath(CSIDL_COMMON_FAVORITES, hwnd), hwnd));
+ dirs.push_back(ShellDirectory(GetDesktopFolder(), SpecialFolderPath(CSIDL_FAVORITES, hwnd), hwnd));
+ } catch(COMException&) {
+ }
+
+ for(StartMenuShellDirs::iterator it=dirs.begin(); it!=dirs.end(); ++it) {
+ StartMenuDirectory& smd = *it;
+ ShellDirectory& dir = smd._dir;
+
+ try {
+ super::import_IE_favorites(dir, hwnd);
+ } catch(COMException&) {
+ }
+ }
+
+ return true;
+}
--- /dev/null
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer and Desktop clone
+ //
+ // favorites.h
+ //
+ // Martin Fuchs, 04.04.2004
+ //
+
+
+extern String DecodeURLString(const char* s);
+
+
+struct Bookmark
+{
+ Bookmark() : _icon_idx(0) {}
+
+ String _name;
+ String _description;
+ String _url;
+ String _icon_path;
+ int _icon_idx;
+
+ bool read_url(LPCTSTR path);
+ bool read(const_XMLPos& pos);
+ void write(XMLPos& pos) const;
+};
+
+struct BookmarkFolder;
+
+struct BookmarkNode
+{
+ BookmarkNode();
+ BookmarkNode(const Bookmark& bm);
+ BookmarkNode(const BookmarkFolder& bmf);
+ BookmarkNode(const BookmarkNode& other);
+
+ ~BookmarkNode();
+
+ BookmarkNode& operator=(const Bookmark& bm);
+ BookmarkNode& operator=(const BookmarkFolder& bmf);
+ BookmarkNode& operator=(const BookmarkNode& other);
+
+ void clear();
+
+ enum BOOKMARKNODE_TYPE {
+ BMNT_NONE, BMNT_BOOKMARK, BMNT_FOLDER
+ };
+
+ BOOKMARKNODE_TYPE _type;
+
+ union {
+ Bookmark* _pbookmark;
+ BookmarkFolder* _pfolder;
+ };
+};
+
+struct BookmarkList : public list<BookmarkNode>
+{
+ void import_IE_favorites(struct ShellDirectory& dir, HWND hwnd);
+
+ void read(const_XMLPos& pos);
+ void write(XMLPos& pos) const;
+
+ void fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST, HDC hdc_wnd) const;
+};
+
+struct BookmarkFolder
+{
+ String _name;
+ String _description;
+ BookmarkList _bookmarks;
+
+ void read(const_XMLPos& pos);
+ void write(XMLPos& pos) const;
+};
+
+struct Favorites : public BookmarkList
+{
+ typedef BookmarkList super;
+
+ bool read(LPCTSTR path);
+ void write(LPCTSTR path) const;
+
+ bool import_IE_favorites(HWND hwnd);
+};
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // quicklaunch.cpp
+ //
+ // Martin Fuchs, 22.08.2003
+ //
+
+
+#include <precomp.h>
+
+#include "../resource.h"
+
+#include "quicklaunch.h"
+
+
+QuickLaunchEntry::QuickLaunchEntry()
+{
+ _hbmp = 0;
+}
+
+QuickLaunchMap::~QuickLaunchMap()
+{
+ while(!empty()) {
+ iterator it = begin();
+ DeleteBitmap(it->second._hbmp);
+ erase(it);
+ }
+}
+
+
+QuickLaunchBar::QuickLaunchBar(HWND hwnd)
+ : super(hwnd)
+{
+ CONTEXT("QuickLaunchBar::QuickLaunchBar()");
+
+ _dir = NULL;
+ _next_id = IDC_FIRST_QUICK_ID;
+ _btn_dist = 20;
+ _size = 0;
+
+ HWND hwndToolTip = (HWND) SendMessage(hwnd, TB_GETTOOLTIPS, 0, 0);
+
+ SetWindowStyle(hwndToolTip, GetWindowStyle(hwndToolTip)|TTS_ALWAYSTIP);
+
+ // delay refresh to some time later
+ PostMessage(hwnd, PM_REFRESH, 0, 0);
+}
+
+QuickLaunchBar::~QuickLaunchBar()
+{
+ delete _dir;
+}
+
+HWND QuickLaunchBar::Create(HWND hwndParent)
+{
+ CONTEXT("QuickLaunchBar::Create()");
+
+ ClientRect clnt(hwndParent);
+
+ HWND hwnd = CreateToolbarEx(hwndParent,
+ WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
+ CCS_TOP|CCS_NODIVIDER|CCS_NOPARENTALIGN|CCS_NORESIZE|
+ TBSTYLE_TOOLTIPS|TBSTYLE_WRAPABLE|TBSTYLE_FLAT,
+ IDW_QUICKLAUNCHBAR, 0, 0, 0, NULL, 0, 0, 0, 16, 16, sizeof(TBBUTTON));
+
+ if (hwnd)
+ new QuickLaunchBar(hwnd);
+
+ return hwnd;
+}
+
+void QuickLaunchBar::AddShortcuts()
+{
+ CONTEXT("QuickLaunchBar::AddShortcuts()");
+
+ WaitCursor wait;
+
+ try {
+ TCHAR path[MAX_PATH];
+
+ SpecialFolderFSPath app_data(CSIDL_APPDATA, _hwnd); ///@todo perhaps also look into CSIDL_COMMON_APPDATA ?
+
+ _stprintf(path, TEXT("%s\\")QUICKLAUNCH_FOLDER, (LPCTSTR)app_data);
+
+ RecursiveCreateDirectory(path);
+ _dir = new ShellDirectory(GetDesktopFolder(), path, _hwnd);
+
+ _dir->smart_scan(SORT_NAME);
+
+ // immediatelly extract the shortcut icons
+ for(Entry*entry=_dir->_down; entry; entry=entry->_next)
+ entry->_icon_id = entry->safe_extract_icon(ICF_NORMAL);
+ } catch(COMException&) {
+ return;
+ }
+
+
+ ShellFolder desktop_folder;
+ WindowCanvas canvas(_hwnd);
+
+ COLORREF bk_color = GetSysColor(COLOR_BTNFACE);
+ HBRUSH bk_brush = GetSysColorBrush(COLOR_BTNFACE);
+
+ AddButton(ID_MINIMIZE_ALL, g_Globals._icon_cache.get_icon(ICID_MINIMIZE).create_bitmap(bk_color, bk_brush, canvas), ResString(IDS_MINIMIZE_ALL), NULL);
+ AddButton(ID_EXPLORE, g_Globals._icon_cache.get_icon(ICID_EXPLORER).create_bitmap(bk_color, bk_brush, canvas), ResString(IDS_TITLE), NULL);
+
+ TBBUTTON sep = {0, -1, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0};
+ SendMessage(_hwnd, TB_INSERTBUTTON, INT_MAX, (LPARAM)&sep);
+
+ int cur_desktop = g_Globals._desktops._current_desktop;
+ ResString desktop_fmt(IDS_DESKTOP_NUM);
+
+ HDC hdc = CreateCompatibleDC(canvas);
+ DWORD size = SendMessage(_hwnd, TB_GETBUTTONSIZE, 0, 0);
+ int cx = LOWORD(size);
+ int cy = HIWORD(size);
+ RECT rect = {0, 0, cx, cy};
+ RECT textRect = {0, 0, cx-7, cy-7};
+
+ for(int i=0; i<DESKTOP_COUNT; ++i) {
+ HBITMAP hbmp = CreateCompatibleBitmap(canvas, cx, cy);
+ HBITMAP hbmp_old = SelectBitmap(hdc, hbmp);
+
+ FmtString num_txt(TEXT("%d"), i+1);
+ TextColor color(hdc, RGB(64,64,64));
+ BkMode mode(hdc, TRANSPARENT);
+ FillRect(hdc, &rect, GetSysColorBrush(COLOR_BTNFACE));
+ DrawText(hdc, num_txt, num_txt.length(), &textRect, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
+
+ SelectBitmap(hdc, hbmp_old);
+
+ AddButton(ID_SWITCH_DESKTOP_1+i, hbmp, FmtString(desktop_fmt, i+1), NULL, cur_desktop==i?TBSTATE_ENABLED|TBSTATE_CHECKED:TBSTATE_ENABLED);
+ }
+ DeleteDC(hdc);
+
+ SendMessage(_hwnd, TB_INSERTBUTTON, INT_MAX, (LPARAM)&sep);
+
+ for(Entry*entry=_dir->_down; entry; entry=entry->_next) {
+ // hide files like "desktop.ini"
+ if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
+ continue;
+
+ // hide subfolders
+ if (!(entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
+ HBITMAP hbmp = g_Globals._icon_cache.get_icon(entry->_icon_id).create_bitmap(bk_color, bk_brush, canvas);
+
+ AddButton(_next_id++, hbmp, entry->_display_name, entry); //entry->_etype==ET_SHELL? desktop_folder.get_name(static_cast<ShellEntry*>(entry)->_pidl): entry->_display_name);
+ }
+ }
+
+ _btn_dist = LOWORD(SendMessage(_hwnd, TB_GETBUTTONSIZE, 0, 0));
+ _size = _entries.size() * _btn_dist;
+
+ SendMessage(GetParent(_hwnd), PM_RESIZE_CHILDREN, 0, 0);
+}
+
+void QuickLaunchBar::AddButton(int id, HBITMAP hbmp, LPCTSTR name, Entry* entry, int flags)
+{
+ TBADDBITMAP ab = {0, (UINT_PTR)hbmp};
+ int bmp_idx = SendMessage(_hwnd, TB_ADDBITMAP, 1, (LPARAM)&ab);
+
+ QuickLaunchEntry qle;
+
+ qle._hbmp = hbmp;
+ qle._title = name;
+ qle._entry = entry;
+
+ _entries[id] = qle;
+
+ TBBUTTON btn = {0, 0, flags, BTNS_BUTTON|BTNS_NOPREFIX, {0, 0}, 0, 0};
+
+ btn.idCommand = id;
+ btn.iBitmap = bmp_idx;
+
+ SendMessage(_hwnd, TB_INSERTBUTTON, INT_MAX, (LPARAM)&btn);
+}
+
+void QuickLaunchBar::UpdateDesktopButtons(int desktop_idx)
+{
+ for(int i=0; i<DESKTOP_COUNT; ++i) {
+ TBBUTTONINFO tbi = {sizeof(TBBUTTONINFO), TBIF_STATE, 0, 0, desktop_idx==i? TBSTATE_ENABLED|TBSTATE_CHECKED: TBSTATE_ENABLED};
+
+ SendMessage(_hwnd, TB_SETBUTTONINFO, ID_SWITCH_DESKTOP_1+i, (LPARAM)&tbi);
+ }
+}
+
+LRESULT QuickLaunchBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case PM_REFRESH:
+ AddShortcuts();
+ break;
+
+ case PM_GET_WIDTH: {
+ // take line wrapping into account
+ int btns = SendMessage(_hwnd, TB_BUTTONCOUNT, 0, 0);
+ int rows = SendMessage(_hwnd, TB_GETROWS, 0, 0);
+
+ if (rows<2 || rows==btns)
+ return _size;
+
+ RECT rect;
+ int max_cx = 0;
+
+ for(QuickLaunchMap::const_iterator it=_entries.begin(); it!=_entries.end(); ++it) {
+ SendMessage(_hwnd, TB_GETRECT, it->first, (LPARAM)&rect);
+
+ if (rect.right > max_cx)
+ max_cx = rect.right;
+ }
+
+ return max_cx;}
+
+ case PM_UPDATE_DESKTOP:
+ UpdateDesktopButtons(wparam);
+ break;
+
+ case WM_CONTEXTMENU: {
+ TBBUTTON btn;
+ QuickLaunchMap::iterator it;
+ Point screen_pt(lparam), clnt_pt=screen_pt;
+ ScreenToClient(_hwnd, &clnt_pt);
+
+ Entry* entry = NULL;
+ int idx = SendMessage(_hwnd, TB_HITTEST, 0, (LPARAM)&clnt_pt);
+
+ if (idx>=0 &&
+ SendMessage(_hwnd, TB_GETBUTTON, idx, (LPARAM)&btn)!=-1 &&
+ (it=_entries.find(btn.idCommand))!=_entries.end()) {
+ entry = it->second._entry;
+ }
+
+ if (entry) // entry is NULL for desktop switch buttons
+ CHECKERROR(entry->do_context_menu(_hwnd, screen_pt, _cm_ifs));
+ else
+ goto def;
+ break;}
+
+ default: def:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+int QuickLaunchBar::Command(int id, int code)
+{
+ CONTEXT("QuickLaunchBar::Command()");
+
+ if ((id&~0xFF) == IDC_FIRST_QUICK_ID) {
+ QuickLaunchEntry& qle = _entries[id];
+
+ if (qle._entry) {
+ qle._entry->launch_entry(_hwnd);
+ return 0;
+ }
+ }
+
+ return 0; // Don't return 1 to avoid recursion with DesktopBar::Command()
+}
+
+int QuickLaunchBar::Notify(int id, NMHDR* pnmh)
+{
+ switch(pnmh->code) {
+ case TTN_GETDISPINFO: {
+ NMTTDISPINFO* ttdi = (NMTTDISPINFO*) pnmh;
+
+ int id = ttdi->hdr.idFrom;
+ ttdi->lpszText = _entries[id]._title.str();
+#ifdef TTF_DI_SETITEM
+ ttdi->uFlags |= TTF_DI_SETITEM;
+#endif
+
+ // enable multiline tooltips (break at CR/LF and for very long one-line strings)
+ SendMessage(pnmh->hwndFrom, TTM_SETMAXTIPWIDTH, 0, 400);
+
+ break;}
+
+ return super::Notify(id, pnmh);
+ }
+
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer and Desktop clone
+ //
+ // quicklaunch.h
+ //
+ // Martin Fuchs, 22.08.2003
+ //
+
+
+#define QUICKLAUNCH_WIDTH_DEF 70
+#define QUICKLAUNCH_WIDTH_DEF 70
+
+#define IDW_QUICKLAUNCHBAR 101
+
+#define PM_UPDATE_DESKTOP (WM_APP+0x23)
+
+#define IDC_FIRST_QUICK_ID 0x4000
+
+
+#define QUICKLAUNCH_FOLDER TEXT("Microsoft\\Internet Explorer\\Quick Launch")
+
+
+ /// quick launch bar shortcut
+struct QuickLaunchEntry
+{
+ QuickLaunchEntry();
+
+ HBITMAP _hbmp;
+ String _title;
+ Entry* _entry;
+};
+
+ /// map for managing the task bar buttons
+struct QuickLaunchMap : public map<int, QuickLaunchEntry>
+{
+ ~QuickLaunchMap();
+};
+
+
+ /// quick launch bar window
+struct QuickLaunchBar : public ExtContextMenuHandlerT<SubclassedWindow>
+{
+ typedef ExtContextMenuHandlerT<SubclassedWindow> super;
+
+ QuickLaunchBar(HWND hwnd);
+ ~QuickLaunchBar();
+
+ static HWND Create(HWND hwndParent);
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Command(int id, int code);
+ int Notify(int id, NMHDR* pnmh);
+
+ ShellDirectory* _dir;
+
+ int _next_id;
+ QuickLaunchMap _entries;
+ int _btn_dist;
+ int _size;
+
+ void AddShortcuts();
+ void AddButton(int id, HBITMAP hbmp, LPCTSTR name, Entry* entry, int flags=TBSTATE_ENABLED);
+ void UpdateDesktopButtons(int desktop_idx);
+};
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // startmenu.cpp
+ //
+ // Explorer start menu
+ //
+ // Martin Fuchs, 19.08.2003
+ //
+ // Credits: Thanks to Everaldo (http://www.everaldo.com) for his nice looking icons.
+ //
+
+
+#include <precomp.h>
+
+#include "../resource.h"
+
+#include "desktopbar.h"
+#include "startmenu.h"
+
+#include "../dialogs/searchprogram.h"
+#include "../dialogs/settings.h"
+
+
+#define SHELLPATH_CONTROL_PANEL TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}")
+#define SHELLPATH_PRINTERS TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}")
+#define SHELLPATH_NET_CONNECTIONS TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}")
+
+
+StartMenu::StartMenu(HWND hwnd, int icon_size)
+ : super(hwnd),
+ _icon_size(icon_size)
+{
+ _next_id = IDC_FIRST_MENU;
+ _submenu_id = 0;
+
+ _border_left = 0;
+ _border_top = 0;
+ _bottom_max = INT_MAX;
+
+ _floating_btn = false;
+ _arrow_btns = false;
+ _scroll_mode = SCROLL_NOT;
+ _scroll_pos = 0;
+ _invisible_lines = 0;
+
+ _last_pos = WindowRect(hwnd).pos();
+#ifdef _LIGHT_STARTMENU
+ _selected_id = -1;
+ _last_mouse_pos = 0;
+#endif
+}
+
+StartMenu::StartMenu(HWND hwnd, const StartMenuCreateInfo& create_info, int icon_size)
+ : super(hwnd),
+ _create_info(create_info),
+ _icon_size(icon_size)
+{
+ for(StartMenuFolders::const_iterator it=create_info._folders.begin(); it!=create_info._folders.end(); ++it)
+ if (*it)
+ _dirs.push_back(ShellDirectory(GetDesktopFolder(), *it, _hwnd));
+
+ _next_id = IDC_FIRST_MENU;
+ _submenu_id = 0;
+
+ _border_left = 0;
+ _border_top = create_info._border_top;
+ _bottom_max = INT_MAX;
+
+ _floating_btn = create_info._border_top? true: false;
+ _arrow_btns = false;
+ _scroll_mode = SCROLL_NOT;
+ _scroll_pos = 0;
+ _invisible_lines = 0;
+
+ _last_pos = WindowRect(hwnd).pos();
+#ifdef _LIGHT_STARTMENU
+ _selected_id = -1;
+ _last_mouse_pos = 0;
+#endif
+}
+
+StartMenu::~StartMenu()
+{
+ SendParent(PM_STARTMENU_CLOSED);
+}
+
+
+ // We need this wrapper function for s_wcStartMenu, it calls the WIN32 API,
+ // though static C++ initializers are not allowed for Winelib applications.
+BtnWindowClass& StartMenu::GetWndClasss()
+{
+ static BtnWindowClass s_wcStartMenu(CLASSNAME_STARTMENU);
+
+ return s_wcStartMenu;
+}
+
+
+Window::CREATORFUNC_INFO StartMenu::s_def_creator = STARTMENU_CREATOR(StartMenu);
+
+HWND StartMenu::Create(int x, int y, const StartMenuFolders& folders, HWND hwndParent, LPCTSTR title,
+ CREATORFUNC_INFO creator, void* info, const String& filter)
+{
+ UINT style, ex_style;
+ int top_height;
+
+ if (hwndParent) {
+ style = WS_POPUP|WS_THICKFRAME|WS_CLIPCHILDREN|WS_VISIBLE;
+ ex_style = 0;
+ top_height = STARTMENU_TOP_BTN_SPACE;
+ } else {
+ style = WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_CLIPCHILDREN|WS_VISIBLE;
+ ex_style = WS_EX_TOOLWINDOW;
+ top_height = 0;
+ }
+
+ int icon_size = ICON_SIZE_SMALL;
+ RECT rect = {x, y-STARTMENU_LINE_HEIGHT(icon_size)-top_height, x+STARTMENU_WIDTH_MIN, y};
+
+#ifndef _LIGHT_STARTMENU
+ rect.top += STARTMENU_LINE_HEIGHT(icon_size);
+#endif
+
+ AdjustWindowRectEx(&rect, style, FALSE, ex_style);
+
+ StartMenuCreateInfo create_info;
+
+ create_info._folders = folders;
+ create_info._border_top = top_height;
+ create_info._creator = creator;
+ create_info._info = info;
+ create_info._filter = filter;
+
+ if (title)
+ create_info._title = title;
+
+ HWND hwnd = Window::Create(creator, &create_info, ex_style, GetWndClasss(), title,
+ style, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, hwndParent);
+
+ // make sure the window is not off the screen
+ MoveVisible(hwnd);
+
+ return hwnd;
+}
+
+
+LRESULT StartMenu::Init(LPCREATESTRUCT pcs)
+{
+ try {
+ AddEntries();
+
+ if (super::Init(pcs))
+ return 1;
+
+ // create buttons for registered entries in _entries
+ for(ShellEntryMap::const_iterator it=_entries.begin(); it!=_entries.end(); ++it) {
+ const StartMenuEntry& sme = it->second;
+ bool hasSubmenu = false;
+
+ for(ShellEntrySet::const_iterator it=sme._entries.begin(); it!=sme._entries.end(); ++it)
+ if ((*it)->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ hasSubmenu = true;
+
+#ifdef _LIGHT_STARTMENU
+ _buttons.push_back(SMBtnInfo(sme, it->first, hasSubmenu));
+#else
+ AddButton(sme._title, sme._hIcon, hasSubmenu, it->first);
+#endif
+ }
+
+#ifdef _LIGHT_STARTMENU
+ if (_buttons.empty())
+#else
+ if (!GetWindow(_hwnd, GW_CHILD))
+#endif
+ AddButton(ResString(IDS_EMPTY), ICID_NONE, false, 0, false);
+
+#ifdef _LIGHT_STARTMENU
+ ResizeToButtons();
+#endif
+
+#ifdef _LAZY_ICONEXTRACT
+ PostMessage(_hwnd, PM_UPDATE_ICONS, 0, 0);
+#endif
+ } catch(COMException& e) {
+ HandleException(e, pcs->hwndParent); // destroys the start menu window while switching focus
+ }
+
+ return 0;
+}
+
+void StartMenu::AddEntries()
+{
+ for(StartMenuShellDirs::iterator it=_dirs.begin(); it!=_dirs.end(); ++it) {
+ StartMenuDirectory& smd = *it;
+ ShellDirectory& dir = smd._dir;
+
+ if (!dir._scanned) {
+ WaitCursor wait;
+
+#ifdef _LAZY_ICONEXTRACT
+ dir.smart_scan(SORT_NAME, SCAN_DONT_EXTRACT_ICONS); // lazy icon extraction, try to read directly from filesystem
+#else
+ dir.smart_scan(SORT_NAME);
+#endif
+ }
+
+ AddShellEntries(dir, -1, smd._ignore);
+ }
+}
+
+
+static LPTSTR trim_path_slash(LPTSTR path)
+{
+ LPTSTR p = path;
+
+ while(*p)
+ ++p;
+
+ if (p>path && (p[-1]=='\\' || p[-1]=='/'))
+ *--p = '\0';
+
+ return path;
+}
+
+void StartMenu::AddShellEntries(const ShellDirectory& dir, int max, const String& ignore)
+{
+ TCHAR ignore_path[MAX_PATH], ignore_dir[MAX_PATH], ignore_name[_MAX_FNAME], ignore_ext[_MAX_EXT];
+ TCHAR dir_path[MAX_PATH];
+
+ if (!ignore.empty()) {
+ _tsplitpath_s(ignore, ignore_path, COUNTOF(ignore_path), ignore_dir, COUNTOF(ignore_dir), ignore_name, COUNTOF(ignore_name), ignore_ext, COUNTOF(ignore_ext));
+
+ _tcscat(ignore_path, ignore_dir);
+ _tcscat(ignore_name, ignore_ext);
+
+ dir.get_path(dir_path, COUNTOF(dir_path));
+
+ if (_tcsicmp(trim_path_slash(dir_path), trim_path_slash(ignore_path)))
+ *ignore_name = '\0';
+ } else
+ *ignore_name = '\0';
+
+ String lwr_filter = _create_info._filter;
+ lwr_filter.toLower();
+
+ int cnt = 0;
+ for(Entry*entry=dir._down; entry; entry=entry->_next) {
+ // hide files like "desktop.ini"
+ if (entry->_shell_attribs & SFGAO_HIDDEN)
+ //not appropriate for drive roots: if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
+ continue;
+
+ // hide "Programs" subfolders if requested
+ if (*ignore_name && !_tcsicmp(entry->_data.cFileName, ignore_name))
+ continue;
+
+ // only 'max' entries shall be added.
+ if (++cnt == max)
+ break;
+
+ // filter only non-directory entries
+ if (!(entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && !lwr_filter.empty()) {
+ String lwr_name = entry->_data.cFileName;
+ String lwr_disp = entry->_display_name;
+
+ lwr_name.toLower();
+ lwr_disp.toLower();
+
+ if (!_tcsstr(lwr_name,lwr_filter) && !_tcsstr(lwr_disp,lwr_filter))
+ continue;
+ }
+
+ if (entry->_etype == ET_SHELL)
+ AddEntry(dir._folder, static_cast<ShellEntry*>(entry));
+ else
+ AddEntry(dir._folder, entry);
+ }
+}
+
+
+LRESULT StartMenu::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_PAINT: {
+ PaintCanvas canvas(_hwnd);
+ Paint(canvas);
+ break;}
+
+ case WM_SIZE:
+ ResizeButtons(LOWORD(lparam)-_border_left);
+ break;
+
+ case WM_MOVE: {
+ const POINTS& pos = MAKEPOINTS(lparam);
+
+ // move open submenus of floating menus
+ if (_submenu) {
+ int dx = pos.x - _last_pos.x;
+ int dy = pos.y - _last_pos.y;
+
+ if (dx || dy) {
+ WindowRect rt(_submenu);
+ SetWindowPos(_submenu, 0, rt.left+dx, rt.top+dy, 0, 0, SWP_NOSIZE|SWP_NOACTIVATE);
+ //MoveVisible(_submenu);
+ }
+ }
+
+ _last_pos.x = pos.x;
+ _last_pos.y = pos.y;
+ goto def;}
+
+ case WM_NCHITTEST: {
+ LRESULT res = super::WndProc(nmsg, wparam, lparam);
+
+ if (res>=HTSIZEFIRST && res<=HTSIZELAST)
+ return HTCLIENT; // disable window resizing
+
+ return res;}
+
+ case WM_LBUTTONDOWN: {
+ RECT rect;
+
+ // check mouse cursor for coordinates of floating button
+ GetFloatingButtonRect(&rect);
+
+ if (PtInRect(&rect, Point(lparam))) {
+ // create a floating copy of the current start menu
+ WindowRect pos(_hwnd);
+
+ ///@todo do something similar to StartMenuRoot::TrackStartmenu() in order to automatically close submenus when clicking on the desktop background
+ StartMenu::Create(pos.left+3, pos.bottom-3, _create_info._folders, 0, _create_info._title, _create_info._creator, _create_info._info);
+ CloseStartMenu();
+ }
+
+#ifdef _LIGHT_STARTMENU
+ int id = ButtonHitTest(Point(lparam));
+
+ if (id)
+ Command(id, BN_CLICKED);
+#endif
+ break;}
+
+ case WM_SYSCOMMAND:
+ if ((wparam&0xFFF0) == SC_SIZE)
+ return 0; // disable window resizing
+ goto def;
+
+ case WM_ACTIVATEAPP:
+ // close start menu when activating another application
+ if (!wparam)
+ CloseStartMenu();
+ break; // don't call super::WndProc in case "this" has been deleted
+
+ case WM_CANCELMODE:
+ CloseStartMenu();
+
+#ifdef _LIGHT_STARTMENU
+ if (_scroll_mode != SCROLL_NOT) {
+ ReleaseCapture();
+ KillTimer(_hwnd, 0);
+ }
+#endif
+ break;
+
+#ifdef _LIGHT_STARTMENU
+ case WM_MOUSEMOVE: {
+ // automatically set the focus to startmenu entries when moving the mouse over them
+ if (lparam != _last_mouse_pos) { // don't process WM_MOUSEMOVE when opening submenus using keyboard navigation
+ Point pt(lparam);
+
+ if (_arrow_btns) {
+ RECT rect_up, rect_down;
+
+ GetArrowButtonRects(&rect_up, &rect_down, _icon_size);
+
+ SCROLL_MODE scroll_mode = SCROLL_NOT;
+
+ if (PtInRect(&rect_up, pt))
+ scroll_mode = SCROLL_UP;
+ else if (PtInRect(&rect_down, pt))
+ scroll_mode = SCROLL_DOWN;
+
+ if (scroll_mode != _scroll_mode) {
+ if (scroll_mode == SCROLL_NOT) {
+ ReleaseCapture();
+ KillTimer(_hwnd, 0);
+ } else {
+ CloseSubmenus();
+ SetTimer(_hwnd, 0, 150, NULL); // 150 ms scroll interval
+ SetCapture(_hwnd);
+ }
+
+ _scroll_mode = scroll_mode;
+ }
+ }
+
+ int new_id = ButtonHitTest(pt);
+
+ if (new_id > 0 && new_id != _selected_id)
+ SelectButton(new_id);
+
+ _last_mouse_pos = lparam;
+ }
+ break;}
+
+ case WM_TIMER:
+ if (_scroll_mode == SCROLL_UP) {
+ if (_scroll_pos > 0) {
+ --_scroll_pos;
+ InvalidateRect(_hwnd, NULL, TRUE);
+ }
+ } else {
+ if (_scroll_pos <= _invisible_lines) {
+ ++_scroll_pos;
+ InvalidateRect(_hwnd, NULL, TRUE);
+ }
+ }
+ break;
+
+ case WM_KEYDOWN:
+ ProcessKey(wparam);
+ break;
+#else
+ case PM_STARTENTRY_FOCUSED: { ///@todo use TrackMouseEvent() and WM_MOUSEHOVER to wait a bit before opening submenus
+ BOOL hasSubmenu = wparam;
+ HWND hctrl = (HWND)lparam;
+
+ // automatically open submenus
+ if (hasSubmenu) {
+ UpdateWindow(_hwnd); // draw focused button before waiting on submenu creation
+ //SendMessage(_hwnd, WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hctrl),BN_CLICKED), (LPARAM)hctrl);
+ Command(GetDlgCtrlID(hctrl), BN_CLICKED);
+ } else {
+ // close any open submenu
+ CloseOtherSubmenus();
+ }
+ break;}
+#endif
+
+#ifdef _LAZY_ICONEXTRACT
+ case PM_UPDATE_ICONS:
+ UpdateIcons(/*wparam*/);
+ break;
+#endif
+
+ case PM_STARTENTRY_LAUNCHED:
+ if (GetWindowStyle(_hwnd) & WS_CAPTION) // don't automatically close floating menus
+ return 0;
+
+ // route message to the parent menu and close menus after launching an entry
+ if (!SendParent(nmsg, wparam, lparam))
+ CloseStartMenu();
+ return 1; // signal that we have received and processed the message
+
+ case PM_STARTMENU_CLOSED:
+ _submenu = 0;
+ break;
+
+ case PM_SELECT_ENTRY:
+ SelectButtonIndex(0, wparam!=0);
+ break;
+
+#ifdef _LIGHT_STARTMENU
+ case WM_CONTEXTMENU: {
+ Point screen_pt(lparam), clnt_pt=screen_pt;
+ ScreenToClient(_hwnd, &clnt_pt);
+
+ int id = ButtonHitTest(clnt_pt);
+
+ if (id) {
+ StartMenuEntry& sme = _entries[id];
+
+ for(ShellEntrySet::iterator it=sme._entries.begin(); it!=sme._entries.end(); ++it) {
+ Entry* entry = *it;
+
+ if (entry) {
+ CHECKERROR(entry->do_context_menu(_hwnd, screen_pt, _cm_ifs)); // may close start menu because of focus loss
+ break; ///@todo handle context menu for more than one entry
+ }
+ }
+ }
+ break;}
+#endif
+
+ default: def:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+
+#ifdef _LIGHT_STARTMENU
+
+int StartMenu::ButtonHitTest(POINT pt)
+{
+ ClientRect clnt(_hwnd);
+ const int icon_size = _icon_size;
+ RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT(icon_size)};
+
+ if (pt.x<rect.left || pt.x>rect.right)
+ return 0;
+
+ for(SMBtnVector::const_iterator it=_buttons.begin()+_scroll_pos; it!=_buttons.end(); ++it) {
+ const SMBtnInfo& info = *it;
+
+ if (rect.top > pt.y)
+ break;
+
+ rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT(icon_size): STARTMENU_LINE_HEIGHT(icon_size));
+
+ if (rect.bottom > _bottom_max)
+ break;
+
+ if (pt.y < rect.bottom) // PtInRect(&rect, pt)
+ return info._id;
+
+ rect.top = rect.bottom;
+ }
+
+ return 0;
+}
+
+void StartMenu::InvalidateSelection()
+{
+ if (_selected_id <= 0)
+ return;
+
+ ClientRect clnt(_hwnd);
+ const int icon_size = _icon_size;
+ RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT(icon_size)};
+
+ for(SMBtnVector::const_iterator it=_buttons.begin()+_scroll_pos; it!=_buttons.end(); ++it) {
+ const SMBtnInfo& info = *it;
+
+ rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT(icon_size): STARTMENU_LINE_HEIGHT(icon_size));
+
+ if (info._id == _selected_id) {
+ InvalidateRect(_hwnd, &rect, TRUE);
+ break;
+ }
+
+ rect.top = rect.bottom;
+ }
+}
+
+const SMBtnInfo* StartMenu::GetButtonInfo(int id) const
+{
+ for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it)
+ if (it->_id == id)
+ return &*it;
+
+ return NULL;
+}
+
+bool StartMenu::SelectButton(int id, bool open_sub)
+{
+ if (id == -1)
+ return false;
+
+ if (id == _selected_id)
+ return true;
+
+ InvalidateSelection();
+
+ const SMBtnInfo* btn = GetButtonInfo(id);
+
+ if (btn && btn->_enabled) {
+ _selected_id = id;
+
+ InvalidateSelection();
+
+ // automatically open submenus
+ if (btn->_hasSubmenu) {
+ if (open_sub)
+ OpenSubmenu();
+ } else
+ CloseOtherSubmenus(); // close any open submenu
+
+ return true;
+ } else {
+ _selected_id = -1;
+ return false;
+ }
+}
+
+bool StartMenu::OpenSubmenu(bool select_first)
+{
+ if (_selected_id == -1)
+ return false;
+
+ InvalidateSelection();
+
+ const SMBtnInfo* btn = GetButtonInfo(_selected_id);
+
+ // automatically open submenus
+ if (btn->_hasSubmenu) {
+ //@@ allows destroying of startmenu when processing PM_UPDATE_ICONS -> GPF
+ UpdateWindow(_hwnd); // draw focused button before waiting on submenu creation
+ Command(_selected_id, BN_CLICKED);
+
+ if (select_first && _submenu)
+ SendMessage(_submenu, PM_SELECT_ENTRY, (WPARAM)false, 0);
+
+ return true;
+ } else
+ return false;
+}
+
+
+int StartMenu::GetSelectionIndex()
+{
+ if (_selected_id == -1)
+ return -1;
+
+ for(int i=0; i<(int)_buttons.size(); ++i)
+ if (_buttons[i]._id == _selected_id)
+ return i;
+
+ return -1;
+}
+
+bool StartMenu::SelectButtonIndex(int idx, bool open_sub)
+{
+ if (idx>=0 && idx<(int)_buttons.size())
+ return SelectButton(_buttons[idx]._id, open_sub);
+ else
+ return false;
+}
+
+void StartMenu::ProcessKey(int vk)
+{
+ switch(vk) {
+ case VK_RETURN:
+ if (_selected_id)
+ Command(_selected_id, BN_CLICKED);
+ break;
+
+ case VK_UP:
+ Navigate(-1);
+ break;
+
+ case VK_DOWN:
+ Navigate(+1);
+ break;
+
+ case VK_HOME:
+ SelectButtonIndex(0, false);
+ break;
+
+ case VK_END:
+ SelectButtonIndex(_buttons.size()-1, false);
+ break;
+
+ case VK_LEFT:
+ if (_submenu)
+ CloseOtherSubmenus();
+ else if (!(GetWindowStyle(_hwnd) & WS_CAPTION)) // don't automatically close floating menus
+ DestroyWindow(_hwnd);
+ break;
+
+ case VK_RIGHT:
+ OpenSubmenu(true);
+ break;
+
+ case VK_ESCAPE:
+ CloseStartMenu();
+ break;
+
+ default:
+ if (vk>='0' && vk<='Z')
+ JumpToNextShortcut(vk);
+ }
+}
+
+bool StartMenu::Navigate(int step)
+{
+ int idx = GetSelectionIndex();
+
+ if (idx == -1)
+ if (step > 0)
+ idx = 0 - step;
+ else
+ idx = _buttons.size() - step;
+
+ for(;;) {
+ idx += step;
+
+ if (idx<0 || idx>(int)_buttons.size())
+ break;
+
+ if (SelectButtonIndex(idx, false))
+ return true;
+ }
+
+ return false;
+}
+
+bool StartMenu::JumpToNextShortcut(char c)
+{
+ int cur_idx = GetSelectionIndex();
+
+ if (cur_idx == -1)
+ cur_idx = 0;
+
+ int first_found = 0;
+ int found_more = 0;
+
+ SMBtnVector::const_iterator cur_it = _buttons.begin();
+ cur_it += cur_idx + 1;
+
+ // first search down from current item...
+ SMBtnVector::const_iterator it = cur_it;
+ for(; it!=_buttons.end(); ++it) {
+ const SMBtnInfo& btn = *it;
+
+ if (!btn._title.empty() && toupper((TBYTE)btn._title.at(0)) == c) {
+ if (!first_found)
+ first_found = btn._id;
+ else
+ ++found_more;
+ }
+ }
+
+ // ...now search from top to the current item
+ it = _buttons.begin();
+ for(; it!=_buttons.end() && it!=cur_it; ++it) {
+ const SMBtnInfo& btn = *it;
+
+ if (!btn._title.empty() && toupper((TBYTE)btn._title.at(0)) == c) {
+ if (!first_found)
+ first_found = btn._id;
+ else
+ ++found_more;
+ }
+ }
+
+ if (first_found) {
+ SelectButton(first_found);
+
+ if (!found_more)
+ Command(first_found, BN_CLICKED);
+
+ return true;
+ } else
+ return false;
+}
+
+#endif // _LIGHT_STARTMENU
+
+
+bool StartMenu::GetButtonRect(int id, PRECT prect) const
+{
+#ifdef _LIGHT_STARTMENU
+ ClientRect clnt(_hwnd);
+ const int icon_size = _icon_size;
+ RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT(icon_size)};
+
+ for(SMBtnVector::const_iterator it=_buttons.begin()+_scroll_pos; it!=_buttons.end(); ++it) {
+ const SMBtnInfo& info = *it;
+
+ rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT(icon_size): STARTMENU_LINE_HEIGHT(icon_size));
+
+ if (info._id == id) {
+ *prect = rect;
+ return true;
+ }
+
+ rect.top = rect.bottom;
+ }
+
+ return false;
+#else
+ HWND btn = GetDlgItem(_hwnd, id);
+
+ if (btn) {
+ GetWindowRect(btn, prect);
+ ScreenToClient(_hwnd, prect);
+
+ return true;
+ } else
+ return false;
+#endif
+}
+
+
+void StartMenu::DrawFloatingButton(HDC hdc)
+{
+ static ResIconEx floatingIcon(IDI_FLOATING, 8, 4);
+
+ ClientRect clnt(_hwnd);
+
+ DrawIconEx(hdc, clnt.right-12, 0, floatingIcon, 8, 4, 0, 0, DI_NORMAL);
+}
+
+void StartMenu::GetFloatingButtonRect(LPRECT prect)
+{
+ GetClientRect(_hwnd, prect);
+
+ prect->right -= 4;
+ prect->left = prect->right - 8;
+ prect->bottom = 4;
+}
+
+
+void StartMenu::DrawArrows(HDC hdc, int icon_size)
+{
+ int cx = icon_size / 2;
+ int cy = icon_size / 4;
+
+ ResIconEx arrowUpIcon(IDI_ARROW_UP, cx, cy);
+ ResIconEx arrowDownIcon(IDI_ARROW_DOWN, cx, cy);
+
+ ClientRect clnt(_hwnd);
+
+ DrawIconEx(hdc, clnt.right/2-cx/2, _floating_btn?3:1, arrowUpIcon, cx, cy, 0, 0, DI_NORMAL);
+ DrawIconEx(hdc, clnt.right/2-cx/2, clnt.bottom-cy-1, arrowDownIcon, cx, cy, 0, 0, DI_NORMAL);
+}
+
+void StartMenu::GetArrowButtonRects(LPRECT prect_up, LPRECT prect_down, int icon_size)
+{
+ int cx = icon_size / 2;
+ int cy = icon_size / 4;
+
+ GetClientRect(_hwnd, prect_up);
+ *prect_down = *prect_up;
+
+// prect_up->left = prect_up->right/2 - cx/2;
+// prect_up->right = prect_up->left + cy;
+ prect_up->right -= cx;
+ prect_up->top = _floating_btn? cy-1: 1;
+ prect_up->bottom = prect_up->top + cy;
+
+// prect_down->left = prect_down->right/2 - cx/2;
+// prect_down->right = prect_down->left + cy;
+ prect_down->right -= cx;
+ prect_down->top = prect_down->bottom - cy - 1;
+}
+
+
+void StartMenu::Paint(PaintCanvas& canvas)
+{
+ if (_floating_btn)
+ DrawFloatingButton(canvas);
+
+#ifdef _LIGHT_STARTMENU
+ if (_arrow_btns)
+ DrawArrows(canvas, _icon_size);
+
+ ClientRect clnt(_hwnd);
+ const int icon_size = _icon_size;
+ RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT(icon_size)};
+
+ int sep_width = rect.right-rect.left - 4;
+
+ FontSelection font(canvas, GetStockFont(DEFAULT_GUI_FONT));
+ BkMode bk_mode(canvas, TRANSPARENT);
+
+ for(SMBtnVector::const_iterator it=_buttons.begin()+_scroll_pos; it!=_buttons.end(); ++it) {
+ const SMBtnInfo& btn = *it;
+
+ if (rect.top > canvas.rcPaint.bottom)
+ break;
+
+ if (btn._id == -1) { // a separator?
+ rect.bottom = rect.top + STARTMENU_SEP_HEIGHT(icon_size);
+
+ if (rect.bottom > _bottom_max)
+ break;
+
+ BrushSelection brush_sel(canvas, GetSysColorBrush(COLOR_BTNSHADOW));
+ PatBlt(canvas, rect.left+2, rect.top+STARTMENU_SEP_HEIGHT(icon_size)/2-1, sep_width, 1, PATCOPY);
+
+ SelectBrush(canvas, GetSysColorBrush(COLOR_BTNHIGHLIGHT));
+ PatBlt(canvas, rect.left+2, rect.top+STARTMENU_SEP_HEIGHT(icon_size)/2, sep_width, 1, PATCOPY);
+ } else {
+ rect.bottom = rect.top + STARTMENU_LINE_HEIGHT(icon_size);
+
+ if (rect.bottom > _bottom_max)
+ break;
+
+ if (rect.top >= canvas.rcPaint.top)
+ DrawStartMenuButton(canvas, rect, btn._title, btn, btn._id==_selected_id, false, _icon_size);
+ }
+
+ rect.top = rect.bottom;
+ }
+#endif
+}
+
+#ifdef _LAZY_ICONEXTRACT
+void StartMenu::UpdateIcons(/*int idx*/)
+{
+ UpdateWindow(_hwnd);
+
+#ifdef _SINGLE_ICONEXTRACT
+
+ //if (idx >= 0)
+ int idx = _scroll_pos;
+
+ for(; idx<(int)_buttons.size(); ++idx) {
+ SMBtnInfo& btn = _buttons[idx];
+
+ if (btn._icon_id==ICID_UNKNOWN && btn._id>0) {
+ StartMenuEntry& sme = _entries[btn._id];
+
+ btn._icon_id = ICID_NONE;
+
+ for(ShellEntrySet::iterator it=sme._entries.begin(); it!=sme._entries.end(); ++it) {
+ Entry* entry = *it;
+
+ if (entry->_icon_id == ICID_UNKNOWN)
+ entry->_icon_id = entry->safe_extract_icon(ICF_FROM_ICON_SIZE(_icon_size));
+
+ if (entry->_icon_id > ICID_NONE) {
+ btn._icon_id = (ICON_ID)/*@@*/ entry->_icon_id;
+
+ RECT rect;
+
+ GetButtonRect(btn._id, &rect);
+
+ if (rect.bottom > _bottom_max)
+ break;
+
+ WindowCanvas canvas(_hwnd);
+ DrawStartMenuButton(canvas, rect, NULL, btn, btn._id==_selected_id, false, _icon_size);
+
+ //InvalidateRect(_hwnd, &rect, FALSE);
+ //UpdateWindow(_hwnd);
+ //break;
+
+ break;
+ }
+ }
+ }
+ }
+
+// if (++idx < (int)_buttons.size())
+// PostMessage(_hwnd, PM_UPDATE_ICONS, idx, 0);
+
+#else
+
+ int icons_extracted = 0;
+ int icons_updated = 0;
+
+ for(StartMenuShellDirs::iterator it=_dirs.begin(); it!=_dirs.end(); ++it) {
+ ShellDirectory& dir = it->_dir;
+
+ icons_extracted += dir.extract_icons(icon_size);
+ }
+
+ if (icons_extracted) {
+ for(ShellEntryMap::iterator it1=_entries.begin(); it1!=_entries.end(); ++it1) {
+ StartMenuEntry& sme = it1->second;
+
+ if (!sme._hIcon) {
+ sme._hIcon = (HICON)-1;
+
+ for(ShellEntrySet::const_iterator it2=sme._entries.begin(); it2!=sme._entries.end(); ++it2) {
+ const Entry* sm_entry = *it2;
+
+ if (sm_entry->_hIcon) {
+ sme._hIcon = sm_entry->_hIcon;
+ break;
+ }
+ }
+ }
+ }
+
+ for(SMBtnVector::iterator it=_buttons.begin(); it!=_buttons.end(); ++it) {
+ SMBtnInfo& info = *it;
+
+ if (info._id>0 && !info._hIcon) {
+ info._hIcon = _entries[info._id]._hIcon;
+ ++icons_updated;
+ }
+ }
+ }
+
+ if (icons_updated) {
+ InvalidateRect(_hwnd, NULL, FALSE);
+ UpdateWindow(_hwnd);
+ }
+#endif
+}
+#endif
+
+
+ // resize child button controls to accomodate for new window size
+void StartMenu::ResizeButtons(int cx)
+{
+ HDWP hdwp = BeginDeferWindowPos(10);
+
+ for(HWND ctrl=GetWindow(_hwnd,GW_CHILD); ctrl; ctrl=GetNextWindow(ctrl,GW_HWNDNEXT)) {
+ ClientRect rt(ctrl);
+
+ if (rt.right != cx) {
+ int height = rt.bottom - rt.top;
+
+ // special handling for separator controls
+ if (!height && (GetWindowStyle(ctrl)&SS_TYPEMASK)==SS_ETCHEDHORZ)
+ height = 2;
+
+ hdwp = DeferWindowPos(hdwp, ctrl, 0, 0, 0, cx, height, SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
+ }
+ }
+
+ EndDeferWindowPos(hdwp);
+}
+
+
+int StartMenu::Command(int id, int code)
+{
+#ifndef _LIGHT_STARTMENU
+ switch(id) {
+ case IDCANCEL:
+ CloseStartMenu(id);
+ break;
+
+ default: {
+#endif
+ ShellEntryMap::iterator found = _entries.find(id);
+
+ if (found != _entries.end()) {
+ ActivateEntry(id, found->second._entries);
+ return 0;
+ }
+
+ return super::Command(id, code);
+#ifndef _LIGHT_STARTMENU
+ }
+ }
+
+ return 0;
+#endif
+}
+
+
+ShellEntryMap::iterator StartMenu::AddEntry(const String& title, ICON_ID icon_id, Entry* entry)
+{
+ // search for an already existing subdirectory entry with the same name
+ if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ for(ShellEntryMap::iterator it=_entries.begin(); it!=_entries.end(); ++it) {
+ StartMenuEntry& sme = it->second;
+
+ if (!_tcsicmp(sme._title, title)) ///@todo speed up by using a map indexed by name
+ for(ShellEntrySet::iterator it2=sme._entries.begin(); it2!=sme._entries.end(); ++it2) {
+ if ((*it2)->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ // merge the new shell entry with the existing of the same name
+ sme._entries.insert(entry);
+
+ return it;
+ }
+ }
+ }
+
+ ShellEntryMap::iterator sme = AddEntry(title, icon_id);
+
+ sme->second._entries.insert(entry);
+
+ return sme;
+}
+
+ShellEntryMap::iterator StartMenu::AddEntry(const String& title, ICON_ID icon_id, int id)
+{
+ if (id == -1)
+ id = ++_next_id;
+
+ StartMenuEntry sme;
+
+ sme._title = title;
+ sme._icon_id = icon_id;
+
+ ShellEntryMap::iterator it = _entries.insert(make_pair(id, sme)).first;
+
+ return it;
+}
+
+ShellEntryMap::iterator StartMenu::AddEntry(const ShellFolder folder, ShellEntry* entry)
+{
+ ICON_ID icon_id;
+
+ if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ icon_id = ICID_APPS;
+ else
+ icon_id = (ICON_ID)/*@@*/ entry->_icon_id;
+
+ return AddEntry(folder.get_name(entry->_pidl), icon_id, entry);
+}
+
+ShellEntryMap::iterator StartMenu::AddEntry(const ShellFolder folder, Entry* entry)
+{
+ ICON_ID icon_id;
+
+ if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ icon_id = ICID_APPS;
+ else
+ icon_id = (ICON_ID)/*@@*/ entry->_icon_id;
+
+ return AddEntry(entry->_display_name, icon_id, entry);
+}
+
+
+void StartMenu::AddButton(LPCTSTR title, ICON_ID icon_id, bool hasSubmenu, int id, bool enabled)
+{
+#ifdef _LIGHT_STARTMENU
+ _buttons.push_back(SMBtnInfo(title, icon_id, id, hasSubmenu, enabled));
+#else
+ DWORD style = enabled? WS_VISIBLE|WS_CHILD|BS_OWNERDRAW: WS_VISIBLE|WS_CHILD|BS_OWNERDRAW|WS_DISABLED;
+
+ WindowRect rect(_hwnd);
+ ClientRect clnt(_hwnd);
+
+ // increase window height to make room for the new button
+ rect.top -= STARTMENU_LINE_HEIGHT(icon_size);
+
+ // move down if we are too high now
+ if (rect.top < 0) {
+ rect.top += STARTMENU_LINE_HEIGHT(icon_size);
+ rect.bottom += STARTMENU_LINE_HEIGHT(icon_size);
+ }
+
+ WindowCanvas canvas(_hwnd);
+ FontSelection font(canvas, GetStockFont(DEFAULT_GUI_FONT));
+
+ // widen window, if it is too small
+ int text_width = GetStartMenuBtnTextWidth(canvas, title, _hwnd) + icon_size + 10/*placeholder*/ + 16/*arrow*/;
+
+ int cx = clnt.right - _border_left;
+ if (text_width > cx)
+ rect.right += text_width-cx;
+
+ MoveWindow(_hwnd, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE);
+
+ StartMenuCtrl(_hwnd, _border_left, clnt.bottom, rect.right-rect.left-_border_left,
+ title, id, g_Globals._icon_cache.get_icon(icon_id)._hIcon, hasSubmenu, style);
+#endif
+}
+
+void StartMenu::AddSeparator()
+{
+#ifdef _LIGHT_STARTMENU
+ _buttons.push_back(SMBtnInfo(NULL, ICID_NONE, -1, false));
+#else
+ WindowRect rect(_hwnd);
+ ClientRect clnt(_hwnd);
+
+ // increase window height to make room for the new separator
+ rect.top -= STARTMENU_SEP_HEIGHT(icon_size);
+
+ // move down if we are too high now
+ if (rect.top < 0) {
+ rect.top += STARTMENU_LINE_HEIGHT(icon_size);
+ rect.bottom += STARTMENU_LINE_HEIGHT(icon_size);
+ }
+
+ MoveWindow(_hwnd, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE);
+
+ StartMenuSeparator(_hwnd, _border_left, clnt.bottom, rect.right-rect.left-_border_left);
+#endif
+}
+
+
+bool StartMenu::CloseOtherSubmenus(int id)
+{
+ if (_submenu) {
+ if (IsWindow(_submenu)) {
+ if (_submenu_id == id)
+ return false;
+ else {
+ _submenu_id = 0;
+ DestroyWindow(_submenu);
+ // _submenu should be reset automatically by PM_STARTMENU_CLOSED, but safety first...
+ }
+ }
+
+ _submenu = 0;
+ }
+
+ return true;
+}
+
+
+void StartMenu::CreateSubmenu(int id, LPCTSTR title, CREATORFUNC_INFO creator, void* info)
+{
+ CreateSubmenu(id, StartMenuFolders(), title, creator, info);
+}
+
+bool StartMenu::CreateSubmenu(int id, int folder_id, LPCTSTR title, CREATORFUNC_INFO creator, void* info)
+{
+ try {
+ SpecialFolderPath folder(folder_id, _hwnd);
+
+ StartMenuFolders new_folders;
+ new_folders.push_back(folder);
+
+ CreateSubmenu(id, new_folders, title, creator, info);
+
+ return true;
+ } catch(COMException&) {
+ // ignore Exception and don't display anything
+ CloseOtherSubmenus(id);
+ _buttons[GetSelectionIndex()]._enabled = false; // disable entries for non-existing folders
+ return false;
+ }
+}
+
+bool StartMenu::CreateSubmenu(int id, int folder_id1, int folder_id2, LPCTSTR title, CREATORFUNC_INFO creator, void* info)
+{
+ StartMenuFolders new_folders;
+
+ try {
+ new_folders.push_back(SpecialFolderPath(folder_id1, _hwnd));
+ } catch(COMException&) {
+ }
+
+ try {
+ new_folders.push_back(SpecialFolderPath(folder_id2, _hwnd));
+ } catch(COMException&) {
+ }
+
+ if (!new_folders.empty()) {
+ CreateSubmenu(id, new_folders, title, creator, info);
+ return true;
+ } else {
+ CloseOtherSubmenus(id);
+ _buttons[GetSelectionIndex()]._enabled = false; // disable entries for non-existing folders
+ return false;
+ }
+}
+
+void StartMenu::CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC_INFO creator, void* info)
+{
+ // Only open one submenu at a time.
+ if (!CloseOtherSubmenus(id))
+ return;
+
+ RECT rect;
+ int x, y;
+
+ if (GetButtonRect(id, &rect)) {
+ ClientToScreen(_hwnd, &rect);
+
+ x = rect.right; // Submenus should overlap their parent a bit.
+ const int icon_size = _icon_size;
+ y = rect.top+STARTMENU_LINE_HEIGHT(icon_size) +_border_top/*own border*/ -STARTMENU_TOP_BTN_SPACE/*border of new submenu*/;
+ } else {
+ WindowRect pos(_hwnd);
+
+ x = pos.right;
+ y = pos.top;
+ }
+
+ _submenu_id = id;
+ _submenu = StartMenu::Create(x, y, new_folders, _hwnd, title, creator, info, _create_info._filter);
+}
+
+
+void StartMenu::ActivateEntry(int id, const ShellEntrySet& entries)
+{
+ StartMenuFolders new_folders;
+ String title;
+
+ for(ShellEntrySet::const_iterator it=entries.begin(); it!=entries.end(); ++it) {
+ Entry* entry = const_cast<Entry*>(*it);
+
+ if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+
+ ///@todo If the user explicitly clicked on a submenu, display this folder as floating start menu.
+
+ if (entry->_etype == ET_SHELL)
+ new_folders.push_back(entry->create_absolute_pidl());
+ else {
+ TCHAR path[MAX_PATH];
+
+ if (entry->get_path(path, COUNTOF(path)))
+ new_folders.push_back(path);
+ }
+
+ if (title.empty())
+ title = entry->_display_name;
+ } else {
+ // The entry is no subdirectory, so there can only be one shell entry.
+ assert(entries.size()==1);
+
+ HWND hparent = GetParent(_hwnd);
+ ShellPath shell_path = entry->create_absolute_pidl();
+
+ // close start menus when launching the selected entry
+ CloseStartMenu(id);
+
+ ///@todo launch in the background; specify correct HWND for error message box titles
+ SHELLEXECUTEINFO shexinfo;
+
+ shexinfo.cbSize = sizeof(SHELLEXECUTEINFO);
+ shexinfo.fMask = SEE_MASK_IDLIST; // SEE_MASK_INVOKEIDLIST is also possible.
+ shexinfo.hwnd = hparent;
+ shexinfo.lpVerb = NULL;
+ shexinfo.lpFile = NULL;
+ shexinfo.lpParameters = NULL;
+ shexinfo.lpDirectory = NULL;
+ shexinfo.nShow = SW_SHOWNORMAL;
+
+ shexinfo.lpIDList = &*shell_path;
+
+ // add PIDL to the recent file list
+ SHAddToRecentDocs(SHARD_PIDL, shexinfo.lpIDList);
+
+ if (!ShellExecuteEx(&shexinfo))
+ display_error(hparent, GetLastError());
+
+ // we may have deleted 'this' - ensure we leave the loop and function
+ return;
+ }
+ }
+
+ if (!new_folders.empty()) {
+ // Only open one submenu at a time.
+ if (!CloseOtherSubmenus(id))
+ return;
+
+ CreateSubmenu(id, new_folders, title);
+ }
+}
+
+
+ /// close all windows of the start menu popup
+void StartMenu::CloseStartMenu(int id)
+{
+ if (!(GetWindowStyle(_hwnd) & WS_CAPTION)) { // don't automatically close floating menus
+ if (!SendParent(PM_STARTENTRY_LAUNCHED, id, (LPARAM)_hwnd))
+ DestroyWindow(_hwnd);
+ } else if (_submenu) // instead close submenus of floating parent menus
+ CloseSubmenus();
+}
+
+
+int GetStartMenuBtnTextWidth(HDC hdc, LPCTSTR title, HWND hwnd)
+{
+ RECT rect = {0, 0, 0, 0};
+ DrawText(hdc, title, -1, &rect, DT_SINGLELINE|DT_NOPREFIX|DT_CALCRECT);
+
+ return rect.right-rect.left;
+}
+
+#ifdef _LIGHT_STARTMENU
+void DrawStartMenuButton(HDC hdc, const RECT& rect, LPCTSTR title, const SMBtnInfo& btn, bool has_focus, bool pushed, int icon_size)
+#else
+void DrawStartMenuButton(HDC hdc, const RECT& rect, LPCTSTR title, HICON hIcon,
+ bool hasSubmenu, bool enabled, bool has_focus, bool pushed, int icon_size);
+#endif
+{
+ UINT style = DFCS_BUTTONPUSH;
+
+ if (!btn._enabled)
+ style |= DFCS_INACTIVE;
+
+ POINT iconPos = {rect.left+2, (rect.top+rect.bottom-icon_size)/2};
+ RECT textRect = {rect.left+icon_size+4, rect.top+2, rect.right-4, rect.bottom-4};
+
+ if (pushed) {
+ style |= DFCS_PUSHED;
+ ++iconPos.x; ++iconPos.y;
+ ++textRect.left; ++textRect.top;
+ ++textRect.right; ++textRect.bottom;
+ }
+
+ int bk_color_idx = COLOR_BTNFACE;
+ int text_color_idx = COLOR_BTNTEXT;
+
+ if (has_focus) {
+ bk_color_idx = COLOR_HIGHLIGHT;
+ text_color_idx = COLOR_HIGHLIGHTTEXT;
+ }
+
+ COLORREF bk_color = GetSysColor(bk_color_idx);
+ HBRUSH bk_brush = GetSysColorBrush(bk_color_idx);
+
+ if (title)
+ FillRect(hdc, &rect, bk_brush);
+
+ if (btn._icon_id > ICID_NONE)
+ g_Globals._icon_cache.get_icon(btn._icon_id).draw(hdc, iconPos.x, iconPos.y, icon_size, icon_size, bk_color, bk_brush/*, icon_size*/);
+
+ // draw submenu arrow at the right
+ if (btn._hasSubmenu) {
+ ResIconEx arrowIcon(IDI_ARROW, icon_size, icon_size);
+ ResIconEx selArrowIcon(IDI_ARROW_SELECTED, icon_size, icon_size);
+
+ DrawIconEx(hdc, rect.right-icon_size, iconPos.y,
+ has_focus? selArrowIcon: arrowIcon,
+ icon_size, icon_size, 0, bk_brush, DI_NORMAL);
+ }
+
+ if (title) {
+ BkMode bk_mode(hdc, TRANSPARENT);
+
+ if (!btn._enabled) // dis->itemState & (ODS_DISABLED|ODS_GRAYED)
+ DrawGrayText(hdc, &textRect, title, DT_SINGLELINE|DT_NOPREFIX|DT_VCENTER);
+ else {
+ TextColor lcColor(hdc, GetSysColor(text_color_idx));
+ DrawText(hdc, title, -1, &textRect, DT_SINGLELINE|DT_NOPREFIX|DT_VCENTER);
+ }
+ }
+}
+
+
+#ifdef _LIGHT_STARTMENU
+
+void StartMenu::ResizeToButtons()
+{
+ WindowRect rect(_hwnd);
+
+ WindowCanvas canvas(_hwnd);
+ FontSelection font(canvas, GetStockFont(DEFAULT_GUI_FONT));
+
+ const int icon_size = _icon_size;
+
+ int max_width = STARTMENU_WIDTH_MIN;
+ int height = 0;
+
+ for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) {
+ int w = GetStartMenuBtnTextWidth(canvas, it->_title, _hwnd);
+
+ if (w > max_width)
+ max_width = w;
+
+ if (it->_id == -1)
+ height += STARTMENU_SEP_HEIGHT(icon_size);
+ else
+ height += STARTMENU_LINE_HEIGHT(icon_size);
+ }
+
+ // calculate new window size
+ int text_width = max_width + icon_size + 10/*placeholder*/ + 16/*arrow*/;
+
+ RECT rt_hgt = {rect.left, rect.bottom-_border_top-height, rect.left+_border_left+text_width, rect.bottom};
+ AdjustWindowRectEx(&rt_hgt, GetWindowStyle(_hwnd), FALSE, GetWindowExStyle(_hwnd));
+
+ // ignore movement, only look at the size change
+ rect.right = rect.left + (rt_hgt.right-rt_hgt.left);
+ rect.top = rect.bottom - (rt_hgt.bottom-rt_hgt.top);
+
+ // move down if we are too high
+ if (rect.top < 0) {
+ int dy = -rect.top;
+ rect.top += dy;
+ rect.bottom += dy;
+ }
+
+ // enable scroll mode for long start menus, which span more than the whole screen height
+ int cyscreen = GetSystemMetrics(SM_CYSCREEN);
+ int bottom_max = 0;
+
+ if (rect.bottom > cyscreen) {
+ _arrow_btns = true;
+
+ _invisible_lines = (rect.bottom-cyscreen+(STARTMENU_LINE_HEIGHT(icon_size)-1))/STARTMENU_SEP_HEIGHT(icon_size) + 1;
+ rect.bottom -= _invisible_lines * STARTMENU_LINE_HEIGHT(icon_size);
+
+ bottom_max = rect.bottom;
+
+ if (_floating_btn)
+ rect.bottom += 6; // lower scroll arrow
+ else {
+ _border_top += 6; // upper scroll arrow
+ rect.bottom += 2*6; // upper+lower scroll arrow
+ }
+ }
+
+ MoveWindow(_hwnd, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, TRUE);
+
+ if (bottom_max) {
+ POINT pt = {0, bottom_max};
+
+ ScreenToClient(_hwnd, &pt);
+
+ _bottom_max = pt.y;
+ }
+}
+
+#else // _LIGHT_STARTMENU
+
+LRESULT StartMenuButton::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_MOUSEMOVE:
+ // automatically set the focus to startmenu entries when moving the mouse over them
+ if (GetFocus()!=_hwnd && !(GetWindowStyle(_hwnd)&WS_DISABLED))
+ SetFocus(_hwnd);
+ break;
+
+ case WM_SETFOCUS:
+ PostParent(PM_STARTENTRY_FOCUSED, _hasSubmenu, (LPARAM)_hwnd);
+ goto def;
+
+ case WM_CANCELMODE:
+ // route WM_CANCELMODE to the startmenu window
+ return SendParent(nmsg, wparam, lparam);
+
+ default: def:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+void StartMenuButton::DrawItem(LPDRAWITEMSTRUCT dis)
+{
+ TCHAR title[BUFFER_LEN];
+
+ GetWindowText(_hwnd, title, BUFFER_LEN);
+
+ DrawStartMenuButton(dis->hDC, dis->rcItem, title, _hIcon,
+ _hasSubmenu,
+ !(dis->itemState & ODS_DISABLED),
+ dis->itemState&ODS_FOCUS? true: false,
+ dis->itemState&ODS_SELECTED? true: false);
+}
+
+#endif
+
+
+StartMenuRoot::StartMenuRoot(HWND hwnd, const StartMenuRootCreateInfo& info)
+ : super(hwnd, info._icon_size)
+{
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || !SHRestricted(REST_NOCOMMONGROUPS))
+#endif
+ try {
+ // insert directory "All Users\Start Menu"
+ ShellDirectory cmn_startmenu(GetDesktopFolder(), SpecialFolderPath(CSIDL_COMMON_STARTMENU, _hwnd), _hwnd);
+ _dirs.push_back(StartMenuDirectory(cmn_startmenu, (LPCTSTR)SpecialFolderFSPath(CSIDL_COMMON_PROGRAMS, _hwnd)));
+ } catch(COMException&) {
+ // ignore exception and don't show additional shortcuts
+ }
+
+ try {
+ // insert directory "<user name>\Start Menu"
+ ShellDirectory usr_startmenu(GetDesktopFolder(), SpecialFolderPath(CSIDL_STARTMENU, _hwnd), _hwnd);
+ _dirs.push_back(StartMenuDirectory(usr_startmenu, (LPCTSTR)SpecialFolderFSPath(CSIDL_PROGRAMS, _hwnd)));
+ } catch(COMException&) {
+ // ignore exception and don't show additional shortcuts
+ }
+
+ ReadLogoSize();
+}
+
+void StartMenuRoot::ReadLogoSize()
+{
+ // read size of logo bitmap
+ BITMAP bmp_hdr;
+ GetObject(ResBitmap(GetLogoResId()), sizeof(BITMAP), &bmp_hdr);
+ _logo_size.cx = bmp_hdr.bmWidth;
+ _logo_size.cy = bmp_hdr.bmHeight;
+
+ // cache logo width
+ _border_left = _logo_size.cx + 1;
+}
+
+
+static void CalculateStartPos(HWND hwndOwner, RECT& rect, int icon_size)
+{
+ WindowRect pos(hwndOwner);
+
+ rect.left = pos.left;
+ rect.top = pos.top-STARTMENU_LINE_HEIGHT(icon_size)-4;
+ rect.right = pos.left+STARTMENU_WIDTH_MIN;
+ rect.bottom = pos.top;
+
+#ifndef _LIGHT_STARTMENU
+ rect.top += STARTMENU_LINE_HEIGHT(icon_size);
+#endif
+
+ AdjustWindowRectEx(&rect, WS_POPUP|WS_THICKFRAME|WS_CLIPCHILDREN|WS_VISIBLE, FALSE, 0);
+}
+
+HWND StartMenuRoot::Create(HWND hwndOwner, int icon_size)
+{
+ RECT rect;
+
+ CalculateStartPos(hwndOwner, rect, icon_size);
+
+ StartMenuRootCreateInfo create_info;
+
+ create_info._icon_size = icon_size;
+
+ return Window::Create(WINDOW_CREATOR_INFO(StartMenuRoot,StartMenuRootCreateInfo), &create_info, 0, GetWndClasss(), TITLE_STARTMENU,
+ WS_POPUP|WS_THICKFRAME|WS_CLIPCHILDREN,
+ rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, hwndOwner);
+}
+
+
+void StartMenuRoot::TrackStartmenu()
+{
+ MSG msg;
+ HWND hwnd = _hwnd;
+
+#ifdef _LIGHT_STARTMENU
+ _selected_id = -1;
+#endif
+
+#ifdef _LIGHT_STARTMENU
+ // recalculate start menu root position
+ RECT rect;
+
+ CalculateStartPos(GetParent(hwnd), rect, _icon_size);
+
+ SetWindowPos(hwnd, 0, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, 0);
+
+ ResizeToButtons();
+#endif
+
+ // show previously hidden start menu
+ ShowWindow(hwnd, SW_SHOW);
+ SetForegroundWindow(hwnd);
+
+ while(IsWindow(hwnd) && IsWindowVisible(hwnd)) {
+ if (!GetMessage(&msg, 0, 0, 0)) {
+ PostQuitMessage(msg.wParam);
+ break;
+ }
+
+ // Check for a mouse click on any window, that is not part of the start menu
+ if (msg.message==WM_LBUTTONDOWN || msg.message==WM_MBUTTONDOWN || msg.message==WM_RBUTTONDOWN) {
+ StartMenu* menu_wnd = NULL;
+
+ for(HWND hwnd=msg.hwnd; hwnd; hwnd=GetParent(hwnd)) {
+ menu_wnd = WINDOW_DYNAMIC_CAST(StartMenu, hwnd);
+
+ if (menu_wnd)
+ break;
+ }
+
+ if (!menu_wnd) {
+ CloseStartMenu();
+ break;
+ }
+ }
+
+ try {
+ if (pretranslate_msg(&msg))
+ continue;
+
+ if (dispatch_dialog_msg(&msg))
+ continue;
+
+ TranslateMessage(&msg);
+
+ try {
+ DispatchMessage(&msg);
+ } catch(COMException& e) {
+ HandleException(e, _hwnd);
+ }
+ } catch(COMException& e) {
+ HandleException(e, _hwnd);
+ }
+ }
+}
+
+
+LRESULT StartMenuRoot::Init(LPCREATESTRUCT pcs)
+{
+ // add buttons for entries in _entries
+ if (super::Init(pcs))
+ return 1;
+
+ AddSeparator();
+
+
+#ifdef __MINGW32__
+ HKEY hkey, hkeyAdv;
+ DWORD value, len;
+
+ if (RegOpenKey(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"), &hkey))
+ hkey = 0;
+
+ if (RegOpenKey(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"), &hkeyAdv))
+ hkeyAdv = 0;
+
+#define IS_VALUE_ZERO(hk, name) \
+ (!hk || (len=sizeof(value),RegQueryValueEx(hk, name, NULL, NULL, (LPBYTE)&value, &len) || !value))
+
+#define IS_VALUE_NOT_ZERO(hk, name) \
+ (!hk || (len=sizeof(value),RegQueryValueEx(hk, name, NULL, NULL, (LPBYTE)&value, &len) || value>0))
+#endif
+
+
+ // insert hard coded start entries
+ AddButton(ResString(IDS_PROGRAMS), ICID_APPS, true, IDC_PROGRAMS);
+
+ AddButton(ResString(IDS_DOCUMENTS), ICID_DOCUMENTS, true, IDC_DOCUMENTS);
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || !SHRestricted(REST_NORECENTDOCSMENU))
+#else
+ if (IS_VALUE_ZERO(hkey, _T("NoRecentDocsMenu")))
+#endif
+ AddButton(ResString(IDS_RECENT), ICID_RECENT, true, IDC_RECENT);
+
+ AddButton(ResString(IDS_FAVORITES), ICID_FAVORITES, true, IDC_FAVORITES);
+
+ AddButton(ResString(IDS_SETTINGS), ICID_CONFIG, true, IDC_SETTINGS);
+
+ AddButton(ResString(IDS_BROWSE), ICID_FOLDER, true, IDC_BROWSE);
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || !SHRestricted(REST_NOFIND))
+#else
+ if (IS_VALUE_ZERO(hkey, _T("NoFind")))
+#endif
+ AddButton(ResString(IDS_SEARCH), ICID_SEARCH, true, IDC_SEARCH);
+
+ AddButton(ResString(IDS_START_HELP), ICID_INFO, false, IDC_START_HELP);
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || !SHRestricted(REST_NORUN))
+#else
+ if (IS_VALUE_ZERO(hkey, _T("NoRun")))
+#endif
+ AddButton(ResString(IDS_LAUNCH), ICID_ACTION, false, IDC_LAUNCH);
+
+
+ AddSeparator();
+
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || !SHRestricted(REST_NOCLOSE))
+#else
+ if (IS_VALUE_NOT_ZERO(hkeyAdv, _T("StartMenuLogoff")))
+#endif
+ AddButton(ResString(IDS_LOGOFF), ICID_LOGOFF, false, IDC_LOGOFF);
+
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || SHRestricted(REST_STARTMENULOGOFF) != 1)
+#else
+ if (IS_VALUE_ZERO(hkey, _T("NoClose")))
+#endif
+ AddButton(ResString(IDS_SHUTDOWN), ICID_SHUTDOWN, false, IDC_SHUTDOWN);
+
+
+#ifndef _ROS_
+ AddButton(ResString(IDS_TERMINATE), ICID_LOGOFF, false, IDC_TERMINATE);
+#endif
+
+
+#ifdef __MINGW32__
+ RegCloseKey(hkeyAdv);
+ RegCloseKey(hkey);
+#endif
+
+
+#ifdef _LIGHT_STARTMENU
+ // set the window size to fit all buttons
+ ResizeToButtons();
+#endif
+
+ return 0;
+}
+
+
+void StartMenuRoot::AddEntries()
+{
+ super::AddEntries();
+
+ AddButton(ResString(IDS_EXPLORE), ICID_EXPLORER, false, IDC_EXPLORE);
+}
+
+
+LRESULT StartMenuRoot::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_PAINT: {
+ PaintCanvas canvas(_hwnd);
+ Paint(canvas);
+ break;}
+
+ case WM_DISPLAYCHANGE:
+ // re-evaluate logo size using the correct color depth
+ ReadLogoSize();
+ break;
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+void StartMenuRoot::Paint(PaintCanvas& canvas)
+{
+ MemCanvas mem_dc;
+ ResBitmap bmp(GetLogoResId());
+ BitmapSelection sel(mem_dc, bmp);
+
+ ClientRect clnt(_hwnd);
+ int h = min(_logo_size.cy, clnt.bottom);
+
+ RECT rect = {0, 0, _logo_size.cx, clnt.bottom-h};
+ HBRUSH hbr = CreateSolidBrush(GetPixel(mem_dc, 0, 0));
+ FillRect(canvas, &rect, hbr);
+ DeleteObject(hbr);
+
+ PatBlt(canvas, _logo_size.cx, 0, 1, clnt.bottom, WHITENESS);
+
+ BitBlt(canvas, 0, clnt.bottom-h, _logo_size.cx, h, mem_dc, 0, ( h<_logo_size.cy ? _logo_size.cy-h : 0) , SRCCOPY);
+
+ super::Paint(canvas);
+}
+
+UINT StartMenuRoot::GetLogoResId()
+{
+ WindowCanvas dc(_hwnd);
+
+ int clr_bits = GetDeviceCaps(dc, BITSPIXEL);
+
+ if (clr_bits > 8)
+ return IDB_LOGOV;
+ else if (clr_bits > 4)
+ return IDB_LOGOV256;
+ else
+ return IDB_LOGOV16;
+}
+
+
+void StartMenuRoot::CloseStartMenu(int id)
+{
+ if (_submenu)
+ CloseSubmenus();
+
+ ShowWindow(_hwnd, SW_HIDE);
+}
+
+void StartMenuRoot::ProcessKey(int vk)
+{
+ switch(vk) {
+ case VK_LEFT:
+ if (_submenu)
+ CloseOtherSubmenus();
+ // don't close start menu root
+ break;
+
+ default:
+ super::ProcessKey(vk);
+ }
+}
+
+
+int StartMenuHandler::Command(int id, int code)
+{
+ switch(id) {
+
+ // start menu root
+
+ case IDC_PROGRAMS:
+ CreateSubmenu(id, CSIDL_COMMON_PROGRAMS, CSIDL_PROGRAMS, ResString(IDS_PROGRAMS));
+ break;
+
+ case IDC_EXPLORE:
+ CloseStartMenu(id);
+ explorer_show_frame(SW_SHOWNORMAL);
+ break;
+
+ case IDC_LAUNCH:
+ CloseStartMenu(id);
+ ShowLaunchDialog(g_Globals._hwndDesktopBar);
+ break;
+
+ case IDC_DOCUMENTS:
+ CreateSubmenu(id, CSIDL_PERSONAL, ResString(IDS_DOCUMENTS));
+ break;
+
+ case IDC_RECENT:
+ CreateSubmenu(id, CSIDL_RECENT, ResString(IDS_RECENT), STARTMENU_CREATOR(RecentStartMenu));
+ break;
+
+ case IDC_FAVORITES:
+#ifndef _SHELL32_FAVORITES
+ CreateSubmenu(id, ResString(IDS_FAVORITES), STARTMENU_CREATOR(FavoritesMenu), &static_cast<BookmarkList&>(g_Globals._favorites));
+#else
+ CreateSubmenu(id, CSIDL_COMMON_FAVORITES, CSIDL_FAVORITES, ResString(IDS_FAVORITES));
+#endif
+ break;
+
+ case IDC_BROWSE:
+ CreateSubmenu(id, ResString(IDS_BROWSE), STARTMENU_CREATOR(BrowseMenu));
+ break;
+
+ case IDC_SETTINGS:
+ CreateSubmenu(id, ResString(IDS_SETTINGS), STARTMENU_CREATOR(SettingsMenu));
+ break;
+
+ case IDC_SEARCH:
+ CreateSubmenu(id, ResString(IDS_SEARCH), STARTMENU_CREATOR(SearchMenu));
+ break;
+
+ case IDC_START_HELP:
+ CloseStartMenu(id);
+ MessageBox(g_Globals._hwndDesktopBar, TEXT("Help not yet implemented"), ResString(IDS_TITLE), MB_OK);
+ break;
+
+ case IDC_LOGOFF:
+ CloseStartMenu(id);
+ ShowLogoffDialog(g_Globals._hwndDesktopBar);
+ break;
+
+#ifndef _ROS_
+ case IDC_TERMINATE:
+ DestroyWindow(GetParent(_hwnd));
+ break;
+#endif
+
+ case IDC_SHUTDOWN:
+ CloseStartMenu(id);
+ ShowExitWindowsDialog(g_Globals._hwndDesktopBar);
+ break;
+
+
+ // settings menu
+
+ case ID_DESKTOPBAR_SETTINGS:
+ CloseStartMenu(id);
+ ExplorerPropertySheet(g_Globals._hwndDesktopBar);
+ break;
+
+ case IDC_CONTROL_PANEL: {
+ CloseStartMenu(id);
+#ifndef ROSSHELL
+#ifndef _NO_MDI
+ XMLPos explorer_options = g_Globals.get_cfg("general/explorer");
+ bool mdi = XMLBool(explorer_options, "mdi", true);
+
+ if (mdi)
+ MDIMainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"), 0);
+ else
+#endif
+ SDIMainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}"), 0);
+#else
+ launch_file(_hwnd, SHELLPATH_CONTROL_PANEL);
+#endif
+ break;}
+
+ case IDC_SETTINGS_MENU:
+ CreateSubmenu(id, CSIDL_CONTROLS, ResString(IDS_SETTINGS_MENU));
+ break;
+
+ case IDC_PRINTERS: {
+ CloseStartMenu(id);
+
+#ifndef ROSSHELL
+#ifdef _ROS_ // to be removed when printer folder will be implemented
+ MessageBox(0, TEXT("printer folder not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
+#else
+#ifndef _NO_MDI
+ XMLPos explorer_options = g_Globals.get_cfg("general/explorer");
+ bool mdi = XMLBool(explorer_options, "mdi", true);
+
+ if (mdi)
+ MDIMainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}"), 0);
+ else
+#endif
+ SDIMainFrame::Create(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}"), 0);
+#endif
+#else
+ launch_file(_hwnd, SHELLPATH_PRINTERS);
+#endif
+ break;}
+
+#if 0 ///@todo use printer start menu folder per default and allow opening "printers" cabinet window using the context menu
+ case IDC_PRINTERS_MENU:
+ CreateSubmenu(id, CSIDL_PRINTERS, CSIDL_PRINTHOOD, ResString(IDS_PRINTERS));
+/* StartMenuFolders new_folders;
+
+ try {
+ new_folders.push_back(ShellPath(TEXT("::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{21EC2020-3AEA-1069-A2DD-08002B30309D}\\::{2227A280-3AEA-1069-A2DE-08002B30309D}")));
+ } catch(COMException&) {
+ }
+
+ CreateSubmenu(id, new_folders, ResString(IDS_PRINTERS));*/
+ break;
+#endif
+
+ case IDC_ADMIN:
+#ifndef ROSSHELL
+ CreateSubmenu(id, CSIDL_COMMON_ADMINTOOLS, CSIDL_ADMINTOOLS, ResString(IDS_ADMIN));
+ //CloseStartMenu(id);
+ //MainFrame::Create(SpecialFolderPath(CSIDL_COMMON_ADMINTOOLS, _hwnd), OWM_PIDL);
+#else
+ launch_file(_hwnd, SpecialFolderFSPath(CSIDL_COMMON_ADMINTOOLS, _hwnd));
+#endif
+ break;
+
+ case IDC_CONNECTIONS:
+#ifndef ROSSHELL
+#ifdef _ROS_ // to be removed when RAS will be implemented
+ MessageBox(0, TEXT("RAS folder not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
+#else
+ CreateSubmenu(id, CSIDL_CONNECTIONS, ResString(IDS_CONNECTIONS));
+ //CloseStartMenu(id);
+ //MainFrame::Create(SpecialFolderPath(CSIDL_CONNECTIONS, _hwnd), OWM_PIDL);
+#endif
+#else
+ launch_file(_hwnd, SHELLPATH_NET_CONNECTIONS);
+#endif
+ break;
+
+
+ // browse menu
+
+ case IDC_NETWORK:
+#ifdef _ROS_ ///@todo to be removed when network browsing will be implemented in shell namespace
+ MessageBox(0, TEXT("network not yet implemented"), ResString(IDS_TITLE), MB_OK);
+#else
+ CreateSubmenu(id, CSIDL_NETWORK, ResString(IDS_NETWORK));
+#endif
+ break;
+
+ case IDC_DRIVES:
+ ///@todo exclude removable drives
+ CreateSubmenu(id, CSIDL_DRIVES, ResString(IDS_DRIVES));
+ break;
+
+
+ // search menu
+
+ case IDC_SEARCH_PROGRAM:
+ CloseStartMenu(id);
+ Dialog::DoModal(IDD_SEARCH_PROGRAM, WINDOW_CREATOR(FindProgramDlg));
+ break;
+
+ case IDC_SEARCH_FILES:
+ CloseStartMenu(id);
+ ShowSearchDialog();
+ break;
+
+ case IDC_SEARCH_COMPUTER:
+ CloseStartMenu(id);
+ ShowSearchComputer();
+ break;
+
+
+ default:
+ return super::Command(id, code);
+ }
+
+ return 0;
+}
+
+
+void StartMenuHandler::ShowSearchDialog()
+{
+#ifndef _ROS_ ///@todo to be removed when SHFindFiles() will be implemented in shell32.dll
+ static DynamicFct<SHFINDFILES> SHFindFiles(TEXT("SHELL32"), 90);
+
+ if (SHFindFiles)
+ (*SHFindFiles)(NULL, NULL);
+ else
+#endif
+ MessageBox(0, TEXT("SHFindFiles() not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
+}
+
+void StartMenuHandler::ShowSearchComputer()
+{
+#ifndef _ROS_ ///@todo to be removed when SHFindComputer() will be implemented in shell32.dll
+ static DynamicFct<SHFINDCOMPUTER> SHFindComputer(TEXT("SHELL32"), 91);
+
+ if (SHFindComputer)
+ (*SHFindComputer)(NULL, NULL);
+ else
+#endif
+ MessageBox(0, TEXT("SHFindComputer() not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
+}
+
+void StartMenuHandler::ShowLaunchDialog(HWND hwndOwner)
+{
+ ///@todo All text phrases should be put into the resources.
+ static LPCSTR szTitle = "Run";
+ static LPCSTR szText = "Type the name of a program, folder, document, or Internet resource, and Explorer will open it for you.";
+
+ static DynamicFct<RUNFILEDLG> RunFileDlg(TEXT("SHELL32"), 61);
+
+ // Show "Run..." dialog
+ if (RunFileDlg) {
+#ifndef _ROS_ /* FIXME: our shell32 always expects Ansi strings */
+ if ((HIWORD(GetVersion())>>14) == W_VER_NT) {
+ WCHAR wTitle[40], wText[256];
+
+ MultiByteToWideChar(CP_ACP, 0, szTitle, -1, wTitle, 40);
+ MultiByteToWideChar(CP_ACP, 0, szText, -1, wText, 256);
+
+ (*RunFileDlg)(hwndOwner, 0, NULL, (LPCSTR)wTitle, (LPCSTR)wText, RFF_CALCDIRECTORY);
+ }
+ else
+#endif
+ (*RunFileDlg)(hwndOwner, 0, NULL, szTitle, szText, RFF_CALCDIRECTORY);
+ }
+}
+
+void StartMenuHandler::ShowLogoffDialog(HWND hwndOwner)
+{
+ static DynamicFct<LOGOFFWINDOWSDIALOG> LogoffWindowsDialog(TEXT("SHELL32"), 54);
+// static DynamicFct<RESTARTWINDOWSDLG> RestartDialog(TEXT("SHELL32"), 59);
+
+ if (LogoffWindowsDialog)
+ (*LogoffWindowsDialog)(0);
+/* The RestartDialog function prompts about some system setting change. This is not what we want to display here.
+ else if (RestartDialog)
+ return (*RestartDialog)(hwndOwner, (LPWSTR)L"You selected <Log Off>.\n\n", EWX_LOGOFF) == 1; ///@todo ANSI string conversion if needed
+*/
+ else
+ MessageBox(hwndOwner, TEXT("LogoffWindowsDialog() not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
+}
+
+void ShowExitWindowsDialog(HWND hwndOwner)
+{
+ static DynamicFct<EXITWINDOWSDLG> ExitWindowsDialog(TEXT("SHELL32"), 60);
+
+ if (ExitWindowsDialog)
+ (*ExitWindowsDialog)(hwndOwner);
+ else
+ MessageBox(hwndOwner, TEXT("ExitWindowsDialog() not yet implemented in SHELL32"), ResString(IDS_TITLE), MB_OK);
+}
+
+
+void SettingsMenu::AddEntries()
+{
+ super::AddEntries();
+
+#if defined(ROSSHELL) || defined(_ROS_) // _ROS_ to be removed when printer/network will be implemented
+//TODO AddButton(ResString(IDS_PRINTERS), ICID_PRINTER, false, IDC_PRINTERS_MENU);
+ AddButton(ResString(IDS_CONNECTIONS), ICID_NETWORK, false, IDC_CONNECTIONS);
+#else
+//TODO AddButton(ResString(IDS_PRINTERS), ICID_PRINTER, true, IDC_PRINTERS_MENU);
+ AddButton(ResString(IDS_CONNECTIONS), ICID_NETCONNS, false, IDC_CONNECTIONS);
+#endif
+ AddButton(ResString(IDS_ADMIN), ICID_ADMIN, true, IDC_ADMIN);
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || !SHRestricted(REST_NOCONTROLPANEL))
+#endif
+ AddButton(ResString(IDS_SETTINGS_MENU), ICID_CONFIG, true, IDC_SETTINGS_MENU);
+
+ AddButton(ResString(IDS_DESKTOPBAR_SETTINGS), ICID_DESKSETTING, false, ID_DESKTOPBAR_SETTINGS);
+
+ AddButton(ResString(IDS_PRINTERS), ICID_PRINTER, false, IDC_PRINTERS);
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || !SHRestricted(REST_NOCONTROLPANEL))
+#endif
+ AddButton(ResString(IDS_CONTROL_PANEL), ICID_CONTROLPAN, false, IDC_CONTROL_PANEL);
+}
+
+void BrowseMenu::AddEntries()
+{
+ super::AddEntries();
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || !SHRestricted(REST_NONETHOOD)) // or REST_NOENTIRENETWORK ?
+#endif
+#if defined(ROSSHELL) || defined(_ROS_) // _ROS_ to be removed when printer/network will be implemented
+ AddButton(ResString(IDS_NETWORK), ICID_NETWORK, false, IDC_NETWORK);
+#else
+ AddButton(ResString(IDS_NETWORK), ICID_NETWORK, true, IDC_NETWORK);
+#endif
+
+ AddButton(ResString(IDS_DRIVES), ICID_FOLDER, true, IDC_DRIVES);
+}
+
+void SearchMenu::AddEntries()
+{
+ super::AddEntries();
+
+ AddButton(ResString(IDS_SEARCH_FILES), ICID_SEARCH_DOC, false, IDC_SEARCH_FILES);
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || !SHRestricted(REST_HASFINDCOMPUTERS))
+#endif
+ AddButton(ResString(IDS_SEARCH_COMPUTER),ICID_COMPUTER, false, IDC_SEARCH_COMPUTER);
+
+ AddButton(ResString(IDS_SEARCH_PRG), ICID_APPS, false, IDC_SEARCH_PROGRAM);
+}
+
+
+void RecentStartMenu::AddEntries()
+{
+ for(StartMenuShellDirs::iterator it=_dirs.begin(); it!=_dirs.end(); ++it) {
+ StartMenuDirectory& smd = *it;
+ ShellDirectory& dir = smd._dir;
+
+ if (!dir._scanned) {
+ WaitCursor wait;
+
+#ifdef _LAZY_ICONEXTRACT
+ dir.smart_scan(SORT_NAME, SCAN_DONT_EXTRACT_ICONS);
+#else
+ dir.smart_scan(SORT_NAME);
+#endif
+ }
+
+ dir.sort_directory(SORT_DATE);
+ AddShellEntries(dir, RECENT_DOCS_COUNT, smd._ignore); ///@todo read max. count of entries from registry
+ }
+}
+
+
+#ifndef _SHELL32_FAVORITES
+
+void FavoritesMenu::AddEntries()
+{
+ super::AddEntries();
+
+ String lwr_filter = _create_info._filter;
+ lwr_filter.toLower();
+
+ for(BookmarkList::iterator it=_bookmarks.begin(); it!=_bookmarks.end(); ++it) {
+ BookmarkNode& node = *it;
+
+ int id = ++_next_id;
+
+ _entries[id] = node;
+
+ if (node._type == BookmarkNode::BMNT_FOLDER) {
+ BookmarkFolder& folder = *node._pfolder;
+
+ AddButton(folder._name, ICID_FOLDER, true, id);
+ } else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
+ Bookmark& bookmark = *node._pbookmark;
+
+ ICON_ID icon = ICID_NONE;
+
+ if (!bookmark._icon_path.empty())
+ icon = g_Globals._icon_cache.extract(bookmark._icon_path, bookmark._icon_idx);
+
+ // filter non-directory entries
+ if (!lwr_filter.empty()) {
+ String lwr_name = bookmark._name;
+ String lwr_desc = bookmark._description;
+ String lwr_url = bookmark._url;
+
+ lwr_name.toLower();
+ lwr_desc.toLower();
+ lwr_url.toLower();
+
+ if (!_tcsstr(lwr_name,lwr_filter) && !_tcsstr(lwr_desc,lwr_filter) && !_tcsstr(lwr_url,lwr_filter))
+ continue;
+ }
+
+ AddButton(bookmark._name, icon!=ICID_NONE?icon:ICID_BOOKMARK, false, id);
+ }
+ }
+}
+
+int FavoritesMenu::Command(int id, int code)
+{
+ BookmarkMap::iterator found = _entries.find(id);
+
+ if (found != _entries.end()) {
+ BookmarkNode& node = found->second;
+
+ if (node._type == BookmarkNode::BMNT_FOLDER) {
+ BookmarkFolder& folder = *node._pfolder;
+
+ if (CloseOtherSubmenus(id))
+ CreateSubmenu(id, folder._name, STARTMENU_CREATOR(FavoritesMenu), &static_cast<BookmarkList&>(folder._bookmarks));
+ } else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
+ Bookmark& bookmark = *node._pbookmark;
+
+ String url = bookmark._url;
+ HWND hparent = GetParent(_hwnd);
+
+ CloseStartMenu(id);
+
+ launch_file(hparent, url, SW_SHOWNORMAL);
+ }
+
+ return 0;
+ }
+
+ return super::Command(id, code);
+}
+
+#endif
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer and Desktop clone
+ //
+ // startmenu.h
+ //
+ // Martin Fuchs, 16.08.2003
+ //
+
+
+#define CLASSNAME_STARTMENU TEXT("ReactosStartmenuClass")
+#define TITLE_STARTMENU TEXT("Start Menu")
+
+
+#define STARTMENU_WIDTH_MIN 120
+#define STARTMENU_LINE_HEIGHT(icon_size) (icon_size+4)
+#define STARTMENU_SEP_HEIGHT(icon_size) (STARTMENU_LINE_HEIGHT(icon_size)/2)
+#define STARTMENU_TOP_BTN_SPACE 8
+
+
+ // private message constants
+#define PM_STARTMENU_CLOSED (WM_APP+0x11)
+#define PM_STARTENTRY_LAUNCHED (WM_APP+0x12)
+
+#ifndef _LIGHT_STARTMENU
+#define PM_STARTENTRY_FOCUSED (WM_APP+0x13)
+#endif
+
+#define PM_UPDATE_ICONS (WM_APP+0x14)
+#define PM_SELECT_ENTRY (WM_APP+0x15)
+
+
+ /// StartMenuDirectory is used to store the base directory of start menus.
+struct StartMenuDirectory
+{
+ StartMenuDirectory(const ShellDirectory& dir, const String& ignore="")
+ : _dir(dir), _ignore(ignore)
+ {
+ }
+
+ ~StartMenuDirectory()
+ {
+ _dir.free_subentries();
+ }
+
+ ShellDirectory _dir;
+ String _ignore;
+};
+
+typedef list<StartMenuDirectory> StartMenuShellDirs;
+typedef set<Entry*> ShellEntrySet;
+
+ /// structure holding information about one start menu entry
+struct StartMenuEntry
+{
+ StartMenuEntry() : _icon_id(ICID_UNKNOWN) {}
+
+ String _title;
+ ICON_ID _icon_id;
+ ShellEntrySet _entries;
+};
+
+
+extern int GetStartMenuBtnTextWidth(HDC hdc, LPCTSTR title, HWND hwnd);
+
+
+#ifndef _LIGHT_STARTMENU
+
+ /**
+ StartMenuButton draws the face of a StartMenuCtrl button control.
+ */
+struct StartMenuButton : public OwnerdrawnButton
+{
+ typedef OwnerdrawnButton super;
+
+ StartMenuButton(HWND hwnd, ICON_ID icon_id, bool hasSubmenu)
+ : super(hwnd), _hIcon(hIcon), _hasSubmenu(hasSubmenu) {}
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ virtual void DrawItem(LPDRAWITEMSTRUCT dis);
+
+ ICON_ID _icon_id;
+ bool _hasSubmenu;
+};
+
+
+ /**
+ To create a Startmenu button control, construct a StartMenuCtrl object.
+ */
+struct StartMenuCtrl : public Button
+{
+ StartMenuCtrl(HWND parent, int x, int y, int w, LPCTSTR title,
+ UINT id, HICON hIcon=0, bool hasSubmenu=false, DWORD style=WS_VISIBLE|WS_CHILD|BS_OWNERDRAW, DWORD exStyle=0)
+ : Button(parent, title, x, y, w, STARTMENU_LINE_HEIGHT(icon_size), id, style, exStyle)
+ {
+ *new StartMenuButton(_hwnd, hIcon, hasSubmenu);
+
+ SetWindowFont(_hwnd, GetStockFont(DEFAULT_GUI_FONT), FALSE);
+ }
+};
+
+
+ /// separator between start menu entries
+struct StartMenuSeparator : public Static
+{
+ StartMenuSeparator(HWND parent, int x, int y, int w, DWORD style=WS_VISIBLE|WS_CHILD|WS_DISABLED|SS_ETCHEDHORZ, DWORD exStyle=0)
+ : Static(parent, NULL, x, y+STARTMENU_SEP_HEIGHT(icon_size)/2-1, w, 2, -1, style, exStyle)
+ {
+ }
+};
+
+#endif
+
+
+typedef list<ShellPath> StartMenuFolders;
+
+ /// structor containing information for creating of start menus
+struct StartMenuCreateInfo
+{
+ StartMenuCreateInfo() : _border_top(0) {}
+
+ StartMenuFolders _folders;
+ int _border_top;
+ String _title;
+ Window::CREATORFUNC_INFO _creator;
+ void* _info;
+ String _filter;
+};
+
+#define STARTMENU_CREATOR(WND_CLASS) WINDOW_CREATOR_INFO(WND_CLASS, StartMenuCreateInfo)
+
+typedef map<int, StartMenuEntry> ShellEntryMap;
+
+
+#ifdef _LIGHT_STARTMENU
+
+struct SMBtnInfo
+{
+ SMBtnInfo(const StartMenuEntry& entry, int id, bool hasSubmenu=false, bool enabled=true)
+ : _title(entry._title),
+ _icon_id(entry._icon_id),
+ _id(id),
+ _hasSubmenu(hasSubmenu),
+ _enabled(enabled)
+ {
+ }
+
+ SMBtnInfo(LPCTSTR title, ICON_ID icon_id, int id, bool hasSubmenu=false, bool enabled=true)
+ : _title(title),
+ _icon_id(icon_id),
+ _id(id),
+ _hasSubmenu(hasSubmenu),
+ _enabled(enabled)
+ {
+ }
+
+ String _title;
+ ICON_ID _icon_id;
+ int _id;
+ bool _hasSubmenu;
+ bool _enabled;
+};
+
+typedef vector<SMBtnInfo> SMBtnVector;
+
+extern void DrawStartMenuButton(HDC hdc, const RECT& rect, LPCTSTR title, const SMBtnInfo& btn, bool has_focus, bool pushed, int icon_size);
+
+#else
+
+extern void DrawStartMenuButton(HDC hdc, const RECT& rect, LPCTSTR title, HICON hIcon,
+ bool hasSubmenu, bool enabled, bool has_focus, bool pushed, int icon_size);
+
+#endif
+
+
+ /**
+ Startmenu window.
+ To create a start menu call its Create() function.
+ */
+struct StartMenu :
+#ifdef _LIGHT_STARTMENU
+ public ExtContextMenuHandlerT<OwnerDrawParent<Window> >
+#else
+ public ExtContextMenuHandlerT<OwnerDrawParent<DialogWindow> >
+#endif
+{
+#ifdef _LIGHT_STARTMENU
+ typedef ExtContextMenuHandlerT<OwnerDrawParent<Window> > super;
+#else
+ typedef ExtContextMenuHandlerT<OwnerDrawParent<DialogWindow> > super;
+#endif
+
+ StartMenu(HWND hwnd, int icon_size=ICON_SIZE_SMALL);
+ StartMenu(HWND hwnd, const StartMenuCreateInfo& create_info, int icon_size=ICON_SIZE_SMALL);
+ ~StartMenu();
+
+ static HWND Create(int x, int y, const StartMenuFolders&, HWND hwndParent, LPCTSTR title,
+ CREATORFUNC_INFO creator=s_def_creator, void* info=NULL, const String& filter="");
+ static CREATORFUNC_INFO s_def_creator;
+
+protected:
+ // overridden member functions
+ LRESULT Init(LPCREATESTRUCT pcs);
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Command(int id, int code);
+
+ // window class
+ static BtnWindowClass& GetWndClasss();
+
+ // data members
+ int _next_id;
+ ShellEntryMap _entries;
+ StartMenuShellDirs _dirs;
+
+ int _submenu_id;
+ WindowHandle _submenu;
+
+ int _border_left; // left border in pixels
+ int _border_top; // top border in pixels
+ int _bottom_max; // limit display area for long start menus
+
+ bool _floating_btn;
+ bool _arrow_btns;
+
+ POINT _last_pos;
+ enum SCROLL_MODE {SCROLL_NOT, SCROLL_UP, SCROLL_DOWN} _scroll_mode;
+ int _scroll_pos;
+ int _invisible_lines;
+
+ StartMenuCreateInfo _create_info; // copy of the original create info
+
+ int _icon_size;
+
+#ifdef _LIGHT_STARTMENU
+ SMBtnVector _buttons;
+ int _selected_id;
+ LPARAM _last_mouse_pos;
+
+ void ResizeToButtons();
+ int ButtonHitTest(POINT pt);
+ void InvalidateSelection();
+ const SMBtnInfo* GetButtonInfo(int id) const;
+ bool SelectButton(int id, bool open_sub=true);
+ bool SelectButtonIndex(int idx, bool open_sub=true);
+ int GetSelectionIndex();
+ virtual void ProcessKey(int vk);
+ bool Navigate(int step);
+ bool OpenSubmenu(bool select_first=false);
+ bool JumpToNextShortcut(char c);
+#endif
+
+ // member functions
+ void ResizeButtons(int cx);
+
+ virtual void AddEntries();
+
+ ShellEntryMap::iterator AddEntry(const String& title, ICON_ID icon_id, Entry* entry);
+ ShellEntryMap::iterator AddEntry(const String& title, ICON_ID icon_id=ICID_NONE, int id=-1);
+ ShellEntryMap::iterator AddEntry(const ShellFolder folder, ShellEntry* entry);
+ ShellEntryMap::iterator AddEntry(const ShellFolder folder, Entry* entry);
+
+ void AddShellEntries(const ShellDirectory& dir, int max=-1, const String& ignore="");
+
+ void AddButton(LPCTSTR title, ICON_ID icon_id=ICID_NONE, bool hasSubmenu=false, int id=-1, bool enabled=true);
+ void AddSeparator();
+
+ bool CloseSubmenus() {return CloseOtherSubmenus();}
+ bool CloseOtherSubmenus(int id=0);
+ void CreateSubmenu(int id, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator, void*info=NULL);
+ bool CreateSubmenu(int id, int folder, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator, void*info=NULL);
+ bool CreateSubmenu(int id, int folder1, int folder2, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator, void*info=NULL);
+ void CreateSubmenu(int id, const StartMenuFolders& new_folders, LPCTSTR title, CREATORFUNC_INFO creator=s_def_creator, void*info=NULL);
+ void ActivateEntry(int id, const ShellEntrySet& entries);
+ virtual void CloseStartMenu(int id=0);
+
+ bool GetButtonRect(int id, PRECT prect) const;
+
+ void DrawFloatingButton(HDC hdc);
+ void GetFloatingButtonRect(LPRECT prect);
+ void GetArrowButtonRects(LPRECT prect_up, LPRECT prect_down, int icon_size);
+
+ void DrawArrows(HDC hdc, int icon_size);
+
+ void Paint(PaintCanvas& canvas);
+ void UpdateIcons(/*int idx*/);
+};
+
+
+ // declare shell32's "Run..." dialog export function
+typedef void (WINAPI* RUNFILEDLG)(HWND hwndOwner, HICON hIcon, LPCSTR lpstrDirectory, LPCSTR lpstrTitle, LPCSTR lpstrDescription, UINT uFlags);
+
+ //
+ // Flags for RunFileDlg
+ //
+
+#define RFF_NOBROWSE 0x01 // Removes the browse button.
+#define RFF_NODEFAULT 0x02 // No default item selected.
+#define RFF_CALCDIRECTORY 0x04 // Calculates the working directory from the file name.
+#define RFF_NOLABEL 0x08 // Removes the edit box label.
+#define RFF_NOSEPARATEMEM 0x20 // Removes the Separate Memory Space check box (Windows NT only).
+
+
+ // declare more previously undocumented shell32 functions
+typedef void (WINAPI* EXITWINDOWSDLG)(HWND hwndOwner);
+typedef int (WINAPI* LOGOFFWINDOWSDIALOG)(UINT flags);
+typedef int (WINAPI* RESTARTWINDOWSDLG)(HWND hwndOwner, LPCWSTR reason, UINT flags);
+typedef int (WINAPI* RESTARTWINDOWSDLGEX)(HWND hWndOwner, LPCWSTR lpwstrReason, DWORD uFlags, DWORD uReason);
+typedef BOOL (WINAPI* SHFINDFILES)(LPCITEMIDLIST pidlRoot, LPCITEMIDLIST pidlSavedSearch);
+typedef BOOL (WINAPI* SHFINDCOMPUTER)(LPCITEMIDLIST pidlRoot, LPCITEMIDLIST pidlSavedSearch);
+
+
+ /// Handling of standard start menu commands
+struct StartMenuHandler : public StartMenu
+{
+ typedef StartMenu super;
+
+ StartMenuHandler(HWND hwnd, int icon_size=ICON_SIZE_SMALL)
+ : super(hwnd, icon_size)
+ {
+ }
+
+ StartMenuHandler(HWND hwnd, const StartMenuCreateInfo& create_info, int icon_size=ICON_SIZE_SMALL)
+ : super(hwnd, create_info, icon_size)
+ {
+ }
+
+protected:
+ int Command(int id, int code);
+
+ static void ShowLaunchDialog(HWND hwndOwner);
+ static void ShowLogoffDialog(HWND hwndOwner);
+ static void ShowSearchDialog();
+ static void ShowSearchComputer();
+};
+
+
+struct StartMenuRootCreateInfo
+{
+ int _icon_size;
+};
+
+
+ /// Startmenu root window
+struct StartMenuRoot : public StartMenuHandler
+{
+ typedef StartMenuHandler super;
+
+ StartMenuRoot(HWND hwnd, const StartMenuRootCreateInfo& info);
+
+ static HWND Create(HWND hwndDesktopBar, int icon_size);
+ void TrackStartmenu();
+
+protected:
+ LRESULT Init(LPCREATESTRUCT pcs);
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ SIZE _logo_size;
+
+ virtual void AddEntries();
+ virtual void ProcessKey(int vk);
+
+ void Paint(PaintCanvas& canvas);
+ void CloseStartMenu(int id=0);
+
+ void ReadLogoSize();
+ UINT GetLogoResId();
+};
+
+
+ /// Settings sub-startmenu
+struct SettingsMenu : public StartMenuHandler
+{
+ typedef StartMenuHandler super;
+
+ SettingsMenu(HWND hwnd, const StartMenuCreateInfo& create_info)
+ : super(hwnd, create_info)
+ {
+ }
+
+protected:
+ virtual void AddEntries();
+};
+
+
+ /// "Browse Files..." sub-start menu
+struct BrowseMenu : public StartMenuHandler
+{
+ typedef StartMenuHandler super;
+
+ BrowseMenu(HWND hwnd, const StartMenuCreateInfo& create_info)
+ : super(hwnd, create_info)
+ {
+ }
+
+protected:
+ virtual void AddEntries();
+};
+
+
+ /// Search sub-startmenu
+struct SearchMenu : public StartMenuHandler
+{
+ typedef StartMenuHandler super;
+
+ SearchMenu(HWND hwnd, const StartMenuCreateInfo& create_info)
+ : super(hwnd, create_info)
+ {
+ }
+
+protected:
+ virtual void AddEntries();
+};
+
+
+#define RECENT_DOCS_COUNT 20 ///@todo read max. count of entries from registry
+
+ /// "Recent Files" sub-start menu
+struct RecentStartMenu : public StartMenu
+{
+ typedef StartMenu super;
+
+ RecentStartMenu(HWND hwnd, const StartMenuCreateInfo& create_info)
+ : super(hwnd, create_info)
+ {
+ }
+
+protected:
+ virtual void AddEntries();
+};
+
+
+#ifndef _SHELL32_FAVORITES
+
+typedef map<int, BookmarkNode> BookmarkMap;
+
+ /// Bookmarks sub-startmenu
+struct FavoritesMenu : public StartMenu
+{
+ typedef StartMenu super;
+
+ FavoritesMenu(HWND hwnd, const StartMenuCreateInfo& create_info)
+ : super(hwnd, create_info),
+ _bookmarks(*(BookmarkList*)create_info._info)
+ {
+ }
+
+protected:
+ virtual int Command(int id, int code);
+ virtual void AddEntries();
+
+ BookmarkList _bookmarks;
+ BookmarkMap _entries;
+};
+
+#endif
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // taskbar.cpp
+ //
+ // Martin Fuchs, 16.08.2003
+ //
+
+
+#include <precomp.h>
+
+#include "taskbar.h"
+#include "traynotify.h" // for NOTIFYAREA_WIDTH_DEF
+
+
+DynamicFct<BOOL (WINAPI*)(HWND hwnd)> g_SetTaskmanWindow(TEXT("user32"), "SetTaskmanWindow");
+DynamicFct<BOOL (WINAPI*)(HWND hwnd)> g_RegisterShellHookWindow(TEXT("user32"), "RegisterShellHookWindow");
+DynamicFct<BOOL (WINAPI*)(HWND hwnd)> g_DeregisterShellHookWindow(TEXT("user32"), "DeregisterShellHookWindow");
+
+/*
+DynamicFct<BOOL (WINAPI*)(HWND hWnd, DWORD dwType)> g_RegisterShellHook(TEXT("shell32"), (LPCSTR)0xb5);
+
+ // constants for RegisterShellHook()
+#define RSH_UNREGISTER 0
+#define RSH_REGISTER 1
+#define RSH_REGISTER_PROGMAN 2
+#define RSH_REGISTER_TASKMAN 3
+*/
+
+
+TaskBarEntry::TaskBarEntry()
+{
+ _id = 0;
+ _hbmp = 0;
+ _bmp_idx = 0;
+ _used = 0;
+ _btn_idx = 0;
+ _fsState = 0;
+}
+
+TaskBarMap::~TaskBarMap()
+{
+ while(!empty()) {
+ iterator it = begin();
+ DeleteBitmap(it->second._hbmp);
+ erase(it);
+ }
+}
+
+
+TaskBar::TaskBar(HWND hwnd)
+ : super(hwnd),
+ WM_SHELLHOOK(RegisterWindowMessage(WINMSG_SHELLHOOK))
+{
+ _last_btn_width = 0;
+
+ _mmMetrics_org.cbSize = sizeof(MINIMIZEDMETRICS);
+
+ SystemParametersInfo(SPI_GETMINIMIZEDMETRICS, sizeof(_mmMetrics_org), &_mmMetrics_org, 0);
+
+ // configure the window manager to hide windows when they are minimized
+ // This is neccessary to enable shell hook messages.
+ if (!(_mmMetrics_org.iArrange & ARW_HIDE)) {
+ MINIMIZEDMETRICS _mmMetrics_new = _mmMetrics_org;
+
+ _mmMetrics_new.iArrange |= ARW_HIDE;
+
+ SystemParametersInfo(SPI_SETMINIMIZEDMETRICS, sizeof(_mmMetrics_new), &_mmMetrics_new, 0);
+ }
+}
+
+TaskBar::~TaskBar()
+{
+// if (g_RegisterShellHook)
+// (*g_RegisterShellHook)(_hwnd, RSH_UNREGISTER);
+
+ if (g_DeregisterShellHookWindow)
+ (*g_DeregisterShellHookWindow)(_hwnd);
+ else
+ KillTimer(_hwnd, 0);
+
+ if (g_SetTaskmanWindow)
+ (*g_SetTaskmanWindow)(0);
+
+ SystemParametersInfo(SPI_GETMINIMIZEDMETRICS, sizeof(_mmMetrics_org), &_mmMetrics_org, 0);
+}
+
+HWND TaskBar::Create(HWND hwndParent)
+{
+ ClientRect clnt(hwndParent);
+
+ int taskbar_pos = 80; // This start position will be adjusted in DesktopBar::Resize().
+
+ return Window::Create(WINDOW_CREATOR(TaskBar), 0,
+ BtnWindowClass(CLASSNAME_TASKBAR), TITLE_TASKBAR,
+ WS_CHILD|WS_VISIBLE | CCS_TOP|CCS_NODIVIDER|CCS_NORESIZE,
+ taskbar_pos, 0, clnt.right-taskbar_pos-(NOTIFYAREA_WIDTH_DEF+1), clnt.bottom, hwndParent);
+}
+
+LRESULT TaskBar::Init(LPCREATESTRUCT pcs)
+{
+ if (super::Init(pcs))
+ return 1;
+
+ /* FIXME: There's an internal padding for non-flat toolbar. Get rid of it somehow. */
+ _htoolbar = CreateToolbarEx(_hwnd,
+ WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
+ CCS_TOP|CCS_NODIVIDER|TBSTYLE_LIST|TBSTYLE_TOOLTIPS|TBSTYLE_WRAPABLE,//|TBSTYLE_AUTOSIZE
+ IDW_TASKTOOLBAR, 0, 0, 0, NULL, 0, 0, 0, 16, 16, sizeof(TBBUTTON));
+
+ SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(TASKBUTTONWIDTH_MAX,TASKBUTTONWIDTH_MAX));
+ //SendMessage(_htoolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS);
+ //SendMessage(_htoolbar, TB_SETDRAWTEXTFLAGS, DT_CENTER|DT_VCENTER, DT_CENTER|DT_VCENTER);
+ //SetWindowFont(_htoolbar, GetStockFont(ANSI_VAR_FONT), FALSE);
+ //SendMessage(_htoolbar, TB_SETPADDING, 0, MAKELPARAM(8,8));
+
+#ifndef __MINGW32__ // TBMETRICS missing in MinGW (as of 20.09.2005)
+ // set metrics for the Taskbar toolbar to enable button spacing
+ TBMETRICS metrics;
+
+ metrics.cbSize = sizeof(TBMETRICS);
+ metrics.dwMask = TBMF_BARPAD | TBMF_BUTTONSPACING;
+ metrics.cxBarPad = 0;
+ metrics.cyBarPad = 0;
+ metrics.cxButtonSpacing = 3;
+ metrics.cyButtonSpacing = 3;
+
+ SendMessage(_htoolbar, TB_SETMETRICS, 0, (LPARAM)&metrics);
+#endif
+
+ _next_id = IDC_FIRST_APP;
+
+ // register the taskbar window as task manager window to make the following call to RegisterShellHookWindow working
+ if (g_SetTaskmanWindow)
+ (*g_SetTaskmanWindow)(_hwnd);
+
+ if (g_RegisterShellHookWindow) {
+ LOG(TEXT("Using shell hooks for notification of shell events."));
+
+ (*g_RegisterShellHookWindow)(_hwnd);
+ } else {
+ LOG(TEXT("Shell hooks not available."));
+
+ SetTimer(_hwnd, 0, 200, NULL);
+ }
+
+/* Alternatively we could use the RegisterShellHook() function in SHELL32, but this is not yet implemented in the WINE code.
+ if (g_RegisterShellHook) {
+ (*g_RegisterShellHook)(0, RSH_REGISTER);
+
+ if ((HIWORD(GetVersion())>>14) == W_VER_NT)
+ (*g_RegisterShellHook)(_hwnd, RSH_REGISTER_TASKMAN);
+ else
+ (*g_RegisterShellHook)(_hwnd, RSH_REGISTER);
+ }
+*/
+ Refresh();
+
+ return 0;
+}
+
+LRESULT TaskBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_SIZE:
+ SendMessage(_htoolbar, WM_SIZE, 0, 0);
+ ResizeButtons();
+ break;
+
+ case WM_TIMER:
+ Refresh();
+ return 0;
+
+ case WM_CONTEXTMENU: {
+ Point pt(lparam);
+ ScreenToClient(_htoolbar, &pt);
+
+ if ((HWND)wparam==_htoolbar && SendMessage(_htoolbar, TB_HITTEST, 0, (LPARAM)&pt)>=0)
+ break; // avoid displaying context menu for application button _and_ desktop bar at the same time
+
+ goto def;}
+
+ case PM_GET_LAST_ACTIVE:
+ return (LRESULT)(HWND)_last_foreground_wnd;
+
+ default: def:
+ if (nmsg == WM_SHELLHOOK) {
+ switch(wparam) {
+ case HSHELL_WINDOWCREATED:
+ case HSHELL_WINDOWDESTROYED:
+ case HSHELL_WINDOWACTIVATED:
+ case HSHELL_REDRAW:
+#ifdef HSHELL_FLASH
+ case HSHELL_FLASH:
+#endif
+#ifdef HSHELL_RUDEAPPACTIVATED
+ case HSHELL_RUDEAPPACTIVATED:
+#endif
+ Refresh();
+ break;
+ }
+ } else {
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+ }
+
+ return 0;
+}
+
+int TaskBar::Command(int id, int code)
+{
+ TaskBarMap::iterator found = _map.find_id(id);
+
+ if (found != _map.end()) {
+ ActivateApp(found);
+ return 0;
+ }
+
+ return super::Command(id, code);
+}
+
+int TaskBar::Notify(int id, NMHDR* pnmh)
+{
+ if (pnmh->hwndFrom == _htoolbar)
+ switch(pnmh->code) {
+ case NM_RCLICK: {
+ TBBUTTONINFO btninfo;
+ TaskBarMap::iterator it;
+ Point pt(GetMessagePos());
+ ScreenToClient(_htoolbar, &pt);
+
+ btninfo.cbSize = sizeof(TBBUTTONINFO);
+ btninfo.dwMask = TBIF_BYINDEX|TBIF_COMMAND;
+
+ int idx = SendMessage(_htoolbar, TB_HITTEST, 0, (LPARAM)&pt);
+
+ if (idx>=0 &&
+ SendMessage(_htoolbar, TB_GETBUTTONINFO, idx, (LPARAM)&btninfo)!=-1 &&
+ (it=_map.find_id(btninfo.idCommand))!=_map.end()) {
+ //TaskBarEntry& entry = it->second;
+
+ ActivateApp(it, false, false); // don't restore minimized windows on right button click
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ static DynamicFct<DWORD(STDAPICALLTYPE*)(RESTRICTIONS)> pSHRestricted(TEXT("SHELL32"), "SHRestricted");
+
+ if (pSHRestricted && !(*pSHRestricted)(REST_NOTRAYCONTEXTMENU))
+#endif
+ ShowAppSystemMenu(it);
+ }
+ break;}
+
+ default:
+ return super::Notify(id, pnmh);
+ }
+
+ return 0;
+}
+
+
+void TaskBar::ActivateApp(TaskBarMap::iterator it, bool can_minimize, bool can_restore)
+{
+ HWND hwnd = it->first;
+
+ bool minimize_it = can_minimize && !IsIconic(hwnd) &&
+ (hwnd==GetForegroundWindow() || hwnd==_last_foreground_wnd);
+
+ // switch to selected application window
+ if (can_restore && !minimize_it)
+ if (IsIconic(hwnd))
+ PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
+
+ // In case minimize_it is true, we _have_ to switch to the app before
+ // posting SW_MINIMIZE to be compatible with some applications (e.g. "Sleipnir")
+ SetForegroundWindow(hwnd);
+
+ if (minimize_it) {
+ PostMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
+ _last_foreground_wnd = 0;
+ } else
+ _last_foreground_wnd = hwnd;
+
+ Refresh();
+}
+
+void TaskBar::ShowAppSystemMenu(TaskBarMap::iterator it)
+{
+ HMENU hmenu = GetSystemMenu(it->first, FALSE);
+
+ if (hmenu) {
+ POINT pt;
+
+ GetCursorPos(&pt);
+ int cmd = TrackPopupMenu(hmenu, TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_RETURNCMD, pt.x, pt.y, 0, _hwnd, NULL);
+
+ if (cmd) {
+ ActivateApp(it, false, false); // reactivate window after the context menu has closed
+ PostMessage(it->first, WM_SYSCOMMAND, cmd, 0);
+ }
+ }
+}
+
+
+HICON get_window_icon_small(HWND hwnd)
+{
+ HICON hIcon = 0;
+
+ SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
+
+ if (!hIcon)
+ SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
+
+ if (!hIcon)
+ SendMessageTimeout(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
+
+ if (!hIcon)
+ hIcon = (HICON)GetClassLong(hwnd, GCL_HICONSM);
+
+ if (!hIcon)
+ hIcon = (HICON)GetClassLong(hwnd, GCL_HICON);
+
+ if (!hIcon)
+ SendMessageTimeout(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (LPDWORD)&hIcon);
+
+ return hIcon;
+}
+
+HICON get_window_icon_big(HWND hwnd, bool allow_from_class)
+{
+ HICON hIcon = 0;
+
+ SendMessageTimeout(hwnd, WM_GETICON, ICON_BIG, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
+
+ if (!hIcon)
+ SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL2, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
+
+ if (!hIcon)
+ SendMessageTimeout(hwnd, WM_GETICON, ICON_SMALL, 0, SMTO_ABORTIFHUNG, 1000, (LPDWORD)&hIcon);
+
+ if (allow_from_class) {
+ if (!hIcon)
+ hIcon = (HICON)GetClassLong(hwnd, GCL_HICON);
+
+ if (!hIcon)
+ hIcon = (HICON)GetClassLong(hwnd, GCL_HICONSM);
+ }
+
+ if (!hIcon)
+ SendMessageTimeout(hwnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (LPDWORD)&hIcon);
+
+ return hIcon;
+}
+
+ // fill task bar with buttons for enumerated top level windows
+BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam)
+{
+ TaskBar* pThis = (TaskBar*)lparam;
+
+ DWORD style = GetWindowStyle(hwnd);
+ DWORD ex_style = GetWindowExStyle(hwnd);
+
+ if ((style&WS_VISIBLE) && !(ex_style&WS_EX_TOOLWINDOW) &&
+ !GetParent(hwnd) && !GetWindow(hwnd,GW_OWNER)) {
+ TCHAR title[BUFFER_LEN];
+
+ if (!GetWindowText(hwnd, title, BUFFER_LEN))
+ title[0] = '\0';
+
+ TaskBarMap::iterator found = pThis->_map.find(hwnd);
+ int last_id = 0;
+
+ if (found != pThis->_map.end()) {
+ last_id = found->second._id;
+
+ if (!last_id)
+ found->second._id = pThis->_next_id++;
+ } else {
+ HBITMAP hbmp;
+ HICON hIcon = get_window_icon_small(hwnd);
+ BOOL delete_icon = FALSE;
+
+ if (!hIcon) {
+ hIcon = LoadIcon(0, IDI_APPLICATION);
+ delete_icon = TRUE;
+ }
+
+ if (hIcon) {
+ hbmp = create_bitmap_from_icon(hIcon, GetSysColorBrush(COLOR_BTNFACE), WindowCanvas(pThis->_htoolbar));
+ if (delete_icon)
+ DestroyIcon(hIcon); // some icons can be freed, some not - so ignore any error return of DestroyIcon()
+ } else
+ hbmp = 0;
+
+ TBADDBITMAP ab = {0, (UINT_PTR)hbmp};
+ int bmp_idx = SendMessage(pThis->_htoolbar, TB_ADDBITMAP, 1, (LPARAM)&ab);
+
+ TaskBarEntry entry;
+
+ entry._id = pThis->_next_id++;
+ entry._hbmp = hbmp;
+ entry._bmp_idx = bmp_idx;
+ entry._title = title;
+
+ pThis->_map[hwnd] = entry;
+ found = pThis->_map.find(hwnd);
+ }
+
+ TBBUTTON btn = {-2/*I_IMAGENONE*/, 0, TBSTATE_ENABLED/*|TBSTATE_ELLIPSES*/, BTNS_BUTTON, {0, 0}, 0, 0};
+ TaskBarEntry& entry = found->second;
+
+ ++entry._used;
+ btn.idCommand = entry._id;
+
+ HWND foreground = GetForegroundWindow();
+ HWND foreground_owner = GetWindow(foreground, GW_OWNER);
+
+ if (hwnd==foreground || hwnd==foreground_owner) {
+ btn.fsState |= TBSTATE_PRESSED|TBSTATE_CHECKED;
+ pThis->_last_foreground_wnd = hwnd;
+ }
+
+ if (!last_id) {
+ // create new toolbar buttons for new windows
+ if (title[0])
+ btn.iString = (INT_PTR)title;
+
+ btn.iBitmap = entry._bmp_idx;
+ entry._btn_idx = SendMessage(pThis->_htoolbar, TB_BUTTONCOUNT, 0, 0);
+
+ SendMessage(pThis->_htoolbar, TB_INSERTBUTTON, entry._btn_idx, (LPARAM)&btn);
+
+ pThis->ResizeButtons();
+ } else {
+ // refresh attributes of existing buttons
+ if (btn.fsState != entry._fsState)
+ SendMessage(pThis->_htoolbar, TB_SETSTATE, entry._id, MAKELONG(btn.fsState,0));
+
+ if (entry._title != title) {
+ TBBUTTONINFO info;
+
+ info.cbSize = sizeof(TBBUTTONINFO);
+ info.dwMask = TBIF_TEXT;
+ info.pszText = title;
+
+ SendMessage(pThis->_htoolbar, TB_SETBUTTONINFO, entry._id, (LPARAM)&info);
+
+ entry._title = title;
+ }
+ }
+
+ entry._fsState = btn.fsState;
+
+#ifdef _ROS_ // now handled by activating the ARW_HIDE flag with SystemParametersInfo(SPI_SETMINIMIZEDMETRICS)
+ // move minimized windows out of sight
+ if (IsIconic(hwnd)) {
+ RECT rect;
+
+ GetWindowRect(hwnd, &rect);
+
+ if (rect.bottom > 0)
+ SetWindowPos(hwnd, 0, -32000, -32000, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
+ }
+#endif
+ }
+
+ return TRUE;
+}
+
+void TaskBar::Refresh()
+{
+ for(TaskBarMap::iterator it=_map.begin(); it!=_map.end(); ++it)
+ it->second._used = 0;
+
+ EnumWindows(EnumWndProc, (LPARAM)this);
+ //EnumDesktopWindows(GetThreadDesktop(GetCurrentThreadId()), EnumWndProc, (LPARAM)_htoolbar);
+
+ set<int> btn_idx_to_delete;
+ set<HBITMAP> hbmp_to_delete;
+
+ for(TaskBarMap::iterator it=_map.begin(); it!=_map.end(); ++it) {
+ TaskBarEntry& entry = it->second;
+
+ if (!entry._used && entry._id) {
+ // store button indexes to remove
+ btn_idx_to_delete.insert(entry._btn_idx);
+ hbmp_to_delete.insert(entry._hbmp);
+ entry._id = 0;
+ }
+ }
+
+ if (!btn_idx_to_delete.empty()) {
+ // remove buttons from right to left
+ for(set<int>::reverse_iterator it=btn_idx_to_delete.rbegin(); it!=btn_idx_to_delete.rend(); ++it) {
+ int idx = *it;
+
+ SendMessage(_htoolbar, TB_DELETEBUTTON, idx, 0);
+
+ for(TaskBarMap::iterator it=_map.begin(); it!=_map.end(); ++it) {
+ TaskBarEntry& entry = it->second;
+
+ // adjust button indexes
+ if (entry._btn_idx > idx) {
+ --entry._btn_idx;
+ --entry._bmp_idx;
+
+ TBBUTTONINFO info;
+
+ info.cbSize = sizeof(TBBUTTONINFO);
+ info.dwMask = TBIF_IMAGE;
+ info.iImage = entry._bmp_idx;
+
+ SendMessage(_htoolbar, TB_SETBUTTONINFO, entry._id, (LPARAM)&info);
+ }
+ }
+ }
+
+ for(set<HBITMAP>::iterator it=hbmp_to_delete.begin(); it!=hbmp_to_delete.end(); ++it) {
+ HBITMAP hbmp = *it;
+
+ TBREPLACEBITMAP tbrepl = {0, (UINT_PTR)hbmp, 0, 0};
+ SendMessage(_htoolbar, TB_REPLACEBITMAP, 0, (LPARAM)&tbrepl);
+
+ DeleteObject(hbmp);
+
+ for(TaskBarMap::iterator it=_map.begin(); it!=_map.end(); ++it)
+ if (it->second._hbmp == hbmp) {
+ _map.erase(it);
+ break;
+ }
+ }
+
+ ResizeButtons();
+ }
+}
+
+TaskBarMap::iterator TaskBarMap::find_id(int id)
+{
+ for(iterator it=begin(); it!=end(); ++it)
+ if (it->second._id == id)
+ return it;
+
+ return end();
+}
+
+void TaskBar::ResizeButtons()
+{
+ int btns = _map.size();
+
+ if (btns > 0) {
+ int bar_width = ClientRect(_hwnd).right;
+ int btn_width = (bar_width / btns) - 3;
+
+ if (btn_width < TASKBUTTONWIDTH_MIN)
+ btn_width = TASKBUTTONWIDTH_MIN;
+ else if (btn_width > TASKBUTTONWIDTH_MAX)
+ btn_width = TASKBUTTONWIDTH_MAX;
+
+ if (btn_width != _last_btn_width) {
+ _last_btn_width = btn_width;
+
+ SendMessage(_htoolbar, TB_SETBUTTONWIDTH, 0, MAKELONG(btn_width,btn_width));
+ SendMessage(_htoolbar, TB_AUTOSIZE, 0, 0);
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer and Desktop clone
+ //
+ // taskbar.h
+ //
+ // Martin Fuchs, 16.08.2003
+ //
+
+
+//#include "shellhook.h"
+
+
+#define CLASSNAME_TASKBAR TEXT("MSTaskSwWClass")
+#define TITLE_TASKBAR TEXT("Running Applications")
+
+#define IDC_FIRST_APP 0x2000
+
+//#define TASKBAR_AT_TOP
+
+#define TASKBUTTONWIDTH_MIN 38
+#define TASKBUTTONWIDTH_MAX 160
+
+
+#define IDW_TASKTOOLBAR 100
+
+
+#define PM_GET_LAST_ACTIVE (WM_APP+0x1D)
+
+
+ /// internal task bar button management entry
+struct TaskBarEntry
+{
+ TaskBarEntry();
+
+ int _id; // ID for WM_COMMAND
+ HBITMAP _hbmp;
+ int _bmp_idx;
+ int _used;
+ int _btn_idx;
+ String _title;
+ BYTE _fsState;
+};
+
+ /// map for managing the task bar buttons, mapped by application window handle
+struct TaskBarMap : public map<HWND, TaskBarEntry>
+{
+ ~TaskBarMap();
+
+ iterator find_id(int id);
+};
+
+
+ /// Taskbar window
+struct TaskBar : public Window
+{
+ typedef Window super;
+
+ TaskBar(HWND hwnd);
+ ~TaskBar();
+
+ static HWND Create(HWND hwndParent);
+
+protected:
+ WindowHandle _htoolbar;
+ TaskBarMap _map;
+ int _next_id;
+ WindowHandle _last_foreground_wnd;
+ int _last_btn_width;
+ MINIMIZEDMETRICS _mmMetrics_org;
+
+ const UINT WM_SHELLHOOK;
+
+ LRESULT Init(LPCREATESTRUCT pcs);
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Command(int id, int code);
+ int Notify(int id, NMHDR* pnmh);
+
+ void ActivateApp(TaskBarMap::iterator it, bool can_minimize=true, bool can_restore=true);
+ void ShowAppSystemMenu(TaskBarMap::iterator it);
+
+ static BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lparam);
+
+ void Refresh();
+ void ResizeButtons();
+};
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // traynotify.cpp
+ //
+ // Martin Fuchs, 22.08.2003
+ //
+
+
+#include <precomp.h>
+
+#include "../resource.h"
+
+#include "traynotify.h"
+
+
+#include "../notifyhook/notifyhook.h"
+
+NotifyHook::NotifyHook()
+ : WM_GETMODULEPATH(InstallNotifyHook())
+{
+}
+
+NotifyHook::~NotifyHook()
+{
+ DeinstallNotifyHook();
+}
+
+void NotifyHook::GetModulePath(HWND hwnd, HWND hwndCallback)
+{
+ PostMessage(hwnd, WM_GETMODULEPATH, (WPARAM)hwndCallback, 0);
+}
+
+bool NotifyHook::ModulePathCopyData(LPARAM lparam, HWND* phwnd, String& path)
+{
+ char buffer[MAX_PATH];
+
+ int l = GetWindowModulePathCopyData(lparam, phwnd, buffer, COUNTOF(buffer));
+
+ if (l) {
+ path.assign(buffer, l);
+ return true;
+ } else
+ return false;
+}
+
+
+NotifyIconIndex::NotifyIconIndex(NOTIFYICONDATA* pnid)
+{
+ _hWnd = pnid->hWnd;
+ _uID = pnid->uID;
+
+ // special handling for windows task manager
+ if ((int)_uID < 0)
+ _uID = 0;
+}
+
+NotifyIconIndex::NotifyIconIndex()
+{
+ _hWnd = 0;
+ _uID = 0;
+}
+
+
+NotifyInfo::NotifyInfo()
+{
+ _idx = -1;
+ _hIcon = 0;
+ _dwState = 0;
+ _uCallbackMessage = 0;
+ _version = 0;
+
+ _mode = NIM_AUTO;
+ _lastChange = GetTickCount();
+}
+
+
+ // WCHAR versions von NOTIFYICONDATA
+#define NID_SIZE_W6 sizeof(NOTIFYICONDATAW) // _WIN32_IE = 0x600
+#define NID_SIZE_W5 (sizeof(NOTIFYICONDATAW)-sizeof(GUID)) // _WIN32_IE = 0x500
+#define NID_SIZE_W3 (sizeof(NOTIFYICONDATAW)-sizeof(GUID)-(128-64)*sizeof(WCHAR)) // _WIN32_IE < 0x500
+
+ // CHAR versions von NOTIFYICONDATA
+#define NID_SIZE_A6 sizeof(NOTIFYICONDATAA)
+#define NID_SIZE_A5 (sizeof(NOTIFYICONDATAA)-sizeof(GUID))
+#define NID_SIZE_A3 (sizeof(NOTIFYICONDATAA)-sizeof(GUID)-(128-64)*sizeof(CHAR))
+
+bool NotifyInfo::modify(NOTIFYICONDATA* pnid)
+{
+ bool changes = false;
+
+ if (_hWnd!=pnid->hWnd || _uID!=pnid->uID) {
+ _hWnd = pnid->hWnd;
+ _uID = pnid->uID;
+
+ changes = true;
+ }
+
+ if (pnid->uFlags & NIF_MESSAGE) {
+ if (_uCallbackMessage != pnid->uCallbackMessage) {
+ _uCallbackMessage = pnid->uCallbackMessage;
+ changes = true;
+ }
+ }
+
+ if (pnid->uFlags & NIF_ICON) {
+ // Some applications destroy the icon immediatelly after completing the
+ // NIM_ADD/MODIFY message, so we have to make a copy of it.
+ if (_hIcon)
+ DestroyIcon(_hIcon);
+
+ _hIcon = (HICON) CopyImage(pnid->hIcon, IMAGE_ICON, NOTIFYICON_SIZE, NOTIFYICON_SIZE, 0);
+
+ changes = true; ///@todo compare icon
+ }
+
+#ifdef NIF_STATE // as of 21.08.2003 missing in MinGW headers
+ if (pnid->uFlags & NIF_STATE) {
+ DWORD new_state = (_dwState&~pnid->dwStateMask) | (pnid->dwState&pnid->dwStateMask);
+
+ if (_dwState != new_state) {
+ _dwState = new_state;
+ changes = true;
+ }
+ }
+#endif
+
+ // store tool tip text
+ if (pnid->uFlags & NIF_TIP) {
+ String new_text;
+
+ if (pnid->cbSize==NID_SIZE_W6 || pnid->cbSize==NID_SIZE_W5 || pnid->cbSize==NID_SIZE_W3) {
+ // UNICODE version of NOTIFYICONDATA structure
+ LPCWSTR txt = (LPCWSTR)pnid->szTip;
+ int max_len = pnid->cbSize==NID_SIZE_W3? 64: 128;
+
+ // get tooltip string length
+ int l = 0;
+ for(; l<max_len; ++l)
+ if (!txt[l])
+ break;
+
+ new_text.assign(txt, l);
+
+ if (new_text != _tipText) {
+ _tipText = new_text;
+ changes = true;
+ }
+ } else if (pnid->cbSize==NID_SIZE_A6 || pnid->cbSize==NID_SIZE_A5 || pnid->cbSize==NID_SIZE_A3) {
+ LPCSTR txt = (LPCSTR)pnid->szTip;
+ int max_len = pnid->cbSize==NID_SIZE_A3? 64: 128;
+
+ int l = 0;
+ for(int l=0; l<max_len; ++l)
+ if (!txt[l])
+ break;
+
+ new_text.assign(txt, l);
+
+ if (new_text != _tipText) {
+ _tipText = new_text;
+ changes = true;
+ }
+ }
+ }
+
+ TCHAR title[MAX_PATH];
+
+ DWORD pid;
+ GetWindowThreadProcessId(_hWnd, &pid);
+
+ // avoid to send WM_GETTEXT messages to the own process
+ if (pid != GetCurrentProcessId())
+ if (GetWindowText(_hWnd, title, COUNTOF(title))) {
+ if (_windowTitle != title) {
+ _windowTitle = title;
+ changes = true;
+ }
+ }
+
+ if (changes) {
+ create_name();
+ _lastChange = GetTickCount();
+ }
+
+ return changes;
+}
+
+
+NotifyArea::NotifyArea(HWND hwnd)
+ : super(hwnd),
+ _tooltip(hwnd)
+{
+ _next_idx = 0;
+ _clock_width = 0;
+ _last_icon_count = 0;
+ _show_hidden = false;
+ _hide_inactive = true;
+ _show_button = true;
+}
+
+NotifyArea::~NotifyArea()
+{
+ KillTimer(_hwnd, 0);
+
+ write_config();
+}
+
+static bool get_hide_clock_from_registry()
+{
+ HKEY hkeyStuckRects = 0;
+ DWORD buffer[10];
+ DWORD len = sizeof(buffer);
+
+ bool hide_clock = false;
+
+ // check if the clock should be hidden
+ if (!RegOpenKey(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StuckRects2"), &hkeyStuckRects) &&
+ !RegQueryValueEx(hkeyStuckRects, TEXT("Settings"), 0, NULL, (LPBYTE)buffer, &len) &&
+ len==sizeof(buffer) && buffer[0]==sizeof(buffer))
+ hide_clock = buffer[2] & 0x08? true: false;
+
+ if (hkeyStuckRects)
+ RegCloseKey(hkeyStuckRects);
+
+ return hide_clock;
+}
+
+void NotifyArea::read_config()
+{
+ bool clock_visible = true;
+
+ // read notification icon settings from XML configuration
+ XMLPos cfg_pos = g_Globals.get_cfg();
+
+#ifndef __MINGW32__ // SHRestricted() missing in MinGW (as of 29.10.2003)
+ if (!g_Globals._SHRestricted || !SHRestricted(REST_HIDECLOCK))
+#endif
+ {
+ if (cfg_pos.go_down("desktopbar")) {
+ clock_visible = XMLBoolRef(XMLPos(cfg_pos,"options"), "show-clock", !get_hide_clock_from_registry());
+ cfg_pos.back();
+ }
+ }
+
+ if (cfg_pos.go_down("notify-icons")) {
+ XMLPos options(cfg_pos, "options");
+
+ _hide_inactive = XMLBool(options, "hide-inactive", true); ///@todo read default setting from registry
+ _show_hidden = XMLBool(options, "show-hidden", false); ///@todo read default setting from registry
+ _show_button = XMLBool(options, "show-button", true);
+
+ XMLChildrenFilter icons(cfg_pos, "icon");
+
+ for(XMLChildrenFilter::iterator it=icons.begin(); it!=icons.end(); ++it) {
+ const XMLNode& node = **it;
+
+ NotifyIconConfig cfg;
+
+ cfg._name = node.get("name").c_str();
+ cfg._tipText = node.get("text").c_str();
+ cfg._windowTitle = node.get("window").c_str();
+ cfg._modulePath = node.get("module").c_str();
+ const string& mode = node.get("show");
+
+ if (mode == "show")
+ cfg._mode = NIM_SHOW;
+ else if (mode == "hide")
+ cfg._mode = NIM_HIDE;
+ else //if (mode == "auto")
+ cfg._mode = NIM_HIDE;
+
+ _cfg.push_back(cfg);
+ }
+
+ cfg_pos.back();
+ }
+
+ show_clock(clock_visible);
+}
+
+void NotifyArea::write_config()
+{
+ // write notification icon settings to XML configuration file
+ XMLPos cfg_pos = g_Globals.get_cfg();
+
+ cfg_pos.smart_create("desktopbar");
+ XMLBoolRef boolRef(XMLPos(cfg_pos,"options"), "show-clock");
+ boolRef = _hwndClock!=0;
+ cfg_pos.back();
+
+ cfg_pos.smart_create("notify-icons");
+
+ XMLPos options(cfg_pos, "options");
+ XMLBoolRef(options, "hide-inactive") = _hide_inactive;
+ XMLBoolRef(options, "show-hidden") = _show_hidden;
+ XMLBoolRef(options, "show-button") = _show_button;
+
+ for(NotifyIconCfgList::iterator it=_cfg.begin(); it!=_cfg.end(); ++it) {
+ NotifyIconConfig& cfg = *it;
+
+ // search for the corresponding node using the original name
+ cfg_pos.smart_create("icon", "name", cfg._name);
+
+ // refresh unique name
+ cfg.create_name();
+
+ cfg_pos["name"] = cfg._name.c_str();
+ cfg_pos["text"] = cfg._tipText.c_str();
+ cfg_pos["window"] = cfg._windowTitle.c_str();
+ cfg_pos["module"] = cfg._modulePath.c_str();
+ cfg_pos["show"] = string_from_mode(cfg._mode).c_str();
+
+ cfg_pos.back();
+ }
+
+ cfg_pos.back(); // smart_create
+}
+
+void NotifyArea::show_clock(bool flag)
+{
+ bool vis = _hwndClock!=0;
+
+ if (vis != flag) {
+ if (flag) {
+ // create clock window
+ _hwndClock = ClockWindow::Create(_hwnd);
+
+ if (_hwndClock) {
+ ClientRect clock_size(_hwndClock);
+ _clock_width = clock_size.right;
+ }
+ } else {
+ DestroyWindow(_hwndClock);
+ _hwndClock = 0;
+ _clock_width = 0;
+ }
+
+ SendMessage(GetParent(_hwnd), PM_RESIZE_CHILDREN, 0, 0);
+ }
+}
+
+LRESULT NotifyArea::Init(LPCREATESTRUCT pcs)
+{
+ if (super::Init(pcs))
+ return 1;
+
+ read_config();
+
+ SetTimer(_hwnd, 0, 1000, NULL);
+
+ return 0;
+}
+
+HWND NotifyArea::Create(HWND hwndParent)
+{
+ static BtnWindowClass wcTrayNotify(CLASSNAME_TRAYNOTIFY, CS_DBLCLKS);
+
+ ClientRect clnt(hwndParent);
+
+ return Window::Create(WINDOW_CREATOR(NotifyArea), WS_EX_STATICEDGE,
+ wcTrayNotify, TITLE_TRAYNOTIFY, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN,
+ clnt.right-(NOTIFYAREA_WIDTH_DEF+1), 1, NOTIFYAREA_WIDTH_DEF, clnt.bottom-2, hwndParent);
+}
+
+LRESULT NotifyArea::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_PAINT:
+ Paint();
+ break;
+
+ case WM_TIMER: {
+ Refresh();
+
+ ClockWindow* clock_window = GET_WINDOW(ClockWindow, _hwndClock);
+
+ if (clock_window)
+ clock_window->TimerTick();
+ break;}
+
+ case PM_REFRESH:
+ Refresh(true);
+ break;
+
+ case WM_SIZE: {
+ int cx = LOWORD(lparam);
+ SetWindowPos(_hwndClock, 0, cx-_clock_width, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
+ break;}
+
+ case PM_GET_WIDTH: {
+ int w = _sorted_icons.size()*NOTIFYICON_DIST + NOTIFYAREA_SPACE + _clock_width;
+ if (_show_button)
+ w += NOTIFYICON_DIST;
+ return w;}
+
+ case PM_REFRESH_CONFIG:
+ read_config();
+ break;
+
+ case WM_CONTEXTMENU: {
+ Point pt(lparam);
+ ScreenToClient(_hwnd, &pt);
+
+ if (IconHitTest(pt) == _sorted_icons.end()) { // display menu only when no icon clicked
+ PopupMenu menu(IDM_NOTIFYAREA);
+ SetMenuDefaultItem(menu, 0, MF_BYPOSITION);
+ CheckMenuItem(menu, ID_SHOW_HIDDEN_ICONS, MF_BYCOMMAND|(_show_hidden?MF_CHECKED:MF_UNCHECKED));
+ CheckMenuItem(menu, ID_SHOW_ICON_BUTTON, MF_BYCOMMAND|(_show_button?MF_CHECKED:MF_UNCHECKED));
+ menu.TrackPopupMenu(_hwnd, MAKEPOINTS(lparam));
+ }
+ break;}
+
+ case WM_COPYDATA: { // receive NotifyHook answers
+ String path;
+ HWND hwnd;
+
+ if (_hook.ModulePathCopyData(lparam, &hwnd, path))
+ _window_modules[hwnd] = path;
+ break;}
+
+ default:
+ if (nmsg>=WM_MOUSEFIRST && nmsg<=WM_MOUSELAST) {
+ // close startup menu and other popup menus
+ // This functionality is missing in MS Windows.
+ if (nmsg==WM_LBUTTONDOWN || nmsg==WM_MBUTTONDOWN || nmsg==WM_RBUTTONDOWN
+#ifdef WM_XBUTTONDOWN
+ || nmsg==WM_XBUTTONDOWN
+#endif
+ )
+
+ CancelModes();
+
+ Point pt(lparam);
+ NotifyIconSet::const_iterator found = IconHitTest(pt);
+
+ if (found != _sorted_icons.end()) {
+ const NotifyInfo& entry = const_cast<NotifyInfo&>(*found); // Why does GCC 3.3 need this additional const_cast ?!
+
+ // set activation time stamp
+ if (nmsg == WM_LBUTTONDOWN || // Some programs need PostMessage() instead of SendMessage().
+ nmsg == WM_MBUTTONDOWN || // So call SendMessage() only for BUTTONUP and BLCLK messages
+#ifdef WM_XBUTTONDOWN
+ nmsg == WM_XBUTTONDOWN ||
+#endif
+ nmsg == WM_RBUTTONDOWN) {
+ _icon_map[entry]._lastChange = GetTickCount();
+ }
+
+ // Notify the message if the owner is still alive
+ if (IsWindow(entry._hWnd)) {
+ if (nmsg == WM_MOUSEMOVE || // avoid to call blocking SendMessage() for merely moving the mouse over icons
+ nmsg == WM_LBUTTONDOWN || // Some programs need PostMessage() instead of SendMessage().
+ nmsg == WM_MBUTTONDOWN || // So call SendMessage() only for BUTTONUP and BLCLK messages
+#ifdef WM_XBUTTONDOWN
+ nmsg == WM_XBUTTONDOWN ||
+#endif
+ nmsg == WM_RBUTTONDOWN)
+ PostMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg);
+ else {
+ // allow SetForegroundWindow() in client process
+ DWORD pid;
+
+ if (GetWindowThreadProcessId(entry._hWnd, &pid)) {
+ // bind dynamically to AllowSetForegroundWindow() to be compatible to WIN98
+ static DynamicFct<BOOL(WINAPI*)(DWORD)> AllowSetForegroundWindow(TEXT("USER32"), "AllowSetForegroundWindow");
+
+ if (AllowSetForegroundWindow)
+ (*AllowSetForegroundWindow)(pid);
+ }
+
+ // use PostMessage() for notifcation icons of Shell Service Objects in the own process
+ if (pid == GetCurrentProcessId())
+ PostMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg);
+ else
+ SendMessage(entry._hWnd, entry._uCallbackMessage, entry._uID, nmsg);
+ }
+ }
+ else if (_icon_map.erase(entry)) // delete icons without valid owner window
+ UpdateIcons();
+ } else
+ // handle clicks on notification area button "show hidden icons"
+ if (_show_button)
+ if (nmsg == WM_LBUTTONDOWN)
+ if (pt.x>=NOTIFYICON_X && pt.x<NOTIFYICON_X+NOTIFYICON_SIZE &&
+ pt.y>=NOTIFYICON_Y && pt.y<NOTIFYICON_Y+NOTIFYICON_SIZE)
+ PostMessage(_hwnd, WM_COMMAND, MAKEWPARAM(ID_SHOW_HIDDEN_ICONS,0), 0);
+ }
+
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+int NotifyArea::Command(int id, int code)
+{
+ switch(id) {
+ case ID_SHOW_HIDDEN_ICONS:
+ _show_hidden = !_show_hidden;
+ UpdateIcons();
+ break;
+
+ case ID_SHOW_ICON_BUTTON:
+ _show_button = !_show_button;
+ UpdateIcons();
+ break;
+
+ case ID_CONFIG_NOTIFYAREA:
+ Dialog::DoModal(IDD_NOTIFYAREA, WINDOW_CREATOR(TrayNotifyDlg), GetParent(_hwnd));
+ break;
+
+ case ID_CONFIG_TIME:
+ launch_cpanel(_hwnd, TEXT("timedate.cpl"));
+ break;
+
+ default:
+ SendParent(WM_COMMAND, MAKELONG(id,code), 0);
+ }
+
+ return 0;
+}
+
+int NotifyArea::Notify(int id, NMHDR* pnmh)
+{
+ if (pnmh->code == TTN_GETDISPINFO) {
+ LPNMTTDISPINFO pdi = (LPNMTTDISPINFO)pnmh;
+
+ Point pt(GetMessagePos());
+ ScreenToClient(_hwnd, &pt);
+
+ if (_show_button &&
+ pt.x>=NOTIFYICON_X && pt.x<NOTIFYICON_X+NOTIFYICON_SIZE &&
+ pt.y>=NOTIFYICON_Y && pt.y<NOTIFYICON_Y+NOTIFYICON_SIZE)
+ {
+ static ResString sShowIcons(IDS_SHOW_HIDDEN_ICONS);
+ static ResString sHideIcons(IDS_HIDE_ICONS);
+
+ pdi->lpszText = (_show_hidden? sHideIcons: sShowIcons).str();
+ } else {
+ NotifyIconSet::iterator found = IconHitTest(pt);
+
+ if (found != _sorted_icons.end()) {
+ NotifyInfo& entry = const_cast<NotifyInfo&>(*found); // Why does GCC 3.3 need this additional const_cast ?!
+
+ // enable multiline tooltips (break at CR/LF and for very long one-line strings)
+ SendMessage(pnmh->hwndFrom, TTM_SETMAXTIPWIDTH, 0, 400);
+
+ pdi->lpszText = entry._tipText.str();
+ }
+ }
+ }
+
+ return 0;
+}
+
+void NotifyArea::CancelModes()
+{
+ PostMessage(HWND_BROADCAST, WM_CANCELMODE, 0, 0);
+
+ for(NotifyIconSet::const_iterator it=_sorted_icons.begin(); it!=_sorted_icons.end(); ++it)
+ PostMessage(it->_hWnd, WM_CANCELMODE, 0, 0);
+}
+
+LRESULT NotifyArea::ProcessTrayNotification(int notify_code, NOTIFYICONDATA* pnid)
+{
+ switch(notify_code) {
+ case NIM_ADD:
+ case NIM_MODIFY:
+ if ((int)pnid->uID >= 0) { ///@todo This is a fix for Windows Task Manager.
+ NotifyInfo& entry = _icon_map[pnid];
+
+ // a new entry?
+ if (entry._idx == -1)
+ entry._idx = ++_next_idx;
+ /* equivalent code using iterator::find();
+ NotifyIconMap::iterator found = _icon_map.find(pnid);
+ NotifyInfo* pentry;
+ // a new entry?
+ if (found == _icon_map.end()) {
+ pentry = &_icon_map[pnid];
+ pentry->_idx = ++_next_idx;
+ } else {
+ pentry = &found->second;
+ }
+ NotifyInfo& entry = *pentry;
+ */
+ bool changes = entry.modify(pnid);
+
+#if NOTIFYICON_VERSION>=3 // as of 21.08.2003 missing in MinGW headers
+ if (DetermineHideState(entry) && entry._mode==NIM_HIDE) {
+ entry._dwState |= NIS_HIDDEN;
+ changes = true;
+ }
+#endif
+
+ if (changes)
+ UpdateIcons(); ///@todo call only if really changes occurred
+
+ return TRUE;
+ }
+ break;
+
+ case NIM_DELETE: {
+ NotifyIconMap::iterator found = _icon_map.find(pnid);
+
+ if (found != _icon_map.end()) {
+ if (found->second._hIcon)
+ DestroyIcon(found->second._hIcon);
+ _icon_map.erase(found);
+ UpdateIcons();
+ return TRUE;
+ }
+ break;}
+
+#if NOTIFYICON_VERSION>=3 // as of 21.08.2003 missing in MinGW headers
+ case NIM_SETFOCUS:
+ SetForegroundWindow(_hwnd);
+ return TRUE;
+
+ case NIM_SETVERSION:
+ NotifyIconMap::iterator found = _icon_map.find(pnid);
+
+ if (found != _icon_map.end()) {
+ found->second._version = pnid->UNION_MEMBER(uVersion);
+ return TRUE;
+ } else
+ return FALSE;
+#endif
+ }
+
+ return FALSE;
+}
+
+void NotifyArea::UpdateIcons()
+{
+ _sorted_icons.clear();
+
+ // sort icon infos by display index
+ for(NotifyIconMap::const_iterator it=_icon_map.begin(); it!=_icon_map.end(); ++it) {
+ const NotifyInfo& entry = it->second;
+
+#ifdef NIF_STATE // as of 21.08.2003 missing in MinGW headers
+ if (_show_hidden || !(entry._dwState & NIS_HIDDEN))
+#endif
+ _sorted_icons.insert(entry);
+ }
+
+ // sync tooltip areas to current icon number
+ if (_sorted_icons.size() != _last_icon_count) {
+ RECT rect = {NOTIFYICON_X, NOTIFYICON_Y, NOTIFYICON_X+NOTIFYICON_SIZE, NOTIFYICON_Y+NOTIFYICON_SIZE};
+
+ size_t tt_idx = 0;
+
+ if (_show_button) {
+ _tooltip.add(_hwnd, tt_idx++, rect);
+
+ rect.left += NOTIFYICON_DIST;
+ rect.right += NOTIFYICON_DIST;
+ }
+
+ size_t icon_cnt = _sorted_icons.size();
+ while(tt_idx < icon_cnt) {
+ _tooltip.add(_hwnd, tt_idx++, rect);
+
+ rect.left += NOTIFYICON_DIST;
+ rect.right += NOTIFYICON_DIST;
+ }
+
+ while(tt_idx < _last_icon_count)
+ _tooltip.remove(_hwnd, tt_idx++);
+
+ _last_icon_count = _sorted_icons.size();
+ }
+
+ SendMessage(GetParent(_hwnd), PM_RESIZE_CHILDREN, 0, 0);
+
+ InvalidateRect(_hwnd, NULL, FALSE); // refresh icon display
+ UpdateWindow(_hwnd);
+}
+
+#ifndef _NO_ALPHABLEND
+#ifdef _MSC_VER
+#pragma comment(lib, "msimg32") // for AlphaBlend()
+#endif
+#endif
+
+void NotifyArea::Paint()
+{
+ BufferedPaintCanvas canvas(_hwnd);
+
+ // first fill with the background color
+ FillRect(canvas, &canvas.rcPaint, GetSysColorBrush(COLOR_BTNFACE));
+
+ // draw icons
+ int x = NOTIFYICON_X;
+ int y = NOTIFYICON_Y;
+
+ if (_show_button) {
+ static SmallIcon leftArrowIcon(IDI_NOTIFY_L);
+ static SmallIcon rightArrowIcon(IDI_NOTIFY_R);
+
+ DrawIconEx(canvas, x, y, _show_hidden?rightArrowIcon:leftArrowIcon, NOTIFYICON_SIZE, NOTIFYICON_SIZE, 0, 0, DI_NORMAL);
+ x += NOTIFYICON_DIST;
+ }
+
+#ifndef _NO_ALPHABLEND
+ MemCanvas mem_dc;
+ SelectedBitmap bmp(mem_dc, CreateCompatibleBitmap(canvas, NOTIFYICON_SIZE, NOTIFYICON_SIZE));
+ RECT rect = {0, 0, NOTIFYICON_SIZE, NOTIFYICON_SIZE};
+ BLENDFUNCTION blend = {AC_SRC_OVER, 0, 128, 0}; // 50 % visible
+#endif
+
+ for(NotifyIconSet::const_iterator it=_sorted_icons.begin(); it!=_sorted_icons.end(); ++it) {
+#ifndef _NO_ALPHABLEND
+ if (it->_dwState & NIS_HIDDEN) {
+ FillRect(mem_dc, &rect, GetSysColorBrush(COLOR_BTNFACE));
+ DrawIconEx(mem_dc, 0, 0, it->_hIcon, NOTIFYICON_SIZE, NOTIFYICON_SIZE, 0, 0, DI_NORMAL);
+ AlphaBlend(canvas, x, y, NOTIFYICON_SIZE, NOTIFYICON_SIZE, mem_dc, 0, 0, NOTIFYICON_SIZE, NOTIFYICON_SIZE, blend);
+ } else
+#endif
+ DrawIconEx(canvas, x, y, it->_hIcon, NOTIFYICON_SIZE, NOTIFYICON_SIZE, 0, 0, DI_NORMAL);
+
+ x += NOTIFYICON_DIST;
+ }
+}
+
+void NotifyArea::Refresh(bool update)
+{
+ // Look for task icons without valid owner window.
+ // This is an extended feature missing in MS Windows.
+ for(NotifyIconSet::const_iterator it=_sorted_icons.begin(); it!=_sorted_icons.end(); ++it) {
+ const NotifyInfo& entry = *it;
+
+ if (!IsWindow(entry._hWnd))
+ if (_icon_map.erase(entry)) // delete icons without valid owner window
+ ++update;
+ }
+
+ DWORD now = GetTickCount();
+
+ // handle icon hiding
+ for(NotifyIconMap::iterator it=_icon_map.begin(); it!=_icon_map.end(); ++it) {
+ NotifyInfo& entry = it->second;
+
+ DetermineHideState(entry);
+
+ switch(entry._mode) {
+ case NIM_HIDE:
+ if (!(entry._dwState & NIS_HIDDEN)) {
+ entry._dwState |= NIS_HIDDEN;
+ ++update;
+ }
+ break;
+
+ case NIM_SHOW:
+ if (entry._dwState&NIS_HIDDEN) {
+ entry._dwState &= ~NIS_HIDDEN;
+ ++update;
+ }
+ break;
+
+ case NIM_AUTO:
+ // automatically hide icons after long periods of inactivity
+ if (_hide_inactive)
+ if (!(entry._dwState & NIS_HIDDEN))
+ if (now-entry._lastChange > ICON_AUTOHIDE_SECONDS*1000) {
+ entry._dwState |= NIS_HIDDEN;
+ ++update;
+ }
+ break;
+ }
+ }
+
+ if (update)
+ UpdateIcons();
+}
+
+ /// search for a icon at a given client coordinate position
+NotifyIconSet::iterator NotifyArea::IconHitTest(const POINT& pos)
+{
+ if (pos.y<NOTIFYICON_Y || pos.y>=NOTIFYICON_Y+NOTIFYICON_SIZE)
+ return _sorted_icons.end();
+
+ NotifyIconSet::iterator it = _sorted_icons.begin();
+
+ int x = NOTIFYICON_X;
+
+ if (_show_button)
+ x += NOTIFYICON_DIST;
+
+ for(; it!=_sorted_icons.end(); ++it) {
+ //NotifyInfo& entry = const_cast<NotifyInfo&>(*it); // Why does GCC 3.3 need this additional const_cast ?!
+
+ if (pos.x>=x && pos.x<x+NOTIFYICON_SIZE)
+ break;
+
+ x += NOTIFYICON_DIST;
+ }
+
+ return it;
+}
+
+
+void NotifyIconConfig::create_name()
+{
+ _name = FmtString(TEXT("'%s' - '%s' - '%s'"), _tipText.c_str(), _windowTitle.c_str(), _modulePath.c_str());
+}
+
+
+#if NOTIFYICON_VERSION>=3 // as of 21.08.2003 missing in MinGW headers
+
+bool NotifyIconConfig::match(const NotifyIconConfig& props) const
+{
+ if (!_tipText.empty() && !props._tipText.empty())
+ if (props._tipText == _tipText)
+ return true;
+
+ if (!_windowTitle.empty() && !props._windowTitle.empty())
+ if (_tcsstr(props._windowTitle, _windowTitle))
+ return true;
+
+ if (!_modulePath.empty() && !props._modulePath.empty())
+ if (!_tcsicmp(props._modulePath, _modulePath))
+ return true;
+
+ return false;
+}
+
+bool NotifyArea::DetermineHideState(NotifyInfo& entry)
+{
+ if (entry._modulePath.empty()) {
+ const String& modulePath = _window_modules[entry._hWnd];
+
+ // request module path for new windows (We will get an asynchronous answer by a WM_COPYDATA message.)
+ if (!modulePath.empty())
+ entry._modulePath = modulePath;
+ else
+ _hook.GetModulePath(entry._hWnd, _hwnd);
+ }
+
+ for(NotifyIconCfgList::const_iterator it=_cfg.begin(); it!=_cfg.end(); ++it) {
+ const NotifyIconConfig& cfg = *it;
+
+ if (cfg.match(entry)) {
+ entry._mode = cfg._mode;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+#endif
+
+
+String string_from_mode(NOTIFYICONMODE mode)
+{
+ switch(mode) {
+ case NIM_SHOW:
+ return ResString(IDS_NOTIFY_SHOW);
+
+ case NIM_HIDE:
+ return ResString(IDS_NOTIFY_HIDE);
+
+ default: //case NIM_AUTO
+ return ResString(IDS_NOTIFY_AUTOHIDE);
+ }
+}
+
+
+TrayNotifyDlg::TrayNotifyDlg(HWND hwnd)
+ : super(hwnd),
+ _tree_ctrl(GetDlgItem(hwnd, IDC_NOTIFY_ICONS)),
+ _himl(ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR24, 3, 0)),
+ _pNotifyArea(static_cast<NotifyArea*>(Window::get_window((HWND)SendMessage(g_Globals._hwndDesktopBar, PM_GET_NOTIFYAREA, 0, 0))))
+{
+ _selectedItem = 0;
+
+ if (_pNotifyArea) {
+ // save original icon states and configuration data
+ for(NotifyIconMap::const_iterator it=_pNotifyArea->_icon_map.begin(); it!=_pNotifyArea->_icon_map.end(); ++it)
+ _icon_states_org[it->first] = IconStatePair(it->second._mode, it->second._dwState);
+
+ _cfg_org = _pNotifyArea->_cfg;
+ _show_hidden_org = _pNotifyArea->_show_hidden;
+ }
+
+ SetWindowIcon(hwnd, IDI_REACTOS);
+
+ _haccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_TRAYNOTIFY));
+
+ {
+ WindowCanvas canvas(_hwnd);
+ HBRUSH hbkgnd = GetStockBrush(WHITE_BRUSH);
+
+ ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT), hbkgnd, canvas);
+ ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT_TRANS), hbkgnd, canvas);
+ ImageList_AddAlphaIcon(_himl, SmallIcon(IDI_DOT_RED), hbkgnd, canvas);
+ }
+
+ (void)TreeView_SetImageList(_tree_ctrl, _himl, TVSIL_NORMAL);
+
+ _resize_mgr.Add(IDC_NOTIFY_ICONS, RESIZE);
+ _resize_mgr.Add(IDC_LABEL1, MOVE_Y);
+ _resize_mgr.Add(IDC_NOTIFY_TOOLTIP, RESIZE_X|MOVE_Y);
+ _resize_mgr.Add(IDC_LABEL2, MOVE_Y);
+ _resize_mgr.Add(IDC_NOTIFY_TITLE, RESIZE_X|MOVE_Y);
+ _resize_mgr.Add(IDC_LABEL3, MOVE_Y);
+ _resize_mgr.Add(IDC_NOTIFY_MODULE, RESIZE_X|MOVE_Y);
+
+ _resize_mgr.Add(IDC_LABEL4, MOVE_Y);
+ _resize_mgr.Add(IDC_NOTIFY_SHOW, MOVE_Y);
+ _resize_mgr.Add(IDC_NOTIFY_HIDE, MOVE_Y);
+ _resize_mgr.Add(IDC_NOTIFY_AUTOHIDE,MOVE_Y);
+
+ _resize_mgr.Add(IDC_PICTURE, MOVE);
+ _resize_mgr.Add(ID_SHOW_HIDDEN_ICONS,MOVE_Y);
+
+ _resize_mgr.Add(IDC_LABEL6, MOVE_Y);
+ _resize_mgr.Add(IDC_LAST_CHANGE, MOVE_Y);
+
+ _resize_mgr.Add(IDOK, MOVE);
+ _resize_mgr.Add(IDCANCEL, MOVE);
+
+ _resize_mgr.Resize(+150, +200);
+
+ Refresh();
+
+ SetTimer(_hwnd, 0, 3000, NULL);
+ register_pretranslate(hwnd);
+}
+
+TrayNotifyDlg::~TrayNotifyDlg()
+{
+ KillTimer(_hwnd, 0);
+ unregister_pretranslate(_hwnd);
+ ImageList_Destroy(_himl);
+}
+
+void TrayNotifyDlg::Refresh()
+{
+ ///@todo refresh incrementally
+
+ HiddenWindow hide(_tree_ctrl);
+
+ TreeView_DeleteAllItems(_tree_ctrl);
+
+ TV_INSERTSTRUCT tvi;
+
+ tvi.hParent = 0;
+ tvi.hInsertAfter = TVI_LAST;
+
+ TV_ITEM& tv = tvi.item;
+ tv.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+
+ ResString str_cur(IDS_ITEMS_CUR);
+ tv.pszText = str_cur.str();
+ tv.iSelectedImage = tv.iImage = 0; // IDI_DOT
+ _hitemCurrent = TreeView_InsertItem(_tree_ctrl, &tvi);
+
+ ResString str_conf(IDS_ITEMS_CONFIGURED);
+ tv.pszText = str_conf.str();
+ tv.iSelectedImage = tv.iImage = 2; // IDI_DOT_RED
+ _hitemConfig = TreeView_InsertItem(_tree_ctrl, &tvi);
+
+ tvi.hParent = _hitemCurrent;
+
+ ResString str_visible(IDS_ITEMS_VISIBLE);
+ tv.pszText = str_visible.str();
+ tv.iSelectedImage = tv.iImage = 0; // IDI_DOT
+ _hitemCurrent_visible = TreeView_InsertItem(_tree_ctrl, &tvi);
+
+ ResString str_hidden(IDS_ITEMS_HIDDEN);
+ tv.pszText = str_hidden.str();
+ tv.iSelectedImage = tv.iImage = 1; // IDI_DOT_TRANS
+ _hitemCurrent_hidden = TreeView_InsertItem(_tree_ctrl, &tvi);
+
+ if (_pNotifyArea) {
+ _info.clear();
+
+ tv.mask |= TVIF_PARAM;
+
+ WindowCanvas canvas(_hwnd);
+
+ // insert current (visible and hidden) items
+ for(NotifyIconMap::const_iterator it=_pNotifyArea->_icon_map.begin(); it!=_pNotifyArea->_icon_map.end(); ++it) {
+ const NotifyInfo& entry = it->second;
+
+ InsertItem(entry._dwState&NIS_HIDDEN? _hitemCurrent_hidden: _hitemCurrent_visible, TVI_LAST, entry, canvas);
+ }
+
+ // insert configured items in tree view
+ const NotifyIconCfgList& cfg = _pNotifyArea->_cfg;
+ for(NotifyIconCfgList::const_iterator it=cfg.begin(); it!=cfg.end(); ++it) {
+ const NotifyIconConfig& cfg_entry = *it;
+
+ HICON hicon = 0;
+
+ if (!cfg_entry._modulePath.empty()) {
+ if ((int)ExtractIconEx(cfg_entry._modulePath, 0, NULL, &hicon, 1) <= 0)
+ hicon = 0;
+
+ if (!hicon) {
+ SHFILEINFO sfi;
+
+ if (SHGetFileInfo(cfg_entry._modulePath, 0, &sfi, sizeof(sfi), SHGFI_ICON|SHGFI_SMALLICON))
+ hicon = sfi.hIcon;
+ }
+ }
+
+ InsertItem(_hitemConfig, TVI_SORT, cfg_entry, canvas, hicon, cfg_entry._mode);
+
+ if (hicon)
+ DestroyIcon(hicon);
+ }
+
+ CheckDlgButton(_hwnd, ID_SHOW_HIDDEN_ICONS, _pNotifyArea->_show_hidden? BST_CHECKED: BST_UNCHECKED);
+ }
+
+ TreeView_Expand(_tree_ctrl, _hitemCurrent_visible, TVE_EXPAND);
+ TreeView_Expand(_tree_ctrl, _hitemCurrent_hidden, TVE_EXPAND);
+ TreeView_Expand(_tree_ctrl, _hitemCurrent, TVE_EXPAND);
+ TreeView_Expand(_tree_ctrl, _hitemConfig, TVE_EXPAND);
+
+ TreeView_EnsureVisible(_tree_ctrl, _hitemCurrent_visible);
+}
+
+void TrayNotifyDlg::InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyInfo& entry, HDC hdc)
+{
+ InsertItem(hparent, after, entry, hdc, entry._hIcon, entry._mode);
+}
+
+void TrayNotifyDlg::InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyIconDlgInfo& entry,
+ HDC hdc, HICON hicon, NOTIFYICONMODE mode)
+{
+ int idx = _info.size() + 1;
+ _info[idx] = entry;
+
+ String mode_str = string_from_mode(mode);
+
+ switch(mode) {
+ case NIM_SHOW: mode_str = ResString(IDS_NOTIFY_SHOW); break;
+ case NIM_HIDE: mode_str = ResString(IDS_NOTIFY_HIDE); break;
+ case NIM_AUTO: mode_str = ResString(IDS_NOTIFY_AUTOHIDE);
+ }
+
+ FmtString txt(TEXT("%s - %s [%s]"), entry._tipText.c_str(), entry._windowTitle.c_str(), mode_str.c_str());
+
+ TV_INSERTSTRUCT tvi;
+
+ tvi.hParent = hparent;
+ tvi.hInsertAfter = after;
+
+ TV_ITEM& tv = tvi.item;
+ tv.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM;
+
+ tv.lParam = (LPARAM)idx;
+ tv.pszText = txt.str();
+ tv.iSelectedImage = tv.iImage = ImageList_AddAlphaIcon(_himl, hicon, GetStockBrush(WHITE_BRUSH), hdc);
+ (void)TreeView_InsertItem(_tree_ctrl, &tvi);
+}
+
+LRESULT TrayNotifyDlg::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case PM_TRANSLATE_MSG: {
+ MSG* pmsg = (MSG*) lparam;
+
+ if (TranslateAccelerator(_hwnd, _haccel, pmsg))
+ return TRUE;
+
+ return FALSE;}
+
+ case WM_TIMER:
+ Refresh();
+ break;
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+int TrayNotifyDlg::Command(int id, int code)
+{
+ if (code == BN_CLICKED) {
+ switch(id) {
+ case ID_REFRESH:
+ Refresh();
+ break;
+
+ case IDC_NOTIFY_SHOW:
+ SetIconMode(NIM_SHOW);
+ break;
+
+ case IDC_NOTIFY_HIDE:
+ SetIconMode(NIM_HIDE);
+ break;
+
+ case IDC_NOTIFY_AUTOHIDE:
+ SetIconMode(NIM_AUTO);
+ break;
+
+ case ID_SHOW_HIDDEN_ICONS:
+ if (_pNotifyArea)
+ SendMessage(*_pNotifyArea, WM_COMMAND, MAKEWPARAM(id,code), 0);
+ break;
+
+ case IDOK:
+ EndDialog(_hwnd, id);
+ break;
+
+ case IDCANCEL:
+ // rollback changes
+ if (_pNotifyArea) {
+ // restore original icon states and configuration data
+ _pNotifyArea->_cfg = _cfg_org;
+ _pNotifyArea->_show_hidden = _show_hidden_org;
+
+ for(IconStateMap::const_iterator it=_icon_states_org.begin(); it!=_icon_states_org.end(); ++it) {
+ NotifyInfo& info = _pNotifyArea->_icon_map[it->first];
+
+ info._mode = it->second.first;
+ info._dwState = it->second.second;
+ }
+
+ SendMessage(*_pNotifyArea, PM_REFRESH, 0, 0);
+ }
+
+ EndDialog(_hwnd, id);
+ break;
+ }
+
+ return 0;
+ }
+
+ return 1;
+}
+
+int TrayNotifyDlg::Notify(int id, NMHDR* pnmh)
+{
+ switch(pnmh->code) {
+ case TVN_SELCHANGED: {
+ NMTREEVIEW* pnmtv = (NMTREEVIEW*)pnmh;
+ int idx = pnmtv->itemNew.lParam;
+
+ if (idx) {
+ RefreshProperties(_info[idx]);
+ _selectedItem = pnmtv->itemNew.hItem;
+ } else {
+ /*
+ SetDlgItemText(_hwnd, IDC_NOTIFY_TOOLTIP, NULL);
+ SetDlgItemText(_hwnd, IDC_NOTIFY_TITLE, NULL);
+ SetDlgItemText(_hwnd, IDC_NOTIFY_MODULE, NULL);
+ */
+ CheckRadioButton(_hwnd, IDC_NOTIFY_SHOW, IDC_NOTIFY_AUTOHIDE, 0);
+ }
+ break;}
+ }
+
+ return 0;
+}
+
+void TrayNotifyDlg::RefreshProperties(const NotifyIconDlgInfo& entry)
+{
+ SetDlgItemText(_hwnd, IDC_NOTIFY_TOOLTIP, entry._tipText);
+ SetDlgItemText(_hwnd, IDC_NOTIFY_TITLE, entry._windowTitle);
+ SetDlgItemText(_hwnd, IDC_NOTIFY_MODULE, entry._modulePath);
+
+ CheckRadioButton(_hwnd, IDC_NOTIFY_SHOW, IDC_NOTIFY_AUTOHIDE, IDC_NOTIFY_SHOW+entry._mode);
+
+ String change_str;
+ if (entry._lastChange)
+ change_str.printf(TEXT("before %d s"), (GetTickCount()-entry._lastChange+500)/1000);
+ SetDlgItemText(_hwnd, IDC_LAST_CHANGE, change_str);
+
+ HICON hicon = 0; //get_window_icon_big(entry._hWnd, false);
+
+ // If we could not find an icon associated with the owner window, try to load one from the owning module.
+ if (!hicon && !entry._modulePath.empty()) {
+ hicon = ExtractIcon(g_Globals._hInstance, entry._modulePath, 0);
+
+ if (!hicon) {
+ SHFILEINFO sfi;
+
+ if (SHGetFileInfo(entry._modulePath, 0, &sfi, sizeof(sfi), SHGFI_ICON|SHGFI_LARGEICON))
+ hicon = sfi.hIcon;
+ }
+ }
+
+ if (hicon) {
+ SendMessage(GetDlgItem(_hwnd, IDC_PICTURE), STM_SETICON, (LPARAM)hicon, 0);
+ DestroyIcon(hicon);
+ } else
+ SendMessage(GetDlgItem(_hwnd, IDC_PICTURE), STM_SETICON, 0, 0);
+}
+
+void TrayNotifyDlg::SetIconMode(NOTIFYICONMODE mode)
+{
+ int idx = TreeView_GetItemData(_tree_ctrl, _selectedItem);
+
+ if (!idx)
+ return;
+
+ NotifyIconConfig& entry = _info[idx];
+
+ if (entry._mode != mode) {
+ entry._mode = mode;
+
+ // trigger refresh in notify area and this dialog
+ if (_pNotifyArea)
+ SendMessage(*_pNotifyArea, PM_REFRESH, 0, 0);
+ }
+
+ if (_pNotifyArea) {
+ bool found = false;
+
+ NotifyIconCfgList& cfg = _pNotifyArea->_cfg;
+ for(NotifyIconCfgList::iterator it=cfg.begin(); it!=cfg.end(); ++it) {
+ NotifyIconConfig& cfg_entry = *it;
+
+ if (cfg_entry.match(entry)) {
+ cfg_entry._mode = mode;
+ ++found;
+ break;
+ }
+ }
+
+ if (!found) {
+ // insert new configuration entry
+ NotifyIconConfig cfg_entry = entry;
+
+ cfg_entry._mode = mode;
+
+ _pNotifyArea->_cfg.push_back(cfg_entry);
+ }
+ }
+
+ Refresh();
+ ///@todo select treeview item at new position in tree view -> refresh HTREEITEM in _selectedItem
+}
+
+
+ClockWindow::ClockWindow(HWND hwnd)
+ : super(hwnd),
+ _tooltip(hwnd)
+{
+ *_time = TEXT('\0');
+ FormatTime();
+
+ _tooltip.add(_hwnd, _hwnd);
+}
+
+HWND ClockWindow::Create(HWND hwndParent)
+{
+ static BtnWindowClass wcClock(CLASSNAME_CLOCKWINDOW, CS_DBLCLKS);
+
+ ClientRect clnt(hwndParent);
+
+ WindowCanvas canvas(hwndParent);
+ FontSelection font(canvas, GetStockFont(DEFAULT_GUI_FONT));
+
+ RECT rect = {0, 0, 0, 0};
+ TCHAR buffer[8];
+
+ if (!GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, NULL, NULL, buffer, sizeof(buffer)/sizeof(TCHAR)))
+ _tcscpy(buffer, TEXT("00:00"));
+
+ DrawText(canvas, buffer, -1, &rect, DT_SINGLELINE|DT_NOPREFIX|DT_CALCRECT);
+ int clockwindowWidth = rect.right-rect.left + 4;
+
+ return Window::Create(WINDOW_CREATOR(ClockWindow), 0,
+ wcClock, NULL, WS_CHILD|WS_VISIBLE,
+ clnt.right-(clockwindowWidth), 1, clockwindowWidth, clnt.bottom-2, hwndParent);
+}
+
+LRESULT ClockWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_PAINT:
+ Paint();
+ break;
+
+ case WM_LBUTTONDBLCLK:
+ launch_cpanel(_hwnd, TEXT("timedate.cpl"));
+ break;
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+int ClockWindow::Notify(int id, NMHDR* pnmh)
+{
+ if (pnmh->code == TTN_GETDISPINFO) {
+ LPNMTTDISPINFO pdi = (LPNMTTDISPINFO)pnmh;
+
+ SYSTEMTIME systime;
+ TCHAR buffer[64];
+
+ GetLocalTime(&systime);
+
+ if (GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &systime, NULL, buffer, 64))
+ _tcscpy(pdi->szText, buffer);
+ else
+ pdi->szText[0] = '\0';
+ }
+
+ return 0;
+}
+
+void ClockWindow::TimerTick()
+{
+ if (FormatTime())
+ InvalidateRect(_hwnd, NULL, TRUE); // refresh displayed time
+}
+
+bool ClockWindow::FormatTime()
+{
+ TCHAR buffer[16];
+
+ if (GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, NULL, NULL, buffer, sizeof(buffer)/sizeof(TCHAR)))
+ if (_tcscmp(buffer, _time)) {
+ _tcscpy(_time, buffer);
+ return true; // The text to display has changed.
+ }
+
+ return false; // no change
+}
+
+void ClockWindow::Paint()
+{
+ PaintCanvas canvas(_hwnd);
+
+ FillRect(canvas, &canvas.rcPaint, GetSysColorBrush(COLOR_BTNFACE));
+
+ BkMode bkmode(canvas, TRANSPARENT);
+ FontSelection font(canvas, GetStockFont(ANSI_VAR_FONT));
+
+ DrawText(canvas, _time, -1, ClientRect(_hwnd), DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX);
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer and Desktop clone
+ //
+ // traynotify.h
+ //
+ // Martin Fuchs, 22.08.2003
+ //
+
+
+#define CLASSNAME_TRAYNOTIFY TEXT("TrayNotifyWnd")
+#define TITLE_TRAYNOTIFY TEXT("")
+
+#define CLASSNAME_CLOCKWINDOW TEXT("TrayClockWClass")
+
+#define NOTIFYAREA_WIDTH_DEF 100
+#define NOTIFYICON_DIST 20
+#define NOTIFYAREA_SPACE 10
+#define NOTIFYICON_SIZE 16
+#define NOTIFYICON_X 2
+#define NOTIFYICON_Y 3
+
+#define ICON_AUTOHIDE_SECONDS 300
+
+#define PM_GETMODULEPATH_CB (WM_APP+0x21)
+#define PM_GET_NOTIFYAREA (WM_APP+0x22)
+
+
+ /// NotifyIconIndex is used for maintaining the order of notification icons.
+struct NotifyIconIndex
+{
+ NotifyIconIndex(NOTIFYICONDATA* pnid);
+
+ // sort operator
+ friend bool operator<(const NotifyIconIndex& a, const NotifyIconIndex& b)
+ {return a._hWnd<b._hWnd || (a._hWnd==b._hWnd && a._uID<b._uID);}
+
+ HWND _hWnd;
+ UINT _uID;
+
+protected:
+ NotifyIconIndex();
+};
+
+
+enum NOTIFYICONMODE {
+ NIM_SHOW, NIM_HIDE, NIM_AUTO
+};
+
+extern String string_from_mode(NOTIFYICONMODE mode);
+
+ /// configuration for the display mode of a notification icon
+struct NotifyIconConfig
+{
+ NotifyIconConfig() : _mode(NIM_AUTO) {}
+
+ void create_name();
+ bool match(const NotifyIconConfig& props) const;
+
+ // properties used to identify a notification icon
+ String _tipText;
+ String _windowTitle; // To look at the window title and at the window module path of the notify icon owner window
+ String _modulePath; // to identify notification icons is an extension above XP's behaviour.
+ // (XP seems to store icon image data in the registry instead.)
+ NOTIFYICONMODE _mode;
+
+ String _name; /// unique name used to identify the entry in the configuration file
+};
+
+ /// list of NotifyIconConfig structures
+typedef list<NotifyIconConfig> NotifyIconCfgList;
+
+
+ /// structure for maintaining informations about one notification icon
+struct NotifyInfo : public NotifyIconIndex, public NotifyIconConfig
+{
+ NotifyInfo();
+
+ // sort operator
+ friend bool operator<(const NotifyInfo& a, const NotifyInfo& b)
+ {return a._idx < b._idx;}
+
+ bool modify(NOTIFYICONDATA* pnid);
+
+ int _idx; // display index
+ HICON _hIcon;
+ DWORD _dwState;
+ UINT _uCallbackMessage;
+ UINT _version;
+
+ DWORD _lastChange; // timer tick value of the last change
+};
+
+typedef map<NotifyIconIndex, NotifyInfo> NotifyIconMap;
+typedef set<NotifyInfo> NotifyIconSet;
+
+
+struct NotifyHook
+{
+ NotifyHook();
+ ~NotifyHook();
+
+ void GetModulePath(HWND hwnd, HWND hwndCallback);
+ bool ModulePathCopyData(LPARAM lparam, HWND* phwnd, String& path);
+
+protected:
+ const UINT WM_GETMODULEPATH;
+};
+
+
+ /// tray notification area aka "tray"
+struct NotifyArea : public Window
+{
+ typedef Window super;
+
+ NotifyArea(HWND hwnd);
+ ~NotifyArea();
+
+ static HWND Create(HWND hwndParent);
+
+ LRESULT ProcessTrayNotification(int notify_code, NOTIFYICONDATA* pnid);
+
+protected:
+ WindowHandle _hwndClock;
+ int _clock_width;
+
+ ToolTip _tooltip;
+ NotifyHook _hook;
+
+ bool _show_hidden;
+ bool _hide_inactive;
+ bool _show_button;
+
+ LRESULT Init(LPCREATESTRUCT pcs);
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Command(int id, int code);
+ int Notify(int id, NMHDR* pnmh);
+
+ void UpdateIcons();
+ void Paint();
+ void Refresh(bool do_refresh=false);
+ void CancelModes();
+
+ NotifyIconSet::iterator IconHitTest(const POINT& pos);
+ bool DetermineHideState(NotifyInfo& entry);
+
+ void read_config();
+ void write_config();
+
+ friend struct TrayNotifyDlg;
+
+ NotifyIconCfgList _cfg;
+
+ map<HWND, String> _window_modules;
+
+ NotifyIconMap _icon_map;
+ NotifyIconSet _sorted_icons;
+ int _next_idx;
+ size_t _last_icon_count;
+
+ void show_clock(bool flag);
+};
+
+
+struct NotifyIconDlgInfo : public NotifyIconConfig
+{
+ typedef NotifyIconConfig super;
+
+ NotifyIconDlgInfo(const NotifyInfo& info) : super(info), _lastChange(info._lastChange) {}
+ NotifyIconDlgInfo(const NotifyIconConfig& cfg) : super(cfg), _lastChange(0) {}
+ NotifyIconDlgInfo() : _lastChange(0) {}
+
+ DWORD _lastChange;
+};
+
+typedef map<int, NotifyIconDlgInfo> NotifyIconDlgInfoMap;
+
+
+ /// configuration dialog for notification icons
+struct TrayNotifyDlg : public ResizeController<Dialog>
+{
+ typedef ResizeController<Dialog> super;
+
+ TrayNotifyDlg(HWND hwnd);
+ ~TrayNotifyDlg();
+
+protected:
+ HWND _tree_ctrl;
+ HACCEL _haccel;
+ HIMAGELIST _himl;
+ NotifyArea* _pNotifyArea;
+ NotifyIconDlgInfoMap _info;
+
+ typedef pair<NOTIFYICONMODE, DWORD> IconStatePair;
+ typedef map<NotifyIconIndex, IconStatePair> IconStateMap;
+
+ NotifyIconCfgList _cfg_org;
+ IconStateMap _icon_states_org;
+ bool _show_hidden_org;
+
+ HTREEITEM _hitemCurrent;
+ HTREEITEM _hitemCurrent_visible;
+ HTREEITEM _hitemCurrent_hidden;
+ HTREEITEM _hitemConfig;
+ HTREEITEM _selectedItem;
+
+ virtual LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ virtual int Command(int id, int code);
+ virtual int Notify(int id, NMHDR* pnmh);
+
+ void Refresh();
+ void InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyInfo&, HDC);
+ void InsertItem(HTREEITEM hparent, HTREEITEM after, const NotifyIconDlgInfo&, HDC, HICON, NOTIFYICONMODE);
+ void SetIconMode(NOTIFYICONMODE mode);
+ void RefreshProperties(const NotifyIconDlgInfo& entry);
+};
+
+
+ /// window for displaying the time in the tray notification area
+struct ClockWindow : public Window
+{
+ typedef Window super;
+
+ ClockWindow(HWND hwnd);
+
+ static HWND Create(HWND hwndParent);
+
+ void TimerTick();
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Notify(int id, NMHDR* pnmh);
+
+ bool FormatTime();
+ void Paint();
+
+ TCHAR _time[16];
+ ToolTip _tooltip;
+};
--- /dev/null
+#include <precomp.h>
+
+/**************************************************************************
+ THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
+ ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+ PARTICULAR PURPOSE.
+ Author: Leon Finker 11/2000
+ Modifications: replaced ATL by STL, Martin Fuchs 7/2003
+**************************************************************************/
+
+// dragdropimp.cpp: implementation of the IDataObjectImpl class.
+//////////////////////////////////////////////////////////////////////
+
+//#include <shlobj.h>
+//#include <assert.h>
+
+//#include "dragdropimpl.h"
+
+//////////////////////////////////////////////////////////////////////
+// IDataObjectImpl Class
+//////////////////////////////////////////////////////////////////////
+
+IDataObjectImpl::IDataObjectImpl(IDropSourceImpl* pDropSource)
+ : super(IID_IDataObject),
+ m_pDropSource(pDropSource),
+ m_cRefCount(0)
+{
+}
+
+IDataObjectImpl::~IDataObjectImpl()
+{
+ for(StorageArray::iterator it=_storage.begin(); it!=_storage.end(); ++it)
+ ReleaseStgMedium(it->_medium);
+}
+
+STDMETHODIMP IDataObjectImpl::GetData(
+ /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn,
+ /* [out] */ STGMEDIUM __RPC_FAR *pmedium)
+{
+ if (pformatetcIn == NULL || pmedium == NULL)
+ return E_INVALIDARG;
+
+ pmedium->hGlobal = NULL;
+
+ for(StorageArray::iterator it=_storage.begin(); it!=_storage.end(); ++it)
+ {
+ if (pformatetcIn->tymed & it->_format->tymed &&
+ pformatetcIn->dwAspect == it->_format->dwAspect &&
+ pformatetcIn->cfFormat == it->_format->cfFormat)
+ {
+ CopyMedium(pmedium, it->_medium, it->_format);
+ return S_OK;
+ }
+ }
+
+ return DV_E_FORMATETC;
+}
+
+STDMETHODIMP IDataObjectImpl::GetDataHere(
+ /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
+ /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium)
+{
+ return E_NOTIMPL;
+}
+
+STDMETHODIMP IDataObjectImpl::QueryGetData(
+ /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc)
+{
+ if (pformatetc == NULL)
+ return E_INVALIDARG;
+
+ //support others if needed DVASPECT_THUMBNAIL //DVASPECT_ICON //DVASPECT_DOCPRINT
+ if (!(DVASPECT_CONTENT & pformatetc->dwAspect))
+ return (DV_E_DVASPECT);
+
+ HRESULT hr = DV_E_TYMED;
+
+ for(StorageArray::iterator it=_storage.begin(); it!=_storage.end(); ++it)
+ {
+ if (pformatetc->tymed & it->_format->tymed)
+ {
+ if (pformatetc->cfFormat == it->_format->cfFormat)
+ return S_OK;
+ else
+ hr = DV_E_CLIPFORMAT;
+ }
+ else
+ hr = DV_E_TYMED;
+ }
+
+ return hr;
+}
+
+STDMETHODIMP IDataObjectImpl::GetCanonicalFormatEtc(
+ /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn,
+ /* [out] */ FORMATETC __RPC_FAR *pformatetcOut)
+{
+ if (pformatetcOut == NULL)
+ return E_INVALIDARG;
+
+ return DATA_S_SAMEFORMATETC;
+}
+
+STDMETHODIMP IDataObjectImpl::SetData(
+ /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
+ /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium,
+ /* [in] */ BOOL fRelease)
+{
+ if (pformatetc == NULL || pmedium == NULL)
+ return E_INVALIDARG;
+
+ assert(pformatetc->tymed == pmedium->tymed);
+ FORMATETC* fetc=new FORMATETC;
+ STGMEDIUM* pStgMed = new STGMEDIUM;
+
+ if (fetc == NULL || pStgMed == NULL)
+ return E_OUTOFMEMORY;
+
+ ZeroMemory(fetc, sizeof(FORMATETC));
+ ZeroMemory(pStgMed, sizeof(STGMEDIUM));
+
+ *fetc = *pformatetc;
+
+ if (fRelease)
+ *pStgMed = *pmedium;
+ else
+ CopyMedium(pStgMed, pmedium, pformatetc);
+
+ DataStorage storage;
+
+ storage._format = fetc;
+ storage._medium = pStgMed;
+
+ _storage.push_back(storage);
+
+ return S_OK;
+}
+
+void IDataObjectImpl::CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc)
+{
+ switch(pMedSrc->tymed)
+ {
+ case TYMED_HGLOBAL:
+ pMedDest->hGlobal = (HGLOBAL)OleDuplicateData(pMedSrc->hGlobal, pFmtSrc->cfFormat, 0);
+ break;
+ case TYMED_GDI:
+ pMedDest->hBitmap = (HBITMAP)OleDuplicateData(pMedSrc->hBitmap, pFmtSrc->cfFormat, 0);
+ break;
+ case TYMED_MFPICT:
+ pMedDest->hMetaFilePict = (HMETAFILEPICT)OleDuplicateData(pMedSrc->hMetaFilePict, pFmtSrc->cfFormat, 0);
+ break;
+ case TYMED_ENHMF:
+ pMedDest->hEnhMetaFile = (HENHMETAFILE)OleDuplicateData(pMedSrc->hEnhMetaFile, pFmtSrc->cfFormat, 0);
+ break;
+ case TYMED_FILE:
+ pMedDest->lpszFileName = (LPOLESTR)OleDuplicateData(pMedSrc->lpszFileName, pFmtSrc->cfFormat, 0);
+ break;
+ case TYMED_ISTREAM:
+ pMedDest->pstm = pMedSrc->pstm;
+ pMedSrc->pstm->AddRef();
+ break;
+ case TYMED_ISTORAGE:
+ pMedDest->pstg = pMedSrc->pstg;
+ pMedSrc->pstg->AddRef();
+ break;
+ case TYMED_NULL:
+ default:
+ break;
+ }
+ pMedDest->tymed = pMedSrc->tymed;
+ pMedDest->pUnkForRelease = pMedSrc->pUnkForRelease;
+}
+
+STDMETHODIMP IDataObjectImpl::EnumFormatEtc(
+ /* [in] */ DWORD dwDirection,
+ /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc)
+{
+ if (ppenumFormatEtc == NULL)
+ return E_POINTER;
+
+ *ppenumFormatEtc=NULL;
+ switch (dwDirection)
+ {
+ case DATADIR_GET:
+ *ppenumFormatEtc = new EnumFormatEtcImpl(_storage);
+
+ if (!*ppenumFormatEtc)
+ return E_OUTOFMEMORY;
+
+ (*ppenumFormatEtc)->AddRef();
+ break;
+
+ case DATADIR_SET:
+ default:
+ return E_NOTIMPL;
+ break;
+ }
+
+ return S_OK;
+}
+
+STDMETHODIMP IDataObjectImpl::DAdvise(
+ /* [in] */ FORMATETC __RPC_FAR *pformatetc,
+ /* [in] */ DWORD advf,
+ /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink,
+ /* [out] */ DWORD __RPC_FAR *pdwConnection)
+{
+ return OLE_E_ADVISENOTSUPPORTED;
+}
+
+STDMETHODIMP IDataObjectImpl::DUnadvise(
+ /* [in] */ DWORD dwConnection)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE IDataObjectImpl::EnumDAdvise(
+ /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise)
+{
+ return OLE_E_ADVISENOTSUPPORTED;
+}
+
+//////////////////////////////////////////////////////////////////////
+// IDropSourceImpl Class
+//////////////////////////////////////////////////////////////////////
+
+STDMETHODIMP IDropSourceImpl::QueryContinueDrag(
+ /* [in] */ BOOL fEscapePressed,
+ /* [in] */ DWORD grfKeyState)
+{
+ if (fEscapePressed)
+ return DRAGDROP_S_CANCEL;
+ if (!(grfKeyState & (MK_LBUTTON|MK_RBUTTON)))
+ {
+ m_bDropped = true;
+ return DRAGDROP_S_DROP;
+ }
+
+ return S_OK;
+
+}
+
+STDMETHODIMP IDropSourceImpl::GiveFeedback(
+ /* [in] */ DWORD dwEffect)
+{
+ return DRAGDROP_S_USEDEFAULTCURSORS;
+}
+
+//////////////////////////////////////////////////////////////////////
+// EnumFormatEtcImpl Class
+//////////////////////////////////////////////////////////////////////
+
+EnumFormatEtcImpl::EnumFormatEtcImpl(const FormatArray& ArrFE)
+ : super(IID_IEnumFORMATETC),
+ m_cRefCount(0),
+ m_iCur(0)
+{
+ for(FormatArray::const_iterator it=ArrFE.begin(); it!=ArrFE.end(); ++it)
+ m_pFmtEtc.push_back(*it);
+}
+
+EnumFormatEtcImpl::EnumFormatEtcImpl(const StorageArray& ArrFE)
+ : super(IID_IEnumFORMATETC),
+ m_cRefCount(0),
+ m_iCur(0)
+{
+ for(StorageArray::const_iterator it=ArrFE.begin(); it!=ArrFE.end(); ++it)
+ m_pFmtEtc.push_back(*it->_format);
+}
+
+STDMETHODIMP EnumFormatEtcImpl::Next(ULONG celt,LPFORMATETC lpFormatEtc, ULONG* pceltFetched)
+{
+ if (pceltFetched != NULL)
+ *pceltFetched=0;
+
+ ULONG cReturn = celt;
+
+ if (celt <= 0 || lpFormatEtc == NULL || m_iCur >= m_pFmtEtc.size())
+ return S_FALSE;
+
+ if (pceltFetched == NULL && celt != 1) // pceltFetched can be NULL only for 1 item request
+ return S_FALSE;
+
+ while (m_iCur < m_pFmtEtc.size() && cReturn > 0)
+ {
+ *lpFormatEtc++ = m_pFmtEtc[m_iCur++];
+ --cReturn;
+ }
+ if (pceltFetched != NULL)
+ *pceltFetched = celt - cReturn;
+
+ return (cReturn == 0) ? S_OK : S_FALSE;
+}
+
+STDMETHODIMP EnumFormatEtcImpl::Skip(ULONG celt)
+{
+ if ((m_iCur + int(celt)) >= m_pFmtEtc.size())
+ return S_FALSE;
+
+ m_iCur += celt;
+ return S_OK;
+}
+
+STDMETHODIMP EnumFormatEtcImpl::Reset(void)
+{
+ m_iCur = 0;
+ return S_OK;
+}
+
+STDMETHODIMP EnumFormatEtcImpl::Clone(IEnumFORMATETC** ppCloneEnumFormatEtc)
+{
+ if (ppCloneEnumFormatEtc == NULL)
+ return E_POINTER;
+
+ EnumFormatEtcImpl* newEnum = new EnumFormatEtcImpl(m_pFmtEtc);
+
+ if (!newEnum)
+ return E_OUTOFMEMORY;
+
+ newEnum->AddRef();
+ newEnum->m_iCur = m_iCur;
+ *ppCloneEnumFormatEtc = newEnum;
+
+ return S_OK;
+}
+
+//////////////////////////////////////////////////////////////////////
+// IDropTargetImpl Class
+//////////////////////////////////////////////////////////////////////
+IDropTargetImpl::IDropTargetImpl(HWND hTargetWnd)
+ : m_cRefCount(0),
+ m_bAllowDrop(false),
+ m_pDropTargetHelper(NULL),
+ m_pSupportedFrmt(NULL),
+ m_hTargetWnd(hTargetWnd)
+{
+ assert(m_hTargetWnd != NULL);
+
+ if (FAILED(CoCreateInstance(CLSID_DragDropHelper, NULL, CLSCTX_INPROC_SERVER,
+ IID_IDropTargetHelper,(LPVOID*)&m_pDropTargetHelper)))
+ m_pDropTargetHelper = NULL;
+}
+
+IDropTargetImpl::~IDropTargetImpl()
+{
+ if (m_pDropTargetHelper != NULL)
+ {
+ m_pDropTargetHelper->Release();
+ m_pDropTargetHelper = NULL;
+ }
+}
+
+HRESULT STDMETHODCALLTYPE IDropTargetImpl::QueryInterface( /* [in] */ REFIID riid,
+ /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
+{
+ *ppvObject = NULL;
+ if (IID_IUnknown==riid || IID_IDropTarget==riid)
+ *ppvObject=this;
+
+ if (*ppvObject != NULL)
+ {
+ ((LPUNKNOWN)*ppvObject)->AddRef();
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+ULONG STDMETHODCALLTYPE IDropTargetImpl::Release()
+{
+ long nTemp = --m_cRefCount;
+
+ assert(nTemp >= 0);
+
+ if (nTemp == 0)
+ delete this;
+
+ return nTemp;
+}
+
+bool IDropTargetImpl::QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect)
+{
+ DWORD dwOKEffects = *pdwEffect;
+
+ if (!m_bAllowDrop)
+ {
+ *pdwEffect = DROPEFFECT_NONE;
+ return false;
+ }
+
+ //CTRL+SHIFT -- DROPEFFECT_LINK
+ //CTRL -- DROPEFFECT_COPY
+ //SHIFT -- DROPEFFECT_MOVE
+ //no modifier -- DROPEFFECT_MOVE or whatever is allowed by src
+ *pdwEffect = (grfKeyState & MK_CONTROL) ?
+ ( (grfKeyState & MK_SHIFT) ? DROPEFFECT_LINK : DROPEFFECT_COPY ):
+ ( (grfKeyState & MK_SHIFT) ? DROPEFFECT_MOVE : DROPEFFECT_NONE );
+ if (*pdwEffect == 0)
+ {
+ // No modifier keys used by user while dragging.
+ if (DROPEFFECT_COPY & dwOKEffects)
+ *pdwEffect = DROPEFFECT_COPY;
+ else if (DROPEFFECT_MOVE & dwOKEffects)
+ *pdwEffect = DROPEFFECT_MOVE;
+ else if (DROPEFFECT_LINK & dwOKEffects)
+ *pdwEffect = DROPEFFECT_LINK;
+ else
+ {
+ *pdwEffect = DROPEFFECT_NONE;
+ }
+ }
+ else
+ {
+ // Check if the drag source application allows the drop effect desired by user.
+ // The drag source specifies this in DoDragDrop
+ if (!(*pdwEffect & dwOKEffects))
+ *pdwEffect = DROPEFFECT_NONE;
+ }
+
+ return (DROPEFFECT_NONE == *pdwEffect)?false:true;
+}
+
+HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragEnter(
+ /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
+ /* [in] */ DWORD grfKeyState,
+ /* [in] */ POINTL pt,
+ /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+{
+ if (pDataObj == NULL)
+ return E_INVALIDARG;
+
+ if (m_pDropTargetHelper)
+ m_pDropTargetHelper->DragEnter(m_hTargetWnd, pDataObj, (LPPOINT)&pt, *pdwEffect);
+
+ //IEnumFORMATETC* pEnum;
+ //pDataObj->EnumFormatEtc(DATADIR_GET,&pEnum);
+ //FORMATETC ftm;
+ //for()
+ //pEnum->Next(1,&ftm,0);
+ //pEnum->Release();
+ m_pSupportedFrmt = NULL;
+
+ for(FormatArray::iterator it=m_formatetc.begin(); it!=m_formatetc.end(); ++it)
+ {
+ m_bAllowDrop = (pDataObj->QueryGetData(&*it) == S_OK)? true: false;
+
+ if (m_bAllowDrop)
+ {
+ m_pSupportedFrmt = &*it;
+ break;
+ }
+ }
+
+ QueryDrop(grfKeyState, pdwEffect);
+
+ return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragOver(
+ /* [in] */ DWORD grfKeyState,
+ /* [in] */ POINTL pt,
+ /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+{
+ if (m_pDropTargetHelper)
+ m_pDropTargetHelper->DragOver((LPPOINT)&pt, *pdwEffect);
+
+ QueryDrop(grfKeyState, pdwEffect);
+
+ return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE IDropTargetImpl::DragLeave()
+{
+ if (m_pDropTargetHelper)
+ m_pDropTargetHelper->DragLeave();
+
+ m_bAllowDrop = false;
+ m_pSupportedFrmt = NULL;
+
+ return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE IDropTargetImpl::Drop(
+ /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
+ /* [in] */ DWORD grfKeyState, /* [in] */ POINTL pt,
+ /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+{
+ if (pDataObj == NULL)
+ return E_INVALIDARG;
+
+ if (m_pDropTargetHelper)
+ m_pDropTargetHelper->Drop(pDataObj, (LPPOINT)&pt, *pdwEffect);
+
+ if (QueryDrop(grfKeyState, pdwEffect))
+ {
+ if (m_bAllowDrop && m_pSupportedFrmt != NULL)
+ {
+ STGMEDIUM medium;
+
+ if (pDataObj->GetData(m_pSupportedFrmt, &medium) == S_OK)
+ {
+ if (OnDrop(m_pSupportedFrmt, medium, pdwEffect)) //does derive class wants us to free medium?
+ ReleaseStgMedium(&medium);
+ }
+ }
+ }
+
+ m_bAllowDrop = false;
+ *pdwEffect = DROPEFFECT_NONE;
+ m_pSupportedFrmt = NULL;
+
+ return S_OK;
+}
--- /dev/null
+// IDataObjectImpl.h: interface for the CIDataObjectImpl class.
+/**************************************************************************
+ THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
+ ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+ PARTICULAR PURPOSE.
+ Author: Leon Finker 11/2000
+ Modifications: replaced ATL by STL, Martin Fuchs 7/2003
+**************************************************************************/
+
+#include <vector>
+using std::vector;
+
+
+typedef vector<FORMATETC> FormatArray;
+
+ /// structure containing information for one format of EnumFormatEtcImpl
+struct DataStorage {
+ FORMATETC* _format;
+ STGMEDIUM* _medium;
+};
+
+typedef vector<DataStorage> StorageArray;
+
+
+ /// implementation of IEnumFORMATETC interface
+class EnumFormatEtcImpl
+ : public IComSrvBase<IEnumFORMATETC, EnumFormatEtcImpl>, public SimpleComObject
+{
+ typedef IComSrvBase<IEnumFORMATETC, EnumFormatEtcImpl> super;
+
+private:
+ ULONG m_cRefCount;
+ FormatArray m_pFmtEtc;
+ size_t m_iCur;
+
+public:
+ EnumFormatEtcImpl(const FormatArray& ArrFE);
+ EnumFormatEtcImpl(const StorageArray& ArrFE);
+ virtual ~EnumFormatEtcImpl() {}
+
+ //IEnumFORMATETC members
+ virtual HRESULT STDMETHODCALLTYPE Next(ULONG, LPFORMATETC, ULONG*);
+ virtual HRESULT STDMETHODCALLTYPE Skip(ULONG);
+ virtual HRESULT STDMETHODCALLTYPE Reset(void);
+ virtual HRESULT STDMETHODCALLTYPE Clone(IEnumFORMATETC**);
+};
+
+ /// implementation of IDropSource interface
+class IDropSourceImpl
+ : public IComSrvBase<IDropSource, IDropSourceImpl>, public SimpleComObject
+{
+ typedef IComSrvBase<IDropSource, IDropSourceImpl> super;
+
+ long m_cRefCount;
+
+public:
+ bool m_bDropped;
+
+ IDropSourceImpl()
+ : super(IID_IDropSource),
+ m_cRefCount(0),
+ m_bDropped(false)
+ {
+ }
+
+ virtual ~IDropSourceImpl() {}
+
+ //IDropSource
+ virtual HRESULT STDMETHODCALLTYPE QueryContinueDrag(
+ /* [in] */ BOOL fEscapePressed,
+ /* [in] */ DWORD grfKeyState);
+
+ virtual HRESULT STDMETHODCALLTYPE GiveFeedback(
+ /* [in] */ DWORD dwEffect);
+};
+
+ /// implementation of IDataObject interface
+class IDataObjectImpl
+ : public IComSrvBase<IDataObject, IDataObjectImpl>, public SimpleComObject
+ //public IAsyncOperation
+{
+ typedef IComSrvBase<IDataObject, IDataObjectImpl> super;
+
+ IDropSourceImpl* m_pDropSource;
+ long m_cRefCount;
+
+ StorageArray _storage;
+
+public:
+ IDataObjectImpl(IDropSourceImpl* pDropSource);
+ virtual ~IDataObjectImpl();
+
+ void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
+
+ //IDataObject
+ virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetData(
+ /* [unique][in] */ FORMATETC __RPC_FAR *pformatetcIn,
+ /* [out] */ STGMEDIUM __RPC_FAR *pmedium);
+
+ virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDataHere(
+ /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
+ /* [out][in] */ STGMEDIUM __RPC_FAR *pmedium);
+
+ virtual HRESULT STDMETHODCALLTYPE QueryGetData(
+ /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc);
+
+ virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc(
+ /* [unique][in] */ FORMATETC __RPC_FAR *pformatectIn,
+ /* [out] */ FORMATETC __RPC_FAR *pformatetcOut);
+
+ virtual /* [local] */ HRESULT STDMETHODCALLTYPE SetData(
+ /* [unique][in] */ FORMATETC __RPC_FAR *pformatetc,
+ /* [unique][in] */ STGMEDIUM __RPC_FAR *pmedium,
+ /* [in] */ BOOL fRelease);
+
+ virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc(
+ /* [in] */ DWORD dwDirection,
+ /* [out] */ IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc);
+
+ virtual HRESULT STDMETHODCALLTYPE DAdvise(
+ /* [in] */ FORMATETC __RPC_FAR *pformatetc,
+ /* [in] */ DWORD advf,
+ /* [unique][in] */ IAdviseSink __RPC_FAR *pAdvSink,
+ /* [out] */ DWORD __RPC_FAR *pdwConnection);
+
+ virtual HRESULT STDMETHODCALLTYPE DUnadvise(
+ /* [in] */ DWORD dwConnection);
+
+ virtual HRESULT STDMETHODCALLTYPE EnumDAdvise(
+ /* [out] */ IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise);
+
+ //IAsyncOperation
+ //virtual HRESULT STDMETHODCALLTYPE SetAsyncMode(
+ // /* [in] */ BOOL fDoOpAsync)
+ //{
+ // return E_NOTIMPL;
+ //}
+ //
+ //virtual HRESULT STDMETHODCALLTYPE GetAsyncMode(
+ // /* [out] */ BOOL __RPC_FAR *pfIsOpAsync)
+ //{
+ // return E_NOTIMPL;
+ //}
+ //
+ //virtual HRESULT STDMETHODCALLTYPE StartOperation(
+ // /* [optional][unique][in] */ IBindCtx __RPC_FAR *pbcReserved)
+ //{
+ // return E_NOTIMPL;
+ //}
+ //
+ //virtual HRESULT STDMETHODCALLTYPE InOperation(
+ // /* [out] */ BOOL __RPC_FAR *pfInAsyncOp)
+ //{
+ // return E_NOTIMPL;
+ //}
+ //
+ //virtual HRESULT STDMETHODCALLTYPE EndOperation(
+ // /* [in] */ HRESULT hResult,
+ // /* [unique][in] */ IBindCtx __RPC_FAR *pbcReserved,
+ // /* [in] */ DWORD dwEffects)
+ //{
+ // return E_NOTIMPL;
+ //}*/
+};
+
+ /// implementation of IDropTarget interface
+class IDropTargetImpl : public IDropTarget
+{
+ DWORD m_cRefCount;
+ bool m_bAllowDrop;
+ IDropTargetHelper* m_pDropTargetHelper;
+
+ FormatArray m_formatetc;
+ FORMATETC* m_pSupportedFrmt;
+
+protected:
+ HWND m_hTargetWnd;
+
+public:
+ IDropTargetImpl(HWND m_hTargetWnd);
+ virtual ~IDropTargetImpl();
+
+ void AddSuportedFormat(FORMATETC& ftetc) {m_formatetc.push_back(ftetc);}
+
+ //return values: true - release the medium. false - don't release the medium
+ virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(
+ /* [in] */ REFIID riid,
+ /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
+ virtual ULONG STDMETHODCALLTYPE AddRef() {return ++m_cRefCount;}
+ virtual ULONG STDMETHODCALLTYPE Release();
+
+ bool QueryDrop(DWORD grfKeyState, LPDWORD pdwEffect);
+ virtual HRESULT STDMETHODCALLTYPE DragEnter(
+ /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
+ /* [in] */ DWORD grfKeyState,
+ /* [in] */ POINTL pt,
+ /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
+ virtual HRESULT STDMETHODCALLTYPE DragOver(
+ /* [in] */ DWORD grfKeyState,
+ /* [in] */ POINTL pt,
+ /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
+ virtual HRESULT STDMETHODCALLTYPE DragLeave();
+ virtual HRESULT STDMETHODCALLTYPE Drop(
+ /* [unique][in] */ IDataObject __RPC_FAR *pDataObj,
+ /* [in] */ DWORD grfKeyState,
+ /* [in] */ POINTL pt,
+ /* [out][in] */ DWORD __RPC_FAR *pdwEffect);
+};
+
+ /// implementation of IDragSourceHelper interface
+class DragSourceHelper
+{
+ IDragSourceHelper* pDragSourceHelper;
+
+public:
+ DragSourceHelper()
+ {
+ if (FAILED(CoCreateInstance(CLSID_DragDropHelper,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ IID_IDragSourceHelper,
+ (void**)&pDragSourceHelper)))
+ pDragSourceHelper = NULL;
+ }
+
+ virtual ~DragSourceHelper()
+ {
+ if (pDragSourceHelper != NULL)
+ {
+ pDragSourceHelper->Release();
+ pDragSourceHelper=NULL;
+ }
+ }
+
+ // IDragSourceHelper
+ HRESULT InitializeFromBitmap(HBITMAP hBitmap,
+ POINT& pt, // cursor position in client coords of the window
+ RECT& rc, // selected item's bounding rect
+ IDataObject* pDataObject,
+ COLORREF crColorKey=GetSysColor(COLOR_WINDOW)// color of the window used for transparent effect.
+ )
+ {
+ if (pDragSourceHelper == NULL)
+ return E_FAIL;
+
+ SHDRAGIMAGE di;
+ BITMAP bm;
+ GetObject(hBitmap, sizeof(bm), &bm);
+ di.sizeDragImage.cx = bm.bmWidth;
+ di.sizeDragImage.cy = bm.bmHeight;
+ di.hbmpDragImage = hBitmap;
+ di.crColorKey = crColorKey;
+ di.ptOffset.x = pt.x - rc.left;
+ di.ptOffset.y = pt.y - rc.top;
+ return pDragSourceHelper->InitializeFromBitmap(&di, pDataObject);
+ }
+
+ HRESULT InitializeFromWindow(HWND hwnd, POINT& pt,IDataObject* pDataObject)
+ {
+ if (pDragSourceHelper == NULL)
+ return E_FAIL;
+ return pDragSourceHelper->InitializeFromWindow(hwnd, &pt, pDataObject);
+ }
+};
--- /dev/null
+/*
+ * Copyright 2003 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // shellbrowserimpl.cpp
+ //
+ // Martin Fuchs, 28.09.2003
+ //
+ // Credits: Thanks to Leon Finker for his explorer cabinet window example
+ //
+
+
+#include <precomp.h>
+
+
+HRESULT IShellBrowserImpl::QueryInterface(REFIID iid, void** ppvObject)
+{
+ if (!ppvObject)
+ return E_POINTER;
+
+ if (iid == IID_IUnknown)
+ *ppvObject = (IUnknown*)static_cast<IShellBrowser*>(this);
+ else if (iid == IID_IOleWindow)
+ *ppvObject = static_cast<IOleWindow*>(this);
+ else if (iid == IID_IShellBrowser)
+ *ppvObject = static_cast<IShellBrowser*>(this);
+ else if (iid == IID_ICommDlgBrowser)
+ *ppvObject = static_cast<ICommDlgBrowser*>(this);
+ else if (iid == IID_IServiceProvider)
+ *ppvObject = static_cast<IServiceProvider*>(this);
+ else {
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+
+ return S_OK;
+}
+
+HRESULT IShellBrowserImpl::QueryService(REFGUID guidService, REFIID riid, void** ppvObject)
+{
+ if (!ppvObject)
+ return E_POINTER;
+
+ ///@todo use guidService
+
+ if (riid == IID_IUnknown)
+ *ppvObject = (IUnknown*)static_cast<IShellBrowser*>(this);
+ else if (riid == IID_IOleWindow)
+ *ppvObject = static_cast<IOleWindow*>(this);
+ else if (riid == IID_IShellBrowser)
+ *ppvObject = static_cast<IShellBrowser*>(this);
+ else if (riid == IID_ICommDlgBrowser)
+ *ppvObject = static_cast<ICommDlgBrowser*>(this);
+ else if (riid == IID_IServiceProvider)
+ *ppvObject = static_cast<IServiceProvider*>(this);
+ else if (riid == IID_IOleCommandTarget)
+ *ppvObject = static_cast<IOleCommandTarget*>(this);
+ else {
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+
+ return S_OK;
+}
+
+HRESULT IShellBrowserImpl::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT* pCmdText)
+{
+ return E_FAIL; ///@todo implement IOleCommandTarget
+}
+
+HRESULT IShellBrowserImpl::Exec(const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT* pvaIn, VARIANT* pvaOut)
+{
+ return E_FAIL; ///@todo implement IOleCommandTarget
+}
+
+
+ // process default command: look for folders and traverse into them
+HRESULT IShellBrowserImpl::OnDefaultCommand(IShellView* ppshv)
+{
+ IDataObject* selection;
+
+ HRESULT hr = ppshv->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (void**)&selection);
+ if (FAILED(hr))
+ return hr;
+
+ PIDList pidList;
+
+ hr = pidList.GetData(selection);
+ if (FAILED(hr)) {
+ selection->Release();
+ return hr;
+ }
+
+ hr = OnDefaultCommand(pidList);
+
+ selection->Release();
+
+ return hr;
+}
--- /dev/null
+/*
+ * Copyright 2003 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // shellbrowserimpl.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+ // Credits: Thanks to Leon Finker for his explorer cabinet window example
+ //
+
+#ifdef __MINGW32__
+#include "servprov.h" // for IServiceProvider
+#include "docobj.h" // for IOleCommandTarget
+#endif
+
+
+ /// Implementation of IShellBrowser and ICommDlgBrowser interfaces for explorer child windows (see ShellBrowserChild)
+struct IShellBrowserImpl
+ : public IShellBrowser,
+ public ICommDlgBrowser,
+ public IServiceProvider,
+ public IOleCommandTarget
+{
+ IShellBrowserImpl()
+ : _dwRef(0)
+ {
+ }
+
+ virtual ~IShellBrowserImpl()
+ {
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
+
+ virtual ULONG STDMETHODCALLTYPE AddRef() {return ++_dwRef;}
+ virtual ULONG STDMETHODCALLTYPE Release() {return --_dwRef;} //not heap based
+
+ // *** IOleWindow methods ***
+ virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode) {return E_NOTIMPL;}
+
+ // *** ICommDlgBrowser methods ***
+ virtual HRESULT STDMETHODCALLTYPE OnDefaultCommand(IShellView* ppshv);
+
+ virtual HRESULT STDMETHODCALLTYPE OnStateChange(IShellView* ppshv, ULONG uChange)
+ { //handle selection, rename, focus if needed
+ return E_NOTIMPL;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE IncludeObject(IShellView* ppshv, LPCITEMIDLIST pidl)
+ { //filter files if needed
+ return S_OK;
+ }
+
+ // *** IShellBrowser methods *** (same as IOleInPlaceFrame)
+ virtual HRESULT STDMETHODCALLTYPE InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) {return E_NOTIMPL;}
+ virtual HRESULT STDMETHODCALLTYPE SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuReserved, HWND hwndActiveObject) {return E_NOTIMPL;}
+ virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB(HMENU hmenuShared) {return E_NOTIMPL;}
+ virtual HRESULT STDMETHODCALLTYPE SetStatusTextSB(LPCOLESTR lpszStatusText) {return E_NOTIMPL;}
+ virtual HRESULT STDMETHODCALLTYPE EnableModelessSB(BOOL fEnable) {return E_NOTIMPL;}
+ virtual HRESULT STDMETHODCALLTYPE BrowseObject(LPCITEMIDLIST pidl, UINT wFlags) {return E_NOTIMPL;}
+ virtual HRESULT STDMETHODCALLTYPE GetViewStateStream(DWORD grfMode, LPSTREAM* ppStrm) {return E_NOTIMPL;}
+ virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive(IShellView* ppshv) {return E_NOTIMPL;}
+ virtual HRESULT STDMETHODCALLTYPE SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags) {return E_NOTIMPL;}
+ virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorSB(LPMSG lpmsg, WORD wID) {return S_OK;}
+
+ // IServiceProvider
+ virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void** ppvObject);
+
+ // IOleCommandTarget
+ virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT* pCmdText);
+ virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
+
+protected:
+ DWORD _dwRef;
+
+ virtual HRESULT OnDefaultCommand(LPIDA pida) {return E_NOTIMPL;}
+};
+
+#ifndef WM_GETISHELLBROWSER
+#define WM_GETISHELLBROWSER (WM_USER+7)
+#endif
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // shellclasses.cpp
+ //
+ // C++ wrapper classes for COM interfaces and shell objects
+ //
+ // Martin Fuchs, 20.07.2003
+ //
+
+
+#include <precomp.h>
+
+
+#ifdef _MS_VER
+#pragma comment(lib, "shell32") // link to shell32.dll
+#endif
+
+
+ // work around GCC's wide string constant bug
+#ifdef __GNUC__
+const LPCTSTR sCFSTR_SHELLIDLIST = TEXT("Shell IDList Array");
+#endif
+
+
+ // helper functions for string copying
+
+/*LPSTR strcpyn(LPSTR dest, LPCSTR source, size_t count)
+{
+ LPCSTR s;
+ LPSTR d = dest;
+
+ for(s=source; count&&(*d++=*s++); )
+ count--;
+
+ return dest;
+}
+
+LPWSTR wcscpyn(LPWSTR dest, LPCWSTR source, size_t count)
+{
+ LPCWSTR s;
+ LPWSTR d = dest;
+
+ for(s=source; count&&(*d++=*s++); )
+ count--;
+
+ return dest;
+}*/
+
+
+String COMException::toString() const
+{
+ TCHAR msg[4*BUFFER_LEN];
+ int l = 4*BUFFER_LEN;
+ LPTSTR p = msg;
+
+ int n = _stprintf_s2(p, l, TEXT("%s\nContext: %s"), super::ErrorMessage(), (LPCTSTR)_context.toString());
+ p += n;
+ l -= n;
+
+ if (_file)
+ p += _stprintf_s2(p, l, TEXT("\nLocation: %hs:%d"), _file, _line);
+
+ return msg;
+}
+
+
+ /// Exception Handler for COM exceptions
+
+void HandleException(COMException& e, HWND hwnd)
+{
+ String msg = e.toString();
+
+ SetLastError(0);
+
+ if (hwnd && !IsWindowVisible(hwnd))
+ hwnd = 0;
+
+ MessageBox(hwnd, msg, TEXT("ShellClasses Exception"), MB_ICONHAND|MB_OK);
+
+ // If displaying the error message box _with_ parent was not successfull, display it now without a parent window.
+ if (GetLastError() == ERROR_INVALID_WINDOW_HANDLE)
+ MessageBox(0, msg, TEXT("ShellClasses Exception"), MB_ICONHAND|MB_OK);
+}
+
+
+ // common IMalloc object
+
+CommonShellMalloc ShellMalloc::s_cmn_shell_malloc;
+
+
+ // common desktop object
+
+ShellFolder& GetDesktopFolder()
+{
+ static CommonDesktop s_desktop;
+
+ // initialize s_desktop
+ s_desktop.init();
+
+ return s_desktop;
+}
+
+
+void CommonDesktop::init()
+{
+ CONTEXT("CommonDesktop::init()");
+
+ if (!_desktop)
+ _desktop = new ShellFolder;
+}
+
+CommonDesktop::~CommonDesktop()
+{
+ if (_desktop)
+ delete _desktop;
+}
+
+
+HRESULT path_from_pidlA(IShellFolder* folder, LPCITEMIDLIST pidl, LPSTR buffer, int len)
+{
+ CONTEXT("path_from_pidlA()");
+
+ StrRetA str;
+
+ HRESULT hr = folder->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &str);
+
+ if (SUCCEEDED(hr))
+ str.GetString(pidl->mkid, buffer, len);
+ else
+ buffer[0] = '\0';
+
+ return hr;
+}
+
+HRESULT path_from_pidlW(IShellFolder* folder, LPCITEMIDLIST pidl, LPWSTR buffer, int len)
+{
+ CONTEXT("path_from_pidlW()");
+
+ StrRetW str;
+
+ HRESULT hr = folder->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &str);
+
+ if (SUCCEEDED(hr))
+ str.GetString(pidl->mkid, buffer, len);
+ else
+ buffer[0] = '\0';
+
+ return hr;
+}
+
+HRESULT name_from_pidl(IShellFolder* folder, LPCITEMIDLIST pidl, LPTSTR buffer, int len, SHGDNF flags)
+{
+ CONTEXT("name_from_pidl()");
+
+ StrRet str;
+
+ HRESULT hr = folder->GetDisplayNameOf(pidl, flags, &str);
+
+ if (SUCCEEDED(hr))
+ str.GetString(pidl->mkid, buffer, len);
+ else
+ buffer[0] = '\0';
+
+ return hr;
+}
+
+
+#ifndef _NO_COMUTIL
+
+ShellFolder::ShellFolder()
+{
+ CONTEXT("ShellFolder::ShellFolder()");
+
+ IShellFolder* desktop;
+
+ CHECKERROR(SHGetDesktopFolder(&desktop));
+
+ super::Attach(desktop);
+ desktop->AddRef();
+}
+
+ShellFolder::ShellFolder(IShellFolder* p)
+ : super(p)
+{
+ CONTEXT("ShellFolder::ShellFolder(IShellFolder*)");
+
+ p->AddRef();
+}
+
+ShellFolder::ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl)
+{
+ CONTEXT("ShellFolder::ShellFolder(IShellFolder*, LPCITEMIDLIST)");
+
+ IShellFolder* ptr;
+
+ if (!pidl)
+ CHECKERROR(E_INVALIDARG);
+
+ if (pidl && pidl->mkid.cb)
+ CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr));
+ else
+ ptr = parent;
+
+ super::Attach(ptr);
+ ptr->AddRef();
+}
+
+ShellFolder::ShellFolder(LPCITEMIDLIST pidl)
+{
+ CONTEXT("ShellFolder::ShellFolder(LPCITEMIDLIST)");
+
+ IShellFolder* ptr;
+ IShellFolder* parent = GetDesktopFolder();
+
+ if (pidl && pidl->mkid.cb)
+ CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr));
+ else
+ ptr = parent;
+
+ super::Attach(ptr);
+ ptr->AddRef();
+}
+
+void ShellFolder::attach(IShellFolder* parent, LPCITEMIDLIST pidl)
+{
+ CONTEXT("ShellFolder::attach(IShellFolder*, LPCITEMIDLIST)");
+
+ IShellFolder* ptr;
+
+ if (pidl && pidl->mkid.cb)
+ CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&ptr));
+ else
+ ptr = parent;
+
+ super::Attach(ptr);
+ ptr->AddRef();
+}
+
+#else // _com_ptr not available -> use SIfacePtr
+
+ShellFolder::ShellFolder()
+{
+ CONTEXT("ShellFolder::ShellFolder()");
+
+ CHECKERROR(SHGetDesktopFolder(&_p));
+
+ _p->AddRef();
+}
+
+ShellFolder::ShellFolder(IShellFolder* p)
+ : super(p)
+{
+ CONTEXT("ShellFolder::ShellFolder(IShellFolder*)");
+
+ _p->AddRef();
+}
+
+ShellFolder::ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl)
+{
+ CONTEXT("ShellFolder::ShellFolder(IShellFolder*, LPCITEMIDLIST)");
+
+ if (pidl && pidl->mkid.cb)
+ CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p));
+ else
+ _p = GetDesktopFolder();
+
+ _p->AddRef();
+}
+
+ShellFolder::ShellFolder(LPCITEMIDLIST pidl)
+{
+ CONTEXT("ShellFolder::ShellFolder(LPCITEMIDLIST)");
+
+ if (pidl && pidl->mkid.cb)
+ CHECKERROR(GetDesktopFolder()->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p));
+ else
+ _p = GetDesktopFolder();
+
+ _p->AddRef();
+}
+
+void ShellFolder::attach(IShellFolder* parent, LPCITEMIDLIST pidl)
+{
+ CONTEXT("ShellFolder::ShellFolder(IShellFolder*, LPCITEMIDLIST)");
+
+ IShellFolder* h = _p;
+
+ CHECKERROR(parent->BindToObject(pidl, 0, IID_IShellFolder, (LPVOID*)&_p));
+
+ _p->AddRef();
+ h->Release();
+}
+
+#endif
+
+String ShellFolder::get_name(LPCITEMIDLIST pidl, SHGDNF flags) const
+{
+ CONTEXT("ShellFolder::get_name()");
+
+ TCHAR buffer[MAX_PATH];
+ StrRet strret;
+
+ HRESULT hr = ((IShellFolder*)*const_cast<ShellFolder*>(this))->GetDisplayNameOf(pidl, flags, &strret);
+
+ if (hr == S_OK)
+ strret.GetString(pidl->mkid, buffer, COUNTOF(buffer));
+ else {
+ CHECKERROR(hr);
+ *buffer = TEXT('\0');
+ }
+
+ return buffer;
+}
+
+
+void ShellPath::split(ShellPath& parent, ShellPath& obj) const
+{
+ SHITEMID *piid, *piidLast;
+ int size = 0;
+
+ // find last item-id and calculate total size of pidl
+ for(piid=piidLast=&_p->mkid; piid->cb; ) {
+ piidLast = piid;
+ size += (piid->cb);
+ piid = (SHITEMID*)((LPBYTE)piid + (piid->cb));
+ }
+
+ // copy parent folder portion
+ size -= piidLast->cb; // don't count "object" item-id
+
+ if (size > 0)
+ parent.assign(_p, size);
+
+ // copy "object" portion
+ obj.assign((ITEMIDLIST*)piidLast, piidLast->cb);
+}
+
+void ShellPath::GetUIObjectOf(REFIID riid, LPVOID* ppvOut, HWND hWnd, ShellFolder& sf)
+{
+ CONTEXT("ShellPath::GetUIObjectOf()");
+
+ ShellPath parent, obj;
+
+ split(parent, obj);
+
+ LPCITEMIDLIST idl = obj;
+
+ if (parent && parent->mkid.cb)
+ // use the IShellFolder of the parent
+ CHECKERROR(ShellFolder((IShellFolder*)sf,parent)->GetUIObjectOf(hWnd, 1, &idl, riid, 0, ppvOut));
+ else // else use desktop folder
+ CHECKERROR(sf->GetUIObjectOf(hWnd, 1, &idl, riid, 0, ppvOut));
+}
+
+#if 0 // ILCombine() was missing in previous versions of MinGW and is not exported from shell32.dll on Windows 2000.
+
+ // convert an item id list from relative to absolute (=relative to the desktop) format
+ShellPath ShellPath::create_absolute_pidl(LPCITEMIDLIST parent_pidl) const
+{
+ CONTEXT("ShellPath::create_absolute_pidl()");
+
+ return ILCombine(parent_pidl, _p);
+
+/* seems to work only for NT upwards
+ // create a new item id list with _p append behind parent_pidl
+ int l1 = ILGetSize(parent_pidl) - sizeof(USHORT/ SHITEMID::cb /);
+ int l2 = ILGetSize(_p);
+
+ LPITEMIDLIST p = (LPITEMIDLIST) _malloc->Alloc(l1+l2);
+
+ memcpy(p, parent_pidl, l1);
+ memcpy((LPBYTE)p+l1, _p, l2);
+
+ return p;
+*/
+}
+
+#else
+
+ShellPath ShellPath::create_absolute_pidl(LPCITEMIDLIST parent_pidl) const
+{
+ CONTEXT("ShellPath::create_absolute_pidl()");
+
+ static DynamicFct<LPITEMIDLIST(WINAPI*)(LPCITEMIDLIST, LPCITEMIDLIST)> ILCombine(TEXT("SHELL32"), 25);
+
+ if (ILCombine)
+ return (*ILCombine)(parent_pidl, _p);
+
+ // create a new item id list with _p append behind parent_pidl
+ int l1 = ILGetSize(parent_pidl) - sizeof(USHORT/*SHITEMID::cb*/);
+ int l2 = ILGetSize(_p);
+
+ LPITEMIDLIST p = (LPITEMIDLIST) _malloc->Alloc(l1+l2);
+
+ memcpy(p, parent_pidl, l1);
+ memcpy((LPBYTE)p+l1, _p, l2);
+
+ return p;
+}
+
+#endif
+
+ // local implementation of ILGetSize() to replace missing export on Windows 2000
+UINT ILGetSize_local(LPCITEMIDLIST pidl)
+{
+ if (!pidl)
+ return 0;
+
+ int l = sizeof(USHORT/*SHITEMID::cb*/);
+
+ while(pidl->mkid.cb) {
+ l += pidl->mkid.cb;
+ pidl = LPCITEMIDLIST((LPBYTE)pidl+pidl->mkid.cb);
+ }
+
+ return l;
+}
+
+
+#ifndef _SHFOLDER_H_
+#define CSIDL_FLAG_CREATE 0x8000
+#endif
+
+ /// file system path of special folder
+SpecialFolderFSPath::SpecialFolderFSPath(int folder, HWND hwnd)
+{
+ _fullpath[0] = '\0';
+
+#ifdef UNICODE
+ static DynamicFct<BOOL (__stdcall*)(HWND hwnd, LPTSTR pszPath, int csidl, BOOL fCreate)> s_pSHGetSpecialFolderPath(TEXT("shell32"), "SHGetSpecialFolderPathW");
+#else
+ static DynamicFct<BOOL (__stdcall*)(HWND hwnd, LPTSTR pszPath, int csidl, BOOL fCreate)> s_pSHGetSpecialFolderPath(TEXT("shell32"), "SHGetSpecialFolderPathA");
+#endif
+ if (*s_pSHGetSpecialFolderPath)
+ (*s_pSHGetSpecialFolderPath)(hwnd, _fullpath, folder, TRUE);
+ else {
+ // SHGetSpecialFolderPath() is not compatible to WIN95/NT4
+#ifdef UNICODE
+ static DynamicFct<HRESULT (__stdcall*)(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPTSTR pszPath)> s_pSHGetFolderPath_shell32(TEXT("shell32"), "SHGetFolderPathW");
+#else
+ static DynamicFct<HRESULT (__stdcall*)(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPTSTR pszPath)> s_pSHGetFolderPath_shell32(TEXT("shell32"), "SHGetFolderPathA");
+#endif
+ if (*s_pSHGetFolderPath_shell32)
+ (*s_pSHGetFolderPath_shell32)(hwnd, folder|CSIDL_FLAG_CREATE, 0, 0, _fullpath);
+ else {
+ // SHGetFolderPath() is only present in shfolder.dll on some platforms.
+#ifdef UNICODE
+ static DynamicLoadLibFct<HRESULT (__stdcall*)(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPTSTR pszPath)> s_pSHGetFolderPath_shfolder(TEXT("shfolder"), "SHGetFolderPathW");
+#else
+ static DynamicLoadLibFct<HRESULT (__stdcall*)(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPTSTR pszPath)> s_pSHGetFolderPath_shfolder(TEXT("shfolder"), "SHGetFolderPathA");
+#endif
+ if (*s_pSHGetFolderPath_shfolder)
+ (*s_pSHGetFolderPath_shfolder)(hwnd, folder|CSIDL_FLAG_CREATE, 0, 0, _fullpath);
+ }
+ }
+}
+
+
+void CtxMenuInterfaces::reset()
+{
+ _pctxmenu2 = NULL;
+
+#ifndef __MINGW32__ // IContextMenu3 missing in MinGW (as of 6.2.2005)
+ _pctxmenu3 = NULL;
+#endif
+}
+
+bool CtxMenuInterfaces::HandleMenuMsg(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+#ifndef __MINGW32__ // IContextMenu3 missing in MinGW (as of 6.2.2005)
+ if (_pctxmenu3) {
+ if (SUCCEEDED(_pctxmenu3->HandleMenuMsg(nmsg, wparam, lparam)))
+ return true;
+ }
+#endif
+
+ if (_pctxmenu2)
+ if (SUCCEEDED(_pctxmenu2->HandleMenuMsg(nmsg, wparam, lparam)))
+ return true;
+
+ return false;
+}
+
+IContextMenu* CtxMenuInterfaces::query_interfaces(IContextMenu* pcm1)
+{
+ IContextMenu* pcm = NULL;
+
+ reset();
+
+ // Get the higher version context menu interfaces.
+#ifndef __MINGW32__ // IContextMenu3 missing in MinGW (as of 6.2.2005)
+ if (pcm1->QueryInterface(IID_IContextMenu3, (void**)&pcm) == NOERROR)
+ _pctxmenu3 = (LPCONTEXTMENU3)pcm;
+ else
+#endif
+ if (pcm1->QueryInterface(IID_IContextMenu2, (void**)&pcm) == NOERROR)
+ _pctxmenu2 = (LPCONTEXTMENU2)pcm;
+
+ if (pcm) {
+ pcm1->Release();
+ return pcm;
+ } else
+ return pcm1;
+}
+
+
+HRESULT ShellFolderContextMenu(IShellFolder* shell_folder, HWND hwndParent, int cidl,
+ LPCITEMIDLIST* apidl, int x, int y, CtxMenuInterfaces& cm_ifs)
+{
+ IContextMenu* pcm;
+
+ HRESULT hr = shell_folder->GetUIObjectOf(hwndParent, cidl, apidl, IID_IContextMenu, NULL, (LPVOID*)&pcm);
+// HRESULT hr = CDefFolderMenu_Create2(dir?dir->_pidl:DesktopFolder(), hwndParent, 1, &pidl, shell_folder, NULL, 0, NULL, &pcm);
+
+ if (SUCCEEDED(hr)) {
+ pcm = cm_ifs.query_interfaces(pcm);
+
+ HMENU hmenu = CreatePopupMenu();
+
+ if (hmenu) {
+ hr = pcm->QueryContextMenu(hmenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL|CMF_EXPLORE);
+
+ if (SUCCEEDED(hr)) {
+ UINT idCmd = TrackPopupMenu(hmenu, TPM_LEFTALIGN|TPM_RETURNCMD|TPM_RIGHTBUTTON, x, y, 0, hwndParent, NULL);
+
+ cm_ifs.reset();
+
+ if (idCmd) {
+ CMINVOKECOMMANDINFO cmi;
+
+ cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
+ cmi.fMask = 0;
+ cmi.hwnd = hwndParent;
+ cmi.lpVerb = (LPCSTR)(INT_PTR)(idCmd - FCIDM_SHVIEWFIRST);
+ cmi.lpParameters = NULL;
+ cmi.lpDirectory = NULL;
+ cmi.nShow = SW_SHOWNORMAL;
+ cmi.dwHotKey = 0;
+ cmi.hIcon = 0;
+
+ hr = pcm->InvokeCommand(&cmi);
+ }
+ } else
+ cm_ifs.reset();
+ }
+
+ pcm->Release();
+ }
+
+ return hr;
+}
--- /dev/null
+# Microsoft Developer Studio Project File - Name="shellclasses" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Console Application" 0x0103\r
+\r
+CFG=shellclasses - Win32 Unicode Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "shellclasses.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "shellclasses.mak" CFG="shellclasses - Win32 Unicode Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "shellclasses - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "shellclasses - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "shellclasses - Win32 Unicode Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "shellclasses - Win32 Unicode Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.cmd\r
+RSC=rc.exe\r
+\r
+!IF "$(CFG)" == "shellclasses - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
+# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /YX /FD /c\r
+# ADD BASE RSC /l 0x407 /d "NDEBUG"\r
+# ADD RSC /l 0x407 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.cmd\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+\r
+!ELSEIF "$(CFG)" == "shellclasses - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /FR /YX /FD /GZ /c\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.cmd\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+\r
+!ELSEIF "$(CFG)" == "shellclasses - Win32 Unicode Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "shellclasses___Win32_Unicode_Debug"\r
+# PROP BASE Intermediate_Dir "shellclasses___Win32_Unicode_Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "UDebug"\r
+# PROP Intermediate_Dir "UDebug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /FR /YX /FD /GZ /c\r
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "UNICODE" /FR /YX /FD /GZ /c\r
+# ADD BASE RSC /l 0x407 /d "_DEBUG"\r
+# ADD RSC /l 0x407 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.cmd\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
+\r
+!ELSEIF "$(CFG)" == "shellclasses - Win32 Unicode Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "shellclasses___Win32_Unicode_Release"\r
+# PROP BASE Intermediate_Dir "shellclasses___Win32_Unicode_Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "URelease"\r
+# PROP Intermediate_Dir "URelease"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /YX /FD /c\r
+# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "UNICODE" /YX /FD /c\r
+# ADD BASE RSC /l 0x407 /d "NDEBUG"\r
+# ADD RSC /l 0x407 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.cmd\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "shellclasses - Win32 Release"\r
+# Name "shellclasses - Win32 Debug"\r
+# Name "shellclasses - Win32 Unicode Debug"\r
+# Name "shellclasses - Win32 Unicode Release"\r
+# Begin Source File\r
+\r
+SOURCE=.\shellclasses.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shellclasses.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\shelltests.cpp\r
+# End Source File\r
+# End Target\r
+# End Project\r
--- /dev/null
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r
+\r
+###############################################################################\r
+\r
+Project: "shellclasses"=.\shellclasses.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // shellclasses.h
+ //
+ // C++ wrapper classes for COM interfaces and shell objects
+ //
+ // Martin Fuchs, 20.07.2003
+ //
+
+
+ // windows shell headers
+#include <shellapi.h>
+#include <shlobj.h>
+
+/*@@
+#if _MSC_VER>=1300 // VS.Net
+#include <comdefsp.h>
+using namespace _com_util;
+#endif
+*/
+
+#ifndef _INC_COMUTIL // is comutil.h of MS headers not available?
+#ifndef _NO_COMUTIL
+#define _NO_COMUTIL
+#endif
+#endif
+
+ // work around GCC's wide string constant bug when compiling inline functions
+#ifdef __GNUC__
+extern const LPCTSTR sCFSTR_SHELLIDLIST;
+#undef CFSTR_SHELLIDLIST
+#define CFSTR_SHELLIDLIST sCFSTR_SHELLIDLIST
+#endif
+
+#ifdef _MSC_VER
+#define NOVTABLE __declspec(novtable)
+#else
+#define NOVTABLE
+#endif
+#define ANSUNC
+
+
+ // Exception Handling
+
+#ifndef _NO_COMUTIL
+
+#define COMExceptionBase _com_error
+
+#else
+
+ /// COM ExceptionBase class as replacement for _com_error
+struct COMExceptionBase
+{
+ COMExceptionBase(HRESULT hr)
+ : _hr(hr)
+ {
+ }
+
+ HRESULT Error() const
+ {
+ return _hr;
+ }
+
+ LPCTSTR ErrorMessage() const
+ {
+ if (_msg.empty()) {
+ LPTSTR pBuf;
+
+ if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
+ 0, _hr, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (LPTSTR)&pBuf, 0, NULL)) {
+ _msg = pBuf;
+ LocalFree(pBuf);
+ } else {
+ TCHAR buffer[128];
+ _sntprintf(buffer, COUNTOF(buffer), TEXT("unknown Exception: 0x%08lX"), _hr);
+ _msg = buffer;
+ }
+ }
+
+ return _msg;
+ }
+
+protected:
+ HRESULT _hr;
+ mutable String _msg;
+};
+
+#endif
+
+
+ /// Exception with context information
+
+struct COMException : public COMExceptionBase
+{
+ typedef COMExceptionBase super;
+
+ COMException(HRESULT hr)
+ : super(hr),
+ _context(CURRENT_CONTEXT),
+ _file(NULL), _line(0)
+ {
+ LOG(toString());
+ LOG(CURRENT_CONTEXT.getStackTrace());
+ }
+
+ COMException(HRESULT hr, const char* file, int line)
+ : super(hr),
+ _context(CURRENT_CONTEXT),
+ _file(file), _line(line)
+ {
+ LOG(toString());
+ LOG(CURRENT_CONTEXT.getStackTrace());
+ }
+
+ COMException(HRESULT hr, const String& obj)
+ : super(hr),
+ _context(CURRENT_CONTEXT),
+ _file(NULL), _line(0)
+ {
+ LOG(toString());
+ LOG(CURRENT_CONTEXT.getStackTrace());
+ }
+
+ COMException(HRESULT hr, const String& obj, const char* file, int line)
+ : super(hr),
+ _context(CURRENT_CONTEXT),
+ _file(file), _line(line)
+ {
+ LOG(toString());
+ LOG(CURRENT_CONTEXT.getStackTrace());
+ }
+
+ String toString() const;
+
+ Context _context;
+
+ const char* _file;
+ int _line;
+};
+
+#define THROW_EXCEPTION(hr) throw COMException(hr, __FILE__, __LINE__)
+#define CHECKERROR(hr) ((void)(FAILED(hr)? THROW_EXCEPTION(hr): 0))
+
+
+#ifdef _NO_COMUTIL
+
+inline void CheckError(HRESULT hr)
+{
+ if (FAILED(hr))
+ throw COMException(hr);
+}
+
+#endif
+
+
+ /// COM Initialisation
+
+struct ComInit
+{
+ ComInit()
+ {
+ CHECKERROR(CoInitialize(0));
+ }
+
+#if (_WIN32_WINNT>=0x0400) || defined(_WIN32_DCOM)
+ ComInit(DWORD flag)
+ {
+ CHECKERROR(CoInitializeEx(0, flag));
+ }
+#endif
+
+ ~ComInit()
+ {
+ CoUninitialize();
+ }
+};
+
+
+ /// OLE initialisation for drag drop support
+
+struct OleInit
+{
+ OleInit()
+ {
+ CHECKERROR(OleInitialize(0));
+ }
+
+ ~OleInit()
+ {
+ OleUninitialize();
+ }
+};
+
+
+ /// Exception Handler for COM exceptions
+
+extern void HandleException(COMException& e, HWND hwnd);
+
+
+ /// We use a common IMalloc object for all shell memory allocations.
+
+struct CommonShellMalloc
+{
+ CommonShellMalloc()
+ {
+ _p = NULL;
+ }
+
+ void init()
+ {
+ if (!_p)
+ CHECKERROR(SHGetMalloc(&_p));
+ }
+
+ ~CommonShellMalloc()
+ {
+ if (_p)
+ _p->Release();
+ }
+
+ operator IMalloc*()
+ {
+ return _p;
+ }
+
+ IMalloc* _p;
+};
+
+
+ /// wrapper class for IMalloc with usage of common allocator
+
+struct ShellMalloc
+{
+ ShellMalloc()
+ {
+ // initialize s_cmn_shell_malloc
+ s_cmn_shell_malloc.init();
+ }
+
+ IMalloc* operator->()
+ {
+ return s_cmn_shell_malloc;
+ }
+
+ static CommonShellMalloc s_cmn_shell_malloc;
+};
+
+
+ /// wrapper template class for pointers to shell objects managed by IMalloc
+
+template<typename T> struct SShellPtr
+{
+ ~SShellPtr()
+ {
+ _malloc->Free(_p);
+ }
+
+ T* operator->()
+ {
+ return _p;
+ }
+
+ T const* operator->() const
+ {
+ return _p;
+ }
+
+ operator T const *() const
+ {
+ return _p;
+ }
+
+ const T& operator*() const
+ {
+ return *_p;
+ }
+
+ T& operator*()
+ {
+ return *_p;
+ }
+
+protected:
+ SShellPtr()
+ : _p(0)
+ {
+ }
+
+ SShellPtr(T* p)
+ : _p(p)
+ {
+ }
+
+ void Free()
+ {
+ _malloc->Free(_p);
+ _p = NULL;
+ }
+
+ T* _p;
+ mutable ShellMalloc _malloc; // IMalloc memory management object
+
+private:
+ // disallow copying of SShellPtr objects
+ SShellPtr(const SShellPtr&) {}
+ void operator=(SShellPtr const&) {}
+};
+
+
+ /// wrapper class for COM interface pointers
+
+template<typename T> struct SIfacePtr
+{
+ SIfacePtr()
+ : _p(0)
+ {
+ }
+
+ SIfacePtr(T* p)
+ : _p(p)
+ {
+ if (p)
+ p->AddRef();
+ }
+
+ SIfacePtr(IUnknown* unknown, REFIID riid)
+ {
+ CHECKERROR(unknown->QueryInterface(riid, (LPVOID*)&_p));
+ }
+
+ ~SIfacePtr()
+ {
+ Free();
+ }
+
+ T* operator->()
+ {
+ return _p;
+ }
+
+ const T* operator->() const
+ {
+ return _p;
+ }
+
+/* not GCC compatible
+ operator const T*() const
+ {
+ return _p;
+ } */
+
+ operator T*()
+ {
+ return _p;
+ }
+
+ T** operator&()
+ {
+ return &_p;
+ }
+
+ bool empty() const //NOTE: GCC seems not to work correctly when defining operator bool() AND operator T*() at one time
+ {
+ return !_p;
+ }
+
+ SIfacePtr& operator=(T* p)
+ {
+ Free();
+
+ if (p) {
+ p->AddRef();
+ _p = p;
+ }
+
+ return *this;
+ }
+
+ void operator=(SIfacePtr const& o)
+ {
+ T* h = _p;
+
+ if (o._p)
+ o._p->AddRef();
+
+ _p = o._p;
+
+ if (h)
+ h->Release();
+ }
+
+ HRESULT CreateInstance(REFIID clsid, REFIID riid)
+ {
+ return CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, riid, (LPVOID*)&_p);
+ }
+
+ template<typename I> HRESULT QueryInterface(REFIID riid, I* p)
+ {
+ return _p->QueryInterface(riid, (LPVOID*)p);
+ }
+
+ T* get()
+ {
+ return _p;
+ }
+
+ void Free()
+ {
+ T* h = _p;
+ _p = NULL;
+
+ if (h)
+ h->Release();
+ }
+
+protected:
+ SIfacePtr(const SIfacePtr& o)
+ : _p(o._p)
+ {
+ if (_p)
+ _p->AddRef();
+ }
+
+ T* _p;
+};
+
+
+struct NOVTABLE ComSrvObject // NOVTABLE erlaubt, da protected Destruktor
+{
+protected:
+ ComSrvObject() : _ref(1) {}
+ virtual ~ComSrvObject() {}
+
+ ULONG _ref;
+};
+
+struct SimpleComObject : public ComSrvObject
+{
+ ULONG IncRef() {return ++_ref;}
+ ULONG DecRef() {ULONG ref=--_ref; if (!ref) {_ref++; delete this;} return ref;}
+};
+
+
+ // server object interfaces
+
+template<typename BASE> struct IComSrvQI : public BASE
+{
+ IComSrvQI(REFIID uuid_base)
+ : _uuid_base(uuid_base)
+ {
+ }
+
+ STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv)
+ {
+ *ppv = NULL;
+
+ if (IsEqualIID(riid, _uuid_base) || IsEqualIID(riid, IID_IUnknown))
+ {*ppv=static_cast<BASE*>(this); this->AddRef(); return S_OK;}
+
+ return E_NOINTERFACE;
+ }
+
+protected:
+ IComSrvQI() {}
+ virtual ~IComSrvQI() {}
+
+ REFIID _uuid_base;
+};
+
+template<> struct IComSrvQI<IUnknown> : public IUnknown
+{
+ STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv)
+ {
+ *ppv = NULL;
+
+ if (IsEqualIID(riid, IID_IUnknown))
+ {*ppv=this; AddRef(); return S_OK;}
+
+ return E_NOINTERFACE;
+ }
+
+protected:
+ IComSrvQI<IUnknown>() {}
+ virtual ~IComSrvQI<IUnknown>() {}
+};
+
+
+template<typename BASE, typename OBJ>
+ class IComSrvBase : public IComSrvQI<BASE>
+{
+ typedef IComSrvQI<BASE> super;
+
+protected:
+ IComSrvBase(REFIID uuid_base)
+ : super(uuid_base)
+ {
+ }
+
+public:
+ STDMETHODIMP_(ULONG) AddRef() {return static_cast<OBJ*>(this)->IncRef();}
+ STDMETHODIMP_(ULONG) Release() {return static_cast<OBJ*>(this)->DecRef();}
+};
+
+
+
+struct ShellFolder;
+
+
+ /// caching of desktop ShellFolder object
+
+struct CommonDesktop
+{
+ CommonDesktop()
+ {
+ _desktop = 0;
+ }
+
+ ~CommonDesktop();
+
+ void init();
+
+ operator ShellFolder&()
+ {
+ return *_desktop;
+ }
+
+protected:
+ ShellFolder* _desktop;
+};
+
+
+#ifndef _NO_COMUTIL // _com_ptr available?
+
+ /// IShellFolder smart pointer
+struct ShellFolder : public IShellFolderPtr // IShellFolderPtr uses intrinsic extensions of the VC++ compiler.
+{
+ typedef IShellFolderPtr super;
+
+ ShellFolder(); // desktop folder
+ ShellFolder(IShellFolder* p);
+ ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl);
+ ShellFolder(LPCITEMIDLIST pidl);
+
+ void attach(IShellFolder* parent, LPCITEMIDLIST pidl);
+ String get_name(LPCITEMIDLIST pidl=NULL, SHGDNF flags=SHGDN_NORMAL) const;
+
+ bool empty() const {return !operator bool();} //NOTE: see SIfacePtr::empty()
+};
+
+#ifdef UNICODE
+#define IShellLinkPtr IShellLinkWPtr
+#else
+#define IShellLinkPtr IShellLinkAPtr
+#endif
+
+ /// IShellLink smart pointer
+struct ShellLinkPtr : public IShellLinkPtr
+{
+ typedef IShellLinkPtr super;
+
+ ShellLinkPtr(IShellLink* p)
+ : super(p)
+ {
+ p->AddRef();
+ }
+
+ bool empty() const {return !operator bool();} //NOTE: see SIfacePtr::empty()
+};
+
+#else // _com_ptr not available -> use SIfacePtr
+
+ /// IShellFolder smart pointer
+struct ShellFolder : public SIfacePtr<IShellFolder>
+{
+ typedef SIfacePtr<IShellFolder> super;
+
+ ShellFolder();
+ ShellFolder(IShellFolder* p);
+ ShellFolder(IShellFolder* parent, LPCITEMIDLIST pidl);
+ ShellFolder(LPCITEMIDLIST pidl);
+
+ void attach(IShellFolder* parent, LPCITEMIDLIST pidl);
+ String get_name(LPCITEMIDLIST pidl, SHGDNF flags=SHGDN_NORMAL) const;
+};
+
+ /// IShellLink smart pointer
+struct ShellLinkPtr : public SIfacePtr<IShellLink>
+{
+ typedef SIfacePtr<IShellLink> super;
+
+ ShellLinkPtr(IShellLink* p)
+ : super(p)
+ {
+ _p->AddRef();
+ }
+
+};
+
+#endif
+
+
+extern ShellFolder& GetDesktopFolder();
+
+
+#ifdef UNICODE
+#define path_from_pidl path_from_pidlW
+#else
+#define path_from_pidl path_from_pidlA
+#endif
+
+extern HRESULT path_from_pidlA(IShellFolder* folder, LPCITEMIDLIST pidl, LPSTR buffer, int len);
+extern HRESULT path_from_pidlW(IShellFolder* folder, LPCITEMIDLIST pidl, LPWSTR buffer, int len);
+extern HRESULT name_from_pidl(IShellFolder* folder, LPCITEMIDLIST pidl, LPTSTR buffer, int len, SHGDNF flags);
+
+
+ // ILGetSize() was missing in previous versions of MinGW and is not exported from shell32.dll on Windows 2000.
+extern "C" UINT ILGetSize_local(LPCITEMIDLIST pidl);
+#define ILGetSize ILGetSize_local
+
+#if 0
+#ifdef UNICODE // CFSTR_FILENAME was defined wrong in previous versions of MinGW.
+#define CFSTR_FILENAMEW TEXT("FileNameW")
+#undef CFSTR_FILENAME
+#define CFSTR_FILENAME CFSTR_FILENAMEW
+#endif
+#endif
+
+
+ /// wrapper class for item ID lists
+
+struct ShellPath : public SShellPtr<ITEMIDLIST>
+{
+ typedef SShellPtr<ITEMIDLIST> super;
+
+ ShellPath()
+ {
+ }
+
+ ShellPath(IShellFolder* folder, LPCWSTR path)
+ {
+ CONTEXT("ShellPath::ShellPath(IShellFolder*, LPCWSTR)");
+
+ if (path)
+ CHECKERROR(folder->ParseDisplayName(0, NULL, (LPOLESTR)path, NULL, &_p, NULL));
+ else
+ _p = NULL;
+ }
+
+ ShellPath(LPCWSTR path)
+ {
+ OBJ_CONTEXT("ShellPath::ShellPath(LPCWSTR)", path);
+
+ if (path)
+ CHECKERROR(GetDesktopFolder()->ParseDisplayName(0, NULL, (LPOLESTR)path, NULL, &_p, NULL));
+ else
+ _p = NULL;
+ }
+
+ ShellPath(IShellFolder* folder, LPCSTR path)
+ {
+ CONTEXT("ShellPath::ShellPath(IShellFolder*, LPCSTR)");
+
+ WCHAR b[MAX_PATH];
+
+ if (path) {
+ MultiByteToWideChar(CP_ACP, 0, path, -1, b, COUNTOF(b));
+ CHECKERROR(folder->ParseDisplayName(0, NULL, b, NULL, &_p, NULL));
+ } else
+ _p = NULL;
+ }
+
+ ShellPath(LPCSTR path)
+ {
+ CONTEXT("ShellPath::ShellPath(LPCSTR)");
+
+ WCHAR b[MAX_PATH];
+
+ if (path) {
+ MultiByteToWideChar(CP_ACP, 0, path, -1, b, COUNTOF(b));
+ CHECKERROR(GetDesktopFolder()->ParseDisplayName(0, NULL, b, NULL, &_p, NULL));
+ } else
+ _p = NULL;
+ }
+
+ ShellPath(const ShellPath& o)
+ : super(NULL)
+ {
+ //CONTEXT("ShellPath::ShellPath(const ShellPath&)");
+
+ if (o._p) {
+ int l = ILGetSize(o._p);
+ _p = (ITEMIDLIST*) _malloc->Alloc(l);
+ if (_p) memcpy(_p, o._p, l);
+ }
+ }
+
+ explicit ShellPath(LPITEMIDLIST p)
+ : super(p)
+ {
+ }
+
+ ShellPath(LPCITEMIDLIST p)
+ {
+ //CONTEXT("ShellPath::ShellPath(LPCITEMIDLIST)");
+
+ if (p) {
+ int l = ILGetSize(p);
+ _p = (ITEMIDLIST*) _malloc->Alloc(l);
+ if (_p) memcpy(_p, p, l);
+ }
+ }
+
+ void operator=(const ShellPath& o)
+ {
+ //CONTEXT("ShellPath::operator=(const ShellPath&)");
+
+ ITEMIDLIST* h = _p;
+
+ if (o._p) {
+ int l = ILGetSize(o._p);
+
+ _p = (ITEMIDLIST*) _malloc->Alloc(l);
+ if (_p) memcpy(_p, o._p, l);
+ }
+ else
+ _p = NULL;
+
+ _malloc->Free(h);
+ }
+
+ void operator=(ITEMIDLIST* p)
+ {
+ //CONTEXT("ShellPath::operator=(ITEMIDLIST*)");
+
+ ITEMIDLIST* h = _p;
+
+ if (p) {
+ int l = ILGetSize(p);
+ _p = (ITEMIDLIST*) _malloc->Alloc(l);
+ if (_p) memcpy(_p, p, l);
+ }
+ else
+ _p = NULL;
+
+ _malloc->Free(h);
+ }
+
+ void operator=(const SHITEMID& o)
+ {
+ ITEMIDLIST* h = _p;
+
+ LPBYTE p = (LPBYTE)_malloc->Alloc(o.cb+2);
+ if (p) *(PWORD)((LPBYTE)memcpy(p, &o, o.cb)+o.cb) = 0;
+ _p = (ITEMIDLIST*)p;
+
+ _malloc->Free(h);
+ }
+
+ void operator+=(const SHITEMID& o)
+ {
+ int l0 = ILGetSize(_p);
+ LPBYTE p = (LPBYTE)_malloc->Alloc(l0+o.cb);
+ int l = l0 - 2;
+
+ if (p) {
+ memcpy(p, _p, l);
+ *(PWORD)((LPBYTE)memcpy(p+l, &o, o.cb)+o.cb) = 0;
+ }
+
+ _malloc->Free(_p);
+ _p = (ITEMIDLIST*)p;
+ }
+
+ void assign(LPCITEMIDLIST pidl, size_t size)
+ {
+ //CONTEXT("ShellPath::assign(LPCITEMIDLIST, size_t)");
+
+ ITEMIDLIST* h = _p;
+
+ _p = (ITEMIDLIST*) _malloc->Alloc(size+sizeof(USHORT/*SHITEMID::cb*/));
+
+ if (_p) {
+ memcpy(_p, pidl, size);
+ ((ITEMIDLIST*)((LPBYTE)_p+size))->mkid.cb = 0; // terminator
+ }
+
+ _malloc->Free(h);
+ }
+
+ void assign(LPCITEMIDLIST pidl)
+ {
+ //CONTEXT("ShellPath::assign(LPCITEMIDLIST)");
+
+ ITEMIDLIST* h = _p;
+
+ if (pidl) {
+ int l = ILGetSize(pidl);
+ _p = (ITEMIDLIST*) _malloc->Alloc(l);
+ if (_p) memcpy(_p, pidl, l);
+ } else
+ _p = NULL;
+
+ _malloc->Free(h);
+ }
+
+ void split(ShellPath& parent, ShellPath& obj) const;
+
+ void GetUIObjectOf(REFIID riid, LPVOID* ppvOut, HWND hWnd=0, ShellFolder& sf=GetDesktopFolder());
+
+ ShellFolder get_folder()
+ {
+ return ShellFolder(_p);
+ }
+
+ ShellFolder get_folder(IShellFolder* parent)
+ {
+ CONTEXT("ShellPath::get_folder()");
+ return ShellFolder(parent, _p);
+ }
+
+ // convert an item id list from relative to absolute (=relative to the desktop) format
+ ShellPath create_absolute_pidl(LPCITEMIDLIST parent_pidl) const;
+};
+
+
+#if defined(__WINE__) && defined(NONAMELESSUNION) // Wine doesn't know of unnamed union members and uses some macros instead.
+#define UNION_MEMBER(x) DUMMYUNIONNAME.##x
+#else
+#define UNION_MEMBER(x) x
+#endif
+
+
+ // encapsulation of STRRET structure for easy string retrieval with conversion
+
+#ifdef UNICODE
+#define StrRet StrRetW
+//#define tcscpyn wcscpyn
+#else
+#define StrRet StrRetA
+//#define tcscpyn strcpyn
+#endif
+
+//extern LPSTR strcpyn(LPSTR dest, LPCSTR source, size_t count);
+//extern LPWSTR wcscpyn(LPWSTR dest, LPCWSTR source, size_t count);
+
+ /// easy retrieval of multi byte strings out of STRRET structures
+struct StrRetA : public STRRET
+{
+ ~StrRetA()
+ {
+ if (uType == STRRET_WSTR)
+ ShellMalloc()->Free(pOleStr);
+ }
+
+ void GetString(const SHITEMID& shiid, LPSTR b, int l)
+ {
+ switch(uType) {
+ case STRRET_WSTR:
+ WideCharToMultiByte(CP_ACP, 0, UNION_MEMBER(pOleStr), -1, b, l, NULL, NULL);
+ break;
+
+ case STRRET_OFFSET:
+ lstrcpynA(b, (LPCSTR)&shiid+UNION_MEMBER(uOffset), l);
+ break;
+
+ case STRRET_CSTR:
+ lstrcpynA(b, UNION_MEMBER(cStr), l);
+ }
+ }
+};
+
+ /// easy retrieval of wide char strings out of STRRET structures
+struct StrRetW : public STRRET
+{
+ ~StrRetW()
+ {
+ if (uType == STRRET_WSTR)
+ ShellMalloc()->Free(pOleStr);
+ }
+
+ void GetString(const SHITEMID& shiid, LPWSTR b, int l)
+ {
+ switch(uType) {
+ case STRRET_WSTR:
+ lstrcpynW(b, UNION_MEMBER(pOleStr), l);
+ break;
+
+ case STRRET_OFFSET:
+ MultiByteToWideChar(CP_ACP, 0, (LPCSTR)&shiid+UNION_MEMBER(uOffset), -1, b, l);
+ break;
+
+ case STRRET_CSTR:
+ MultiByteToWideChar(CP_ACP, 0, UNION_MEMBER(cStr), -1, b, l);
+ }
+ }
+};
+
+
+ /// Retrieval of file system paths of ShellPath objects
+class FileSysShellPath : public ShellPath
+{
+ TCHAR _fullpath[MAX_PATH];
+
+protected:
+ FileSysShellPath() {_fullpath[0] = '\0';}
+
+public:
+ FileSysShellPath(const ShellPath& o) : ShellPath(o) {_fullpath[0] = '\0';}
+
+ operator LPCTSTR() {if (!SHGetPathFromIDList(_p, _fullpath)) return NULL; return _fullpath;}
+};
+
+
+ /// Browse dialog operating on shell namespace
+struct FolderBrowser : public FileSysShellPath
+{
+ FolderBrowser(HWND owner, UINT flags, LPCTSTR title, LPCITEMIDLIST root=0)
+ {
+ _displayname[0] = '\0';
+ _browseinfo.hwndOwner = owner;
+ _browseinfo.pidlRoot = root;
+ _browseinfo.pszDisplayName = _displayname;
+ _browseinfo.lpszTitle = title;
+ _browseinfo.ulFlags = flags;
+ _browseinfo.lpfn = 0;
+ _browseinfo.lParam = 0;
+ _browseinfo.iImage = 0;
+
+ _p = SHBrowseForFolder(&_browseinfo);
+ }
+
+ LPCTSTR GetDisplayName()
+ {
+ return _displayname;
+ }
+
+ bool IsOK()
+ {
+ return _p != 0;
+ }
+
+private:
+ BROWSEINFO _browseinfo;
+ TCHAR _displayname[MAX_PATH];
+};
+
+
+ /// Retrieval of special shell folder paths
+struct SpecialFolderPath : public ShellPath
+{
+ SpecialFolderPath(int folder, HWND hwnd)
+ {
+ HRESULT hr = SHGetSpecialFolderLocation(hwnd, folder, &_p);
+ CHECKERROR(hr);
+ }
+};
+
+ /// Shell folder path of the desktop
+struct DesktopFolderPath : public SpecialFolderPath
+{
+ DesktopFolderPath()
+ : SpecialFolderPath(CSIDL_DESKTOP, 0)
+ {
+ }
+};
+
+ /// Retrieval of special shell folder
+struct SpecialFolder : public ShellFolder
+{
+ SpecialFolder(int folder, HWND hwnd)
+ : ShellFolder(GetDesktopFolder(), SpecialFolderPath(folder, hwnd))
+ {
+ }
+};
+
+ /// Shell folder of the desktop
+struct DesktopFolder : public ShellFolder
+{
+};
+
+
+ /// file system path of special folder
+struct SpecialFolderFSPath
+{
+ SpecialFolderFSPath(int folder/*e.g. CSIDL_DESKTOP*/, HWND hwnd);
+
+ operator LPCTSTR()
+ {
+ return _fullpath;
+ }
+
+protected:
+ TCHAR _fullpath[MAX_PATH];
+};
+
+/*
+ /// file system path of special folder
+struct SpecialFolderFSPath : public FileSysShellPath
+{
+ SpecialFolderFSPath(int folder, HWND hwnd)
+ {
+ CONTEXT("SpecialFolderFSPath::SpecialFolderFSPath()");
+
+ HRESULT hr = SHGetSpecialFolderLocation(hwnd, folder, &_p);
+ CHECKERROR(hr);
+ }
+};
+*/
+
+
+ /// wrapper class for enumerating shell namespace objects
+
+struct ShellItemEnumerator : public SIfacePtr<IEnumIDList>
+{
+ ShellItemEnumerator(IShellFolder* folder, DWORD flags=SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN)
+ {
+ CONTEXT("ShellItemEnumerator::ShellItemEnumerator()");
+
+ CHECKERROR(folder->EnumObjects(0, flags, &_p));
+ }
+};
+
+
+ /// list of PIDLs
+struct PIDList
+{
+ PIDList()
+ {
+ memset(&_stgm, 0, sizeof(STGMEDIUM));
+ }
+
+ ~PIDList()
+ {
+ if (_stgm.hGlobal) {
+ GlobalUnlock(_stgm.hGlobal);
+ ReleaseStgMedium(&_stgm);
+ }
+ }
+
+ HRESULT GetData(IDataObject* selection)
+ {
+ static UINT CF_IDLIST = RegisterClipboardFormat(CFSTR_SHELLIDLIST);
+
+ FORMATETC fetc;
+ fetc.cfFormat = CF_IDLIST;
+ fetc.ptd = NULL;
+ fetc.dwAspect = DVASPECT_CONTENT;
+ fetc.lindex = -1;
+ fetc.tymed = TYMED_HGLOBAL;
+
+ HRESULT hr = selection->QueryGetData(&fetc);
+ if (FAILED(hr))
+ return hr;
+
+ hr = selection->GetData(&fetc, &_stgm);
+ if (FAILED(hr))
+ return hr;
+
+ _pIDList = (LPIDA)GlobalLock(_stgm.hGlobal);
+
+ return hr;
+ }
+
+ operator LPIDA() {return _pIDList;}
+
+protected:
+ STGMEDIUM _stgm;
+ LPIDA _pIDList;
+};
+
+
+struct CtxMenuInterfaces
+{
+ CtxMenuInterfaces()
+ {
+ reset();
+ }
+
+ void reset();
+ bool HandleMenuMsg(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ IContextMenu* query_interfaces(IContextMenu* pcm1);
+
+ IContextMenu2* _pctxmenu2;
+
+#ifndef __MINGW32__ // IContextMenu3 missing in MinGW (as of 6.2.2005)
+ IContextMenu3* _pctxmenu3;
+#endif
+};
+
+template<typename BASE> struct ExtContextMenuHandlerT
+ : public BASE
+{
+ typedef BASE super;
+
+ ExtContextMenuHandlerT(HWND hwnd)
+ : super(hwnd)
+ {
+ }
+
+ template<typename PARA> ExtContextMenuHandlerT(HWND hwnd, const PARA& info)
+ : super(hwnd, info)
+ {
+ }
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+ {
+ switch(nmsg) {
+ case WM_DRAWITEM:
+ case WM_MEASUREITEM:
+ if (!wparam) // Is the message menu-related?
+ if (_cm_ifs.HandleMenuMsg(nmsg, wparam, lparam))
+ return TRUE;
+
+ break;
+
+ case WM_INITMENUPOPUP:
+ if (_cm_ifs.HandleMenuMsg(nmsg, wparam, lparam))
+ return 0;
+
+ break;
+
+#ifndef __MINGW32__ // IContextMenu3 missing in MinGW (as of 6.2.2005)
+ case WM_MENUCHAR: // only supported by IContextMenu3
+ if (_cm_ifs._pctxmenu3) {
+ LRESULT lResult = 0;
+
+ _cm_ifs._pctxmenu3->HandleMenuMsg2(nmsg, wparam, lparam, &lResult);
+
+ return lResult;
+ }
+
+ return 0;
+#endif
+ }
+
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+protected:
+ CtxMenuInterfaces _cm_ifs;
+};
+
+
+extern HRESULT ShellFolderContextMenu(IShellFolder* shell_folder, HWND hwndParent, int cidl,
+ LPCITEMIDLIST* ppidl, int x, int y, CtxMenuInterfaces& cm_ifs);
--- /dev/null
+/*
+ * Copyright 2003 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // shelltests.cpp
+ //
+ // Examples for usage of shellclasses.cpp, shellclasses.h
+ //
+ // Martin Fuchs, 20.07.2003
+ //
+
+
+//#define WIN32_LEAN_AND_MEAN
+//#define WIN32_EXTRA_LEAN
+//#include <windows.h>
+
+#include "utility.h" // for String
+#include "shellclasses.h"
+
+
+static void dump_shell_namespace(ShellFolder& folder)
+{
+ ShellItemEnumerator enumerator(folder, SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN|SHCONTF_SHAREABLE|SHCONTF_STORAGE);
+
+ LPITEMIDLIST pidl;
+ HRESULT hr = S_OK;
+
+ do {
+ ULONG cnt = 0;
+
+ HRESULT hr = enumerator->Next(1, &pidl, &cnt);
+
+ if (!SUCCEEDED(hr))
+ break;
+
+ if (hr == S_FALSE) // no more entries?
+ break;
+
+ if (pidl) {
+ ULONG attribs = -1;
+
+ HRESULT hr = folder->GetAttributesOf(1, (LPCITEMIDLIST*)&pidl, &attribs);
+
+ if (SUCCEEDED(hr)) {
+ if (attribs == -1)
+ attribs = 0;
+
+ const String& name = folder.get_name(pidl);
+
+ if (attribs & (SFGAO_FOLDER|SFGAO_HASSUBFOLDER))
+ cout << "folder: ";
+ else
+ cout << "file: ";
+
+ cout << "\"" << name << "\"\n attribs=" << hex << attribs << endl;
+ }
+ }
+ } while(SUCCEEDED(hr));
+}
+
+
+int main()
+{
+ // initialize COM
+ ComInit usingCOM;
+
+
+ HWND hwnd = 0;
+
+
+ try {
+
+ // example for retrieval of special folder paths
+
+ SpecialFolderFSPath programs(CSIDL_PROGRAM_FILES, hwnd);
+ SpecialFolderFSPath autostart(CSIDL_STARTUP, hwnd);
+
+ cout << "program files path = " << (LPCTSTR)programs << endl;
+ cout << "autostart folder path = " << (LPCTSTR)autostart << endl;
+
+ cout << endl;
+
+
+ // example for enumerating shell namespace objects
+
+ cout << "Desktop:\n";
+ dump_shell_namespace(GetDesktopFolder());
+ cout << endl;
+
+ cout << "C:\\\n";
+ dump_shell_namespace(ShellPath("C:\\").get_folder());
+ cout << endl;
+
+
+ // example for calling a browser dialog for the whole desktop
+
+ FolderBrowser desktop_browser(hwnd,
+ BIF_RETURNONLYFSDIRS|BIF_EDITBOX|BIF_NEWDIALOGSTYLE,
+ TEXT("Please select the path:"));
+
+ if (desktop_browser.IsOK())
+ MessageBox(hwnd, desktop_browser, TEXT("Your selected path"), MB_OK);
+
+
+ // example for calling a rooted browser dialog
+
+ ShellPath browseRoot("C:\\");
+ FolderBrowser rooted_browser(hwnd,
+ BIF_RETURNONLYFSDIRS|BIF_EDITBOX|BIF_VALIDATE,
+ TEXT("Please select the path:"),
+ browseRoot);
+
+ if (rooted_browser.IsOK())
+ MessageBox(hwnd, rooted_browser, TEXT("Your selected path"), MB_OK);
+
+ } catch(COMException& e) {
+
+ //HandleException(e, hwnd);
+ cerr << e.ErrorMessage() << endl;
+
+ }
+
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright 2000 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "utility.h"
+
+#ifdef UNICODE
+
+void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext)
+{
+ const WCHAR* end; /* end of processed string */
+ const WCHAR* p; /* search pointer */
+ const WCHAR* s; /* copy pointer */
+
+ /* extract drive name */
+ if (path[0] && path[1]==':') {
+ if (drv) {
+ *drv++ = *path++;
+ *drv++ = *path++;
+ *drv = L'\0';
+ }
+ } else if (drv)
+ *drv = L'\0';
+
+ /* search for end of string or stream separator */
+ for(end=path; *end && *end!=L':'; )
+ end++;
+
+ /* search for begin of file extension */
+ for(p=end; p>path && *--p!=L'\\' && *p!=L'/'; )
+ if (*p == L'.') {
+ end = p;
+ break;
+ }
+
+ if (ext)
+ for(s=end; *ext=*s++; )
+ ext++;
+
+ /* search for end of directory name */
+ for(p=end; p>path; )
+ if (*--p=='\\' || *p=='/') {
+ p++;
+ break;
+ }
+
+ if (name) {
+ for(s=p; s<end; )
+ *name++ = *s++;
+
+ *name = L'\0';
+ }
+
+ if (dir) {
+ for(s=path; s<p; )
+ *dir++ = *s++;
+
+ *dir = L'\0';
+ }
+}
+
+#else
+
+void _splitpath(const CHAR* path, CHAR* drv, CHAR* dir, CHAR* name, CHAR* ext)
+{
+ const CHAR* end; /* end of processed string */
+ const CHAR* p; /* search pointer */
+ const CHAR* s; /* copy pointer */
+
+ /* extract drive name */
+ if (path[0] && path[1]==':') {
+ if (drv) {
+ *drv++ = *path++;
+ *drv++ = *path++;
+ *drv = '\0';
+ }
+ } else if (drv)
+ *drv = '\0';
+
+ /* search for end of string or stream separator */
+ for(end=path; *end && *end!=':'; )
+ end++;
+
+ /* search for begin of file extension */
+ for(p=end; p>path && *--p!='\\' && *p!='/'; )
+ if (*p == '.') {
+ end = p;
+ break;
+ }
+
+ if (ext)
+ for(s=end; (*ext=*s++); )
+ ext++;
+
+ /* search for end of directory name */
+ for(p=end; p>path; )
+ if (*--p=='\\' || *p=='/') {
+ p++;
+ break;
+ }
+
+ if (name) {
+ for(s=p; s<end; )
+ *name++ = *s++;
+
+ *name = '\0';
+ }
+
+ if (dir) {
+ for(s=path; s<p; )
+ *dir++ = *s++;
+
+ *dir = '\0';
+ }
+}
+
+#endif
+
+/*
+void main() // test splipath()
+{
+ TCHAR drv[_MAX_DRIVE+1], dir[_MAX_DIR], name[_MAX_FNAME], ext[_MAX_EXT];
+
+ _tsplitpath(L"x\\y", drv, dir, name, ext);
+ _tsplitpath(L"x\\", drv, dir, name, ext);
+ _tsplitpath(L"\\x", drv, dir, name, ext);
+ _tsplitpath(L"x", drv, dir, name, ext);
+ _tsplitpath(L"", drv, dir, name, ext);
+ _tsplitpath(L".x", drv, dir, name, ext);
+ _tsplitpath(L":x", drv, dir, name, ext);
+ _tsplitpath(L"a:x", drv, dir, name, ext);
+ _tsplitpath(L"a.b:x", drv, dir, name, ext);
+ _tsplitpath(L"W:\\/\\abc/Z:~", drv, dir, name, ext);
+ _tsplitpath(L"abc.EFGH:12345", drv, dir, name, ext);
+ _tsplitpath(L"C:/dos/command.com", drv, dir, name, ext);
+}
+*/
--- /dev/null
+/**************************************************************************
+ THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
+ ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
+ PARTICULAR PURPOSE.
+ Author: Leon Finker 01/2001
+ Modifications: removed ATL dependencies, Martin Fuchs 7/2003
+**************************************************************************/
+
+#include "dragdropimpl.h"
+
+ /// OLE drop target for tree controls
+class TreeDropTarget : public IDropTargetImpl
+{
+public:
+ TreeDropTarget(HWND hTargetWnd) : IDropTargetImpl(hTargetWnd) {}
+
+ virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD *pdwEffect)
+ {
+ if (pFmtEtc->cfFormat == CF_HDROP && medium.tymed == TYMED_HGLOBAL)
+ {
+ HDROP hDrop = (HDROP)GlobalLock(medium.hGlobal);
+ if (hDrop != NULL)
+ {
+ TCHAR szFileName[MAX_PATH];
+
+ UINT cFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
+
+ for(UINT i = 0; i < cFiles; ++i)
+ {
+ DragQueryFile(hDrop, i, szFileName, sizeof(szFileName));
+
+ if (DROPEFFECT_COPY & *pdwEffect)
+ {
+ // copy the file or dir
+
+ ///@todo Add the code to handle Copy
+
+ }
+ else if (DROPEFFECT_MOVE & *pdwEffect)
+ {
+ // move the file or dir
+
+ ///@todo Add the code to handle Move
+
+ }
+ }
+ //DragFinish(hDrop); // base class calls ReleaseStgMedium
+ }
+ GlobalUnlock(medium.hGlobal);
+ }
+
+ TreeView_SelectDropTarget(m_hTargetWnd, NULL);
+
+ return true; //let base free the medium
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE DragOver(
+ /* [in] */ DWORD grfKeyState,
+ /* [in] */ POINTL pt,
+ /* [out][in] */ DWORD __RPC_FAR *pdwEffect)
+ {
+ TVHITTESTINFO hit;
+ hit.pt = (POINT&)pt;
+ ScreenToClient(m_hTargetWnd, &hit.pt);
+ hit.flags = TVHT_ONITEM;
+ HTREEITEM hItem = TreeView_HitTest(m_hTargetWnd,&hit);
+
+ if (hItem != NULL)
+ TreeView_SelectDropTarget(m_hTargetWnd, hItem);
+
+ return IDropTargetImpl::DragOver(grfKeyState, pt, pdwEffect);
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE DragLeave(void)
+ {
+ TreeView_SelectDropTarget(m_hTargetWnd, NULL);
+
+ return IDropTargetImpl::DragLeave();
+ }
+};
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // utility.cpp
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#include <precomp.h>
+
+//#include <shellapi.h>
+
+#include <time.h>
+#include <sstream>
+
+
+DWORD WINAPI Thread::ThreadProc(void* para)
+{
+ Thread* pThis = (Thread*) para;
+
+ int ret = pThis->Run();
+
+ pThis->_alive = false;
+
+ return ret;
+}
+
+
+void CenterWindow(HWND hwnd)
+{
+ RECT rt, prt;
+ GetWindowRect(hwnd, &rt);
+
+ DWORD style;
+ HWND owner = 0;
+
+ for(HWND wh=hwnd; (wh=GetWindow(wh,GW_OWNER))!=0; )
+ if (((style=GetWindowStyle(wh))&WS_VISIBLE) && !(style&WS_MINIMIZE))
+ {owner=wh; break;}
+
+ if (owner)
+ GetWindowRect(owner, &prt);
+ else
+ SystemParametersInfo(SPI_GETWORKAREA, 0, &prt, 0); //@@ GetDesktopWindow() wäre auch hilfreich.
+
+ SetWindowPos(hwnd, 0, (prt.left+prt.right+rt.left-rt.right)/2,
+ (prt.top+prt.bottom+rt.top-rt.bottom)/2, 0,0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
+
+ MoveVisible(hwnd);
+}
+
+void MoveVisible(HWND hwnd)
+{
+ RECT rc;
+ GetWindowRect(hwnd, &rc);
+ int left=rc.left, top=rc.top;
+
+ int xmax = GetSystemMetrics(SM_CXSCREEN);
+ int ymax = GetSystemMetrics(SM_CYSCREEN);
+
+ if (rc.left < 0)
+ rc.left = 0;
+ else if (rc.right > xmax)
+ if ((rc.left-=rc.right-xmax) < 0)
+ rc.left = 0;
+
+ if (rc.top < 0)
+ rc.top = 0;
+ else if (rc.bottom > ymax)
+ if ((rc.top-=rc.bottom-ymax) < 0)
+ rc.top = 0;
+
+ if (rc.left!=left || rc.top!=top)
+ SetWindowPos(hwnd, 0, rc.left,rc.top, 0,0, SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE);
+}
+
+
+void display_error(HWND hwnd, DWORD error) //@@ CONTEXT mit ausgeben -> display_error(HWND hwnd, const Exception& e)
+{
+ PTSTR msg;
+
+ if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
+ 0, error, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (PTSTR)&msg, 0, NULL)) {
+ LOG(FmtString(TEXT("display_error(%#x): %s"), error, msg));
+
+ SetLastError(0);
+ MessageBox(hwnd, msg, TEXT("ROS Explorer"), MB_OK);
+
+ if (GetLastError() == ERROR_INVALID_WINDOW_HANDLE)
+ MessageBox(0, msg, TEXT("ROS Explorer"), MB_OK);
+ } else {
+ LOG(FmtString(TEXT("Unknown Error %#x"), error));
+
+ FmtString msg(TEXT("Unknown Error %#x"), error);
+
+ SetLastError(0);
+ MessageBox(hwnd, msg, TEXT("ROS Explorer"), MB_OK);
+
+ if (GetLastError() == ERROR_INVALID_WINDOW_HANDLE)
+ MessageBox(0, msg, TEXT("ROS Explorer"), MB_OK);
+ }
+
+ LocalFree(msg);
+}
+
+
+Context Context::s_main("-NO-CONTEXT-");
+Context* Context::s_current = &Context::s_main;
+
+String Context::toString() const
+{
+ String str = _ctx;
+
+ if (!_obj.empty())
+ str.appendf(TEXT("\nObject: %s"), (LPCTSTR)_obj);
+
+ return str;
+}
+
+String Context::getStackTrace() const
+{
+ ostringstream str;
+
+ str << "Context Trace:\n";
+
+ for(const Context*p=this; p && p!=&s_main; p=p->_last) {
+ str << "- " << p->_ctx;
+
+ if (!p->_obj.empty())
+ str << " obj=" << ANS(p->_obj);
+
+ str << '\n';
+ }
+
+ return str.str();
+}
+
+
+BOOL time_to_filetime(const time_t* t, FILETIME* ftime)
+{
+#ifdef __STDC_WANT_SECURE_LIB__
+ SYSTEMTIME stime;
+ struct tm tm_;
+ struct tm* tm = &tm_;
+
+ if (gmtime_s(tm, t) != 0)
+ return FALSE;
+#else
+ struct tm* tm = gmtime(t);
+ SYSTEMTIME stime;
+
+ if (!tm)
+ return FALSE;
+#endif
+
+ stime.wYear = tm->tm_year+1900;
+ stime.wMonth = tm->tm_mon+1;
+ stime.wDayOfWeek = (WORD)-1;
+ stime.wDay = tm->tm_mday;
+ stime.wHour = tm->tm_hour;
+ stime.wMinute = tm->tm_min;
+ stime.wSecond = tm->tm_sec;
+ stime.wMilliseconds = 0;
+
+ return SystemTimeToFileTime(&stime, ftime);
+}
+
+
+BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow, LPCTSTR parameters)
+{
+ CONTEXT("launch_file()");
+
+ HINSTANCE hinst = ShellExecute(hwnd, NULL/*operation*/, cmd, parameters, NULL/*dir*/, nCmdShow);
+
+ if ((int)hinst <= 32) {
+ display_error(hwnd, GetLastError());
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+#ifdef UNICODE
+BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow, LPCSTR parameters)
+{
+ HINSTANCE hinst = ShellExecuteA(hwnd, NULL/*operation*/, cmd, parameters, NULL/*dir*/, nCmdShow);
+
+ if ((int)hinst <= 32) {
+ display_error(hwnd, GetLastError());
+ return FALSE;
+ }
+
+ return TRUE;
+}
+#endif
+
+
+/* search for already running instance */
+
+static int g_foundPrevInstance = 0;
+
+static BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lparam)
+{
+ TCHAR cls[128];
+
+ GetClassName(hwnd, cls, 128);
+
+ if (!lstrcmp(cls, (LPCTSTR)lparam)) {
+ g_foundPrevInstance++;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/* search for window of given class name to allow only one running instance */
+int find_window_class(LPCTSTR classname)
+{
+ EnumWindows(EnumWndProc, (LPARAM)classname);
+
+ if (g_foundPrevInstance)
+ return 1;
+
+ return 0;
+}
+
+
+String get_windows_version_str()
+{
+ OSVERSIONINFOEX osvi = {sizeof(OSVERSIONINFOEX)};
+ BOOL osvie_val;
+ String str;
+
+ if (!(osvie_val = GetVersionEx((OSVERSIONINFO*)&osvi))) {
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+
+ if (!GetVersionEx((OSVERSIONINFO*)&osvi))
+ return TEXT("???");
+ }
+
+ switch(osvi.dwPlatformId) {
+ case VER_PLATFORM_WIN32_NT:
+#ifdef _ROS_ // This work around can be removed if ReactOS gets a unique version number.
+ str = TEXT("ReactOS");
+#else
+ if (osvi.dwMajorVersion <= 4)
+ str = TEXT("Microsoft Windows NT");
+ else if (osvi.dwMajorVersion==5 && osvi.dwMinorVersion==0)
+ str = TEXT("Microsoft Windows 2000");
+ else if (osvi.dwMajorVersion==5 && osvi.dwMinorVersion==1)
+ str = TEXT("Microsoft Windows XP");
+#endif
+
+ if (osvie_val) {
+ if (osvi.wProductType == VER_NT_WORKSTATION) {
+ if (osvi.wSuiteMask & VER_SUITE_PERSONAL)
+ str += TEXT(" Personal");
+ else
+ str += TEXT(" Professional");
+ } else if (osvi.wProductType == VER_NT_SERVER) {
+ if (osvi.wSuiteMask & VER_SUITE_DATACENTER)
+ str += TEXT(" DataCenter Server");
+ else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE)
+ str += TEXT(" Advanced Server");
+ else
+ str += TEXT(" Server");
+ } else if (osvi.wProductType == VER_NT_DOMAIN_CONTROLLER) {
+ str += TEXT(" Domain Controller");
+ }
+ } else {
+ TCHAR type[80];
+ DWORD dwBufLen;
+ HKEY hkey;
+
+ if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"), 0, KEY_QUERY_VALUE, &hkey)) {
+ RegQueryValueEx(hkey, TEXT("ProductType"), NULL, NULL, (LPBYTE)type, &dwBufLen);
+ RegCloseKey(hkey);
+
+ if (!_tcsicmp(TEXT("WINNT"), type))
+ str += TEXT(" Workstation");
+ else if (!_tcsicmp(TEXT("LANMANNT"), type))
+ str += TEXT(" Server");
+ else if (!_tcsicmp(TEXT("SERVERNT"), type))
+ str += TEXT(" Advanced Server");
+ }
+ }
+ break;
+
+ case VER_PLATFORM_WIN32_WINDOWS:
+ if (osvi.dwMajorVersion>4 ||
+ (osvi.dwMajorVersion==4 && osvi.dwMinorVersion>0)) {
+ if (osvi.dwMinorVersion == 90)
+ str = TEXT("Microsoft Windows ME");
+ else
+ str = TEXT("Microsoft Windows 98");
+
+ if (osvi.szCSDVersion[1] == 'A')
+ str += TEXT(" SE");
+ } else {
+ str = TEXT("Microsoft Windows 95");
+
+ if (osvi.szCSDVersion[1]=='B' || osvi.szCSDVersion[1]=='C')
+ str += TEXT(" OSR2");
+ }
+ break;
+
+ case VER_PLATFORM_WIN32s:
+ str = TEXT("Microsoft Win32s");
+
+ default:
+ return TEXT("???");
+ }
+
+ String vstr;
+
+ if (osvi.dwMajorVersion <= 4)
+ vstr.printf(TEXT(" Version %d.%d %s Build %d"),
+ osvi.dwMajorVersion, osvi.dwMinorVersion,
+ osvi.szCSDVersion, osvi.dwBuildNumber&0xFFFF);
+ else
+ vstr.printf(TEXT(" %s (Build %d)"), osvi.szCSDVersion, osvi.dwBuildNumber&0xFFFF);
+
+ return str + vstr;
+}
+
+
+typedef void (WINAPI*RUNDLLPROC)(HWND hwnd, HINSTANCE hinst, LPCTSTR cmdline, DWORD nCmdShow);
+
+BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT nCmdShow)
+{
+ HMODULE hmod = LoadLibrary(dllname);
+ if (!hmod)
+ return FALSE;
+
+/*TODO
+ <Windows NT/2000>
+ It is possible to create a Unicode version of the function.
+ Rundll32 first tries to find a function named EntryPointW.
+ If it cannot find this function, it tries EntryPointA, then EntryPoint.
+ To create a DLL that supports ANSI on Windows 95/98/Me and Unicode otherwise,
+ export two functions: EntryPointW and EntryPoint.
+*/
+ RUNDLLPROC proc = (RUNDLLPROC)GetProcAddress(hmod, procname);
+ if (!proc) {
+ FreeLibrary(hmod);
+ return FALSE;
+ }
+
+ proc(hwnd, hmod, cmdline, nCmdShow);
+
+ FreeLibrary(hmod);
+
+ return TRUE;
+}
+
+
+#ifdef UNICODE
+#define CONTROL_RUNDLL "Control_RunDLLW"
+#else
+#define CONTROL_RUNDLL "Control_RunDLLA"
+#endif
+
+BOOL launch_cpanel(HWND hwnd, LPCTSTR applet)
+{
+ //launch_file(_hwnd, applet, SW_SHOWNORMAL); // This would be enough, but we want the to use the most direct and fastest call.
+ //launch_file(_hwnd, String(TEXT("rundll32.exe /d shell32.dll,Control_RunDLL "))+applet, SW_SHOWNORMAL);
+
+ return RunDLL(hwnd, TEXT("shell32"), CONTROL_RUNDLL, applet, SW_SHOWNORMAL);
+}
+
+
+BOOL RecursiveCreateDirectory(LPCTSTR path_in)
+{
+ TCHAR path[MAX_PATH], hole_path[MAX_PATH];
+
+ _tcscpy(hole_path, path_in);
+
+ int drv_len = 0;
+ LPCTSTR d;
+
+ for(d=hole_path; *d && *d!='/' && *d!='\\'; ++d) {
+ ++drv_len;
+
+ if (*d == ':')
+ break;
+ }
+
+ LPTSTR dir = hole_path + drv_len;
+
+ int l;
+ LPTSTR p = hole_path + (l=_tcslen(hole_path));
+
+ while(--p>=hole_path && (*p=='/' || *p=='\\'))
+ *p = '\0';
+
+ WIN32_FIND_DATA w32fd;
+
+ HANDLE hFind = FindFirstFile(hole_path, &w32fd);
+
+ if (hFind == INVALID_HANDLE_VALUE) {
+ _tcsncpy(path, hole_path, drv_len);
+ int i = drv_len;
+
+ for(p=dir; *p=='/'||*p=='\\'; p++)
+ path[i++] = *p++;
+
+ for(; i<l; i++) {
+ memcpy(path, hole_path, i*sizeof(TCHAR));
+
+ for(; hole_path[i] && hole_path[i]!='/' && hole_path[i]!='\\'; i++)
+ path[i] = hole_path[i];
+
+ path[i] = '\0';
+
+ hFind = FindFirstFile(path, &w32fd);
+
+ if (hFind != INVALID_HANDLE_VALUE)
+ FindClose(hFind);
+ else {
+ LOG(FmtString(TEXT("CreateDirectory(\"%s\")"), path));
+
+ if (!CreateDirectory(path, 0))
+ return FALSE;
+ }
+ }
+ } else
+ FindClose(hFind);
+
+ return TRUE;
+}
+
+
+DWORD RegGetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD def)
+{
+ HKEY hkey;
+ DWORD ret;
+
+ if (!RegOpenKey(root, path, &hkey)) {
+ DWORD len = sizeof(ret);
+
+ if (RegQueryValueEx(hkey, valueName, 0, NULL, (LPBYTE)&ret, &len))
+ ret = def;
+
+ RegCloseKey(hkey);
+
+ return ret;
+ } else
+ return def;
+}
+
+
+BOOL RegSetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD value)
+{
+ HKEY hkey;
+ BOOL ret = FALSE;
+
+ if (!RegOpenKey(root, path, &hkey)) {
+ ret = RegSetValueEx(hkey, valueName, 0, REG_DWORD, (LPBYTE)&value, sizeof(value));
+
+ RegCloseKey(hkey);
+ }
+
+ return ret;
+}
+
+
+BOOL exists_path(LPCTSTR path)
+{
+ WIN32_FIND_DATA fd;
+
+ HANDLE hfind = FindFirstFile(path, &fd);
+
+ if (hfind != INVALID_HANDLE_VALUE) {
+ FindClose(hfind);
+
+ return TRUE;
+ } else
+ return FALSE;
+}
+
+
+bool SplitFileSysURL(LPCTSTR url, String& dir_out, String& fname_out)
+{
+ if (!_tcsnicmp(url, TEXT("file://"), 7)) {
+ url += 7;
+
+ // remove third slash in front of drive characters
+ if (*url == '/')
+ ++url;
+ }
+
+ if (exists_path(url)) {
+ TCHAR path[_MAX_PATH];
+
+ // convert slashes to back slashes
+ GetFullPathName(url, COUNTOF(path), path, NULL);
+
+ if (GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY)
+ fname_out.erase();
+ else {
+ TCHAR drv[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
+
+ _tsplitpath_s(path, drv, COUNTOF(drv), dir, COUNTOF(dir), fname, COUNTOF(fname), ext, COUNTOF(ext));
+ _stprintf(path, TEXT("%s%s"), drv, dir);
+
+ fname_out.printf(TEXT("%s%s"), fname, ext);
+ }
+
+ dir_out = path;
+
+ return true;
+ } else
+ return false;
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // utility.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+ // standard windows headers
+#define WIN32_LEAN_AND_MEAN
+#define WIN32_EXTRA_LEAN
+#include <windows.h>
+
+ // Unicode support
+#ifdef UNICODE
+#define _UNICODE
+#endif
+#include <tchar.h>
+
+#include <windowsx.h> // for SelectBrush(), ListBox_SetSel(), SubclassWindow(), ...
+#include <commctrl.h>
+
+#ifndef _MSC_VER
+#include <objbase.h>
+#endif
+#include <oleauto.h> // for VARIANT
+
+#include <malloc.h> // for alloca()
+#include <assert.h>
+#include <stdlib.h> // for _MAX_DIR, ...
+#include <stdio.h> // for sprintf()
+#include <time.h>
+
+#ifndef _MAX_PATH
+#define _MAX_DRIVE 3
+#define _MAX_FNAME 256
+#define _MAX_DIR _MAX_FNAME
+#define _MAX_EXT _MAX_FNAME
+#define _MAX_PATH 260
+#endif
+
+#define W_VER_NT 0 // constant for HIWORD(GetVersion())>>14
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define for if (0) {} else for
+
+#ifdef _countof
+#define COUNTOF _countof
+#else
+#define COUNTOF(x) (sizeof(x)/sizeof(x[0]))
+#endif
+
+
+#define BUFFER_LEN 2048
+
+
+extern void _log_(LPCTSTR txt);
+
+#define LOG(txt) _log_(txt)
+
+
+#ifdef _MSC_VER
+#define LONGLONGARG TEXT("I64")
+#else
+#define LONGLONGARG TEXT("L")
+#endif
+
+
+#ifndef _tcsrchr
+#ifdef UNICODE
+#define _tcsrchr wcsrchr
+#else
+#define _tcsrchr strrchr
+#endif
+#endif
+
+#ifndef _stprintf
+#ifdef UNICODE
+#define _stprintf wcsprintf
+#else
+#define _stprintf sprintf
+#endif
+#endif
+
+#define U2A(s, d, l) WideCharToMultiByte(CP_ACP, 0, s, -1, d, l, NULL, NULL)
+#define U2nA(s, d, l) WideCharToMultiByte(CP_ACP, 0, s, l, d, l, NULL, NULL)
+#define A2U(s, d, l) MultiByteToWideChar(CP_ACP, 0, s, -1, d, l)
+#define A2nU(s, d, l) MultiByteToWideChar(CP_ACP, 0, s, l, d, l)
+
+
+#ifdef __WINE__
+#ifdef UNICODE
+extern void _wsplitpath(const WCHAR* path, WCHAR* drv, WCHAR* dir, WCHAR* name, WCHAR* ext);
+#else
+extern void _splitpath(const CHAR* path, CHAR* drv, CHAR* dir, CHAR* name, CHAR* ext);
+#endif
+#define _tcsnicmp strncasecmp
+#define _tcsicoll strcasecmp
+#endif
+
+#ifndef FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
+#define FILE_ATTRIBUTE_ENCRYPTED 0x00000040
+#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
+#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
+#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
+#endif
+
+
+#define SetDlgCtrlID(hwnd, id) SetWindowLong(hwnd, GWL_ID, id)
+#define SetWindowStyle(hwnd, val) (DWORD)SetWindowLong(hwnd, GWL_STYLE, val)
+#define SetWindowExStyle(h, val) (DWORD)SetWindowLong(hwnd, GWL_EXSTYLE, val)
+#define Window_SetIcon(hwnd, type, hicon) (HICON)SendMessage(hwnd, WM_SETICON, type, (LPARAM)(hicon))
+
+
+ // center window in respect to its parent window
+extern void CenterWindow(HWND hwnd);
+
+ // move window into visibility
+extern void MoveVisible(HWND hwnd);
+
+ // display error message
+extern void display_error(HWND hwnd, DWORD error);
+
+ // convert time_t to WIN32 FILETIME
+extern BOOL time_to_filetime(const time_t* t, FILETIME* ftime);
+
+ // search for windows of a specific classname
+extern int find_window_class(LPCTSTR classname);
+
+ // create a directory with all missing parent directories
+BOOL RecursiveCreateDirectory(LPCTSTR path_in);
+
+ // read DWORD value from registry
+DWORD RegGetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD def);
+
+ // write DWORD value to registry
+BOOL RegSetDWORDValue(HKEY root, LPCTSTR path, LPCTSTR valueName, DWORD value);
+
+ // test for existing directory
+BOOL exists_path(LPCTSTR path);
+
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+
+ // secure CRT functions
+#ifdef __STDC_WANT_SECURE_LIB__ // for VS 2005: _MSC_VER>=1400
+
+#define _stprintf_s1 _stprintf_s
+#define _stprintf_s2 _stprintf_s
+
+#else // __STDC_WANT_SECURE_LIB__
+
+#define strcpy_s(d, l, s) strcpy(d, s)
+#define _tcscpy_s(d, l, s) _tcscpy(d, s)
+#define wcsncpy_s(d, l, s, n) wcsncpy(d, s, n)
+#define _stprintf_s1(b, l, f, p1) _stprintf(b, f, p1)
+#define _stprintf_s2(b, l, f, p1,p2) _stprintf(b, f, p1,p2)
+#define _tsplitpath_s(f, d,dl, p,pl, n,nl, e,el) _tsplitpath(f, d, p, n, e)
+
+#endif // __STDC_WANT_SECURE_LIB__
+
+
+#ifdef __cplusplus
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4786) // disable warnings about too long debug information symbols
+#endif
+
+ // STL headers for strings and streams
+#include <string>
+#include <iostream>
+using namespace std;
+
+ // containers
+#include <map>
+#include <set>
+#include <list>
+#include <stack>
+#include <vector>
+
+
+/* not necessary with correct include file order for comdef.h ("<MS PSDK>\include" path first)
+#if _MSC_VER>=1300 // VS.Net
+#define _NO_COMUTIL
+#endif
+*/
+
+#if defined(_MSC_VER) && !defined(_NO_COMUTIL)
+
+ // COM utility headers
+#include <comdef.h>
+using namespace _com_util;
+
+#endif // _MSC_VER && !_NO_COMUTIL
+
+
+ // launch a program or document file
+extern BOOL launch_file(HWND hwnd, LPCTSTR cmd, UINT nCmdShow=SW_SHOWNORMAL, LPCTSTR parameters=NULL);
+#ifdef UNICODE
+extern BOOL launch_fileA(HWND hwnd, LPSTR cmd, UINT nCmdShow=SW_SHOWNORMAL, LPCSTR parameters=NULL);
+#else
+#define launch_fileA launch_file
+#endif
+
+ // call an DLL export like rundll32
+extern BOOL RunDLL(HWND hwnd, LPCTSTR dllname, LPCSTR procname, LPCTSTR cmdline, UINT nCmdShow);
+
+ // launch control panel applet
+extern BOOL launch_cpanel(HWND hwnd, LPCTSTR applet);
+
+
+ /// initialization of windows common controls
+struct CommonControlInit
+{
+ CommonControlInit(DWORD flags=ICC_LISTVIEW_CLASSES|ICC_TREEVIEW_CLASSES|ICC_BAR_CLASSES|ICC_PROGRESS_CLASS|ICC_COOL_CLASSES)
+ {
+ INITCOMMONCONTROLSEX icc = {sizeof(INITCOMMONCONTROLSEX), flags};
+
+ InitCommonControlsEx(&icc);
+ }
+};
+
+
+ /// wait cursor
+
+struct WaitCursor ///@todo integrate with WM_SETCURSOR to enable multithreaded background tasks as program launching
+{
+ WaitCursor()
+ {
+ _old_cursor = SetCursor(LoadCursor(0, IDC_WAIT));
+ }
+
+ ~WaitCursor()
+ {
+ SetCursor(_old_cursor);
+ }
+
+protected:
+ HCURSOR _old_cursor;
+};
+
+
+ /// base of all structures storing a window handle
+struct WindowHandle
+{
+ WindowHandle(HWND hwnd=0)
+ : _hwnd(hwnd) {}
+
+ operator HWND() const {return _hwnd;}
+ HWND* operator&() {return &_hwnd;}
+
+protected:
+ HWND _hwnd;
+};
+
+
+ /// locally hide a window
+struct HiddenWindow : public WindowHandle
+{
+ HiddenWindow(HWND hwnd)
+ : WindowHandle(IsWindowVisible(hwnd)? hwnd: 0)
+ {
+ if (_hwnd)
+ SetWindowPos(_hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW|SWP_NOREDRAW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
+ }
+
+ ~HiddenWindow()
+ {
+ if (_hwnd)
+ SetWindowPos(_hwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
+ }
+};
+
+
+ /// critical section wrapper
+
+struct CritSect : public CRITICAL_SECTION
+{
+ CritSect()
+ {
+ InitializeCriticalSection(this);
+ }
+
+ ~CritSect()
+ {
+ DeleteCriticalSection(this);
+ }
+};
+
+
+ /// Lock protects a code section utilizing a critical section
+
+struct Lock
+{
+ Lock(CritSect& crit_sect)
+ : _crit_sect(crit_sect)
+ {
+ EnterCriticalSection(&crit_sect);
+ }
+
+ ~Lock()
+ {
+ LeaveCriticalSection(&_crit_sect);
+ }
+
+protected:
+ CritSect& _crit_sect;
+};
+
+
+ /// Thread base class
+
+struct Thread
+{
+ Thread()
+ : _alive(false),
+ _destroy(false)
+ {
+ _hThread = INVALID_HANDLE_VALUE;
+ _evtFinish = CreateEvent(NULL, TRUE, FALSE, NULL);
+ }
+
+ virtual ~Thread()
+ {
+ Stop();
+
+ CloseHandle(_evtFinish);
+ CloseHandle(_hThread);
+
+ if (_destroy)
+ delete this;
+ }
+
+ void Start()
+ {
+ if (!_alive) {
+ _alive = true;
+ _hThread = CreateThread(NULL, 0, ThreadProc, this, 0, NULL);
+ }
+ }
+
+ void Stop()
+ {
+ SetEvent(_evtFinish);
+
+ if (_alive) {
+ {
+ Lock lock(_crit_sect);
+ _alive = false;
+ }
+
+ // wait for finishing
+ WaitForSingleObject(_hThread, INFINITE);
+ }
+ }
+
+ virtual int Run() = 0;
+
+ bool is_alive() const {return _alive;}
+
+ CritSect _crit_sect;
+
+protected:
+ static DWORD WINAPI ThreadProc(void* para);
+
+ HANDLE _hThread;
+ HANDLE _evtFinish;
+ bool _alive;
+ bool _destroy;
+};
+
+
+ // window utilities
+
+ /// ClientRect retreives the client area rectangle of a window.
+struct ClientRect : public RECT
+{
+ ClientRect(HWND hwnd)
+ {
+ GetClientRect(hwnd, this);
+ }
+
+ operator LPRECT() {return this;}
+
+ POINT& pos() {return *(LPPOINT)this;}
+};
+
+ /// ClientRect retreives the window rectangle of a window.
+struct WindowRect : public RECT
+{
+ WindowRect(HWND hwnd)
+ {
+ GetWindowRect(hwnd, this);
+ }
+
+ operator LPRECT() {return this;}
+
+ POINT& pos() {return *(LPPOINT)this;}
+};
+
+ /// PointL encapsulates the POINT structure into a C++ object.
+struct Point : public POINT
+{
+ Point(LONG x_, LONG y_)
+ {
+ x = x_;
+ y = y_;
+ }
+
+ // constructor for being used in processing WM_MOUSEMOVE, WM_LBUTTONDOWN, ... messages
+ Point(LPARAM lparam)
+ {
+ x = GET_X_LPARAM(lparam);
+ y = GET_Y_LPARAM(lparam);
+ }
+
+ operator LPPOINT() {return this;}
+};
+
+
+ /// transform coordinates in a RECT from client to screen coordiantes
+inline void ClientToScreen(HWND hwnd, RECT* prect)
+ {::ClientToScreen(hwnd,(LPPOINT)&prect->left); ::ClientToScreen(hwnd,(LPPOINT)&prect->right);}
+
+ /// transform coordinates in a RECT from screen to client coordiantes
+inline void ScreenToClient(HWND hwnd, RECT* prect)
+ {::ScreenToClient(hwnd,(LPPOINT)&prect->left); ::ScreenToClient(hwnd,(LPPOINT)&prect->right);}
+
+
+ /// structure containing information about full screen display of the frame window
+struct FullScreenParameters
+{
+ FullScreenParameters()
+ : _mode(FALSE)
+ {
+ }
+
+ BOOL _mode;
+ RECT _orgPos;
+ BOOL _wasZoomed;
+};
+
+
+ // drawing utilities
+
+ /// PaintCanvas is a encapsulation of device contexts managed by BeginPaint()/EndPaint().
+struct PaintCanvas : public PAINTSTRUCT
+{
+ PaintCanvas(HWND hwnd)
+ : _hwnd(hwnd)
+ {
+ BeginPaint(hwnd, this);
+ }
+
+ ~PaintCanvas()
+ {
+ EndPaint(_hwnd, this);
+ }
+
+ operator HDC() const {return hdc;}
+
+protected:
+ HWND _hwnd;
+};
+
+ /// Canvas is a encapsulation of device contexts.
+struct Canvas
+{
+ Canvas(HDC hdc) : _hdc(hdc) {}
+
+ operator HDC() {return _hdc;}
+
+protected:
+ HDC _hdc;
+};
+
+ /// WindowCanvas is a encapsulation of client area device contexts.
+struct WindowCanvas : public Canvas
+{
+ WindowCanvas(HWND hwnd)
+ : Canvas(GetDC(hwnd)), _hwnd(hwnd) {}
+
+ ~WindowCanvas() {ReleaseDC(_hwnd, _hdc);}
+
+protected:
+ HWND _hwnd;
+};
+
+
+ // double buffering classes
+
+ /// Memory Canvas creates and destroys memory devoce contexts.
+struct MemCanvas : public Canvas
+{
+ MemCanvas(HDC hdc=0)
+ : Canvas(CreateCompatibleDC(hdc)) {assert(_hdc);}
+
+ ~MemCanvas() {DeleteDC(_hdc);}
+};
+
+ /// SelectedBitmap is used to localy select bitmaps into device contexts.
+struct SelectedBitmap
+{
+ SelectedBitmap(HDC hdc, HBITMAP hbmp)
+ : _hdc(hdc), _old_hbmp(SelectBitmap(hdc, hbmp)) {}
+
+ ~SelectedBitmap() {DeleteObject(SelectBitmap(_hdc, _old_hbmp));}
+
+protected:
+ HDC _hdc;
+ HBITMAP _old_hbmp;
+};
+
+ /// BufferCanvas manages offscreen bitmaps selected into memory device contexts.
+struct BufferCanvas : public MemCanvas
+{
+ BufferCanvas(HDC hdc, int x, int y, int w, int h)
+ : MemCanvas(hdc), _hdctarg(hdc),
+ _x(x), _y(y), _w(w), _h(h),
+ _bmp(_hdc, CreateCompatibleBitmap(hdc, w, h)) {}
+
+ BufferCanvas(HDC hdc, const RECT& rect)
+ : MemCanvas(hdc), _hdctarg(hdc),
+ _x(rect.left), _y(rect.top), _w(rect.right-rect.left), _h(rect.bottom-rect.top),
+ _bmp(_hdc, CreateCompatibleBitmap(hdc, _w, _h)) {}
+
+protected:
+ HDC _hdctarg;
+ int _x, _y, _w, _h;
+ SelectedBitmap _bmp;
+};
+
+ /// BufferedCanvas enables double buffering for a device context.
+struct BufferedCanvas : public BufferCanvas
+{
+ BufferedCanvas(HDC hdc, int x, int y, int w, int h, DWORD mode=SRCCOPY)
+ : BufferCanvas(hdc, x, y, w, h), _mode(mode) {}
+
+ BufferedCanvas(HDC hdc, const RECT& rect, DWORD mode=SRCCOPY)
+ : BufferCanvas(hdc, rect), _mode(mode) {}
+
+ ~BufferedCanvas() {BitBlt(_hdctarg, _x, _y, _w, _h, _hdc, 0, 0, _mode);}
+
+ DWORD _mode;
+};
+
+ /// BufferedPaintCanvas extends PaintCanvas for double buffering.
+struct BufferedPaintCanvas : public PaintCanvas, public BufferedCanvas
+{
+ BufferedPaintCanvas(HWND hwnd)
+ : PaintCanvas(hwnd),
+ BufferedCanvas(PAINTSTRUCT::hdc, 0, 0, rcPaint.right, rcPaint.bottom)
+ {
+ }
+
+ operator HDC() {return BufferedCanvas::_hdc;}
+};
+
+
+ /// TextColor locally selects a text color for drawing.
+struct TextColor
+{
+ TextColor(HDC hdc, COLORREF color)
+ : _hdc(hdc), _old_color(SetTextColor(hdc, color)) {}
+
+ ~TextColor() {SetTextColor(_hdc, _old_color);}
+
+protected:
+ HDC _hdc;
+ COLORREF _old_color;
+};
+
+ /// BkMode locally sets the background mode for drawing.
+struct BkMode
+{
+ BkMode(HDC hdc, int bkmode)
+ : _hdc(hdc), _old_bkmode(SetBkMode(hdc, bkmode)) {}
+
+ ~BkMode() {SetBkMode(_hdc, _old_bkmode);}
+
+protected:
+ HDC _hdc;
+ COLORREF _old_bkmode;
+};
+
+ /// FontSelection locally selects a font for drawing.
+struct FontSelection
+{
+ FontSelection(HDC hdc, HFONT hFont)
+ : _hdc(hdc), _old_hFont(SelectFont(hdc, hFont)) {}
+
+ ~FontSelection() {SelectFont(_hdc, _old_hFont);}
+
+protected:
+ HDC _hdc;
+ HFONT _old_hFont;
+};
+
+ /// BitmapSelection locally selects a bitmap into a device context.
+struct BitmapSelection
+{
+ BitmapSelection(HDC hdc, HBITMAP hBmp)
+ : _hdc(hdc), _old_hBmp(SelectBitmap(hdc, hBmp)) {}
+
+ ~BitmapSelection() {SelectBitmap(_hdc, _old_hBmp);}
+
+protected:
+ HDC _hdc;
+ HBITMAP _old_hBmp;
+};
+
+ /// BrushSelection locally selects a brush into a device context.
+struct BrushSelection
+{
+ BrushSelection(HDC hdc, HBRUSH hBrush)
+ : _hdc(hdc), _old_hBrush(SelectBrush(hdc, hBrush)) {}
+
+ ~BrushSelection() {SelectBrush(_hdc, _old_hBrush);}
+
+protected:
+ HDC _hdc;
+ HBRUSH _old_hBrush;
+};
+
+
+ /// Popup Menus
+struct PopupMenu
+{
+ PopupMenu()
+ : _hmenu(CreatePopupMenu())
+ {
+ }
+
+ PopupMenu(UINT nid);
+
+ operator HMENU() {return _hmenu;}
+
+ void Append(UINT id, LPCTSTR str, UINT flags=MF_STRING)
+ {
+ AppendMenu(_hmenu, flags, id, str);
+ }
+
+ int TrackPopupMenu(HWND hwnd, const POINT& pt, UINT flags=TPM_LEFTBUTTON|TPM_RIGHTBUTTON, LPTPMPARAMS tpm=NULL) {
+ return TrackPopupMenuEx(_hmenu, flags, pt.x, pt.y, hwnd, tpm);
+ }
+
+ int PopupContextMenu(HWND hwnd, POINTS pos, UINT flags=TPM_LEFTBUTTON|TPM_RIGHTBUTTON) {
+ POINT pt; POINTSTOPOINT(pt, pos);
+ return TrackPopupMenuEx(_hmenu, flags, pt.x, pt.y, hwnd, NULL);
+ }
+
+ int TrackPopupMenu(HWND hwnd, POINTS pos, UINT flags=TPM_LEFTBUTTON|TPM_RIGHTBUTTON) {
+ POINT pt; POINTSTOPOINT(pt, pos);
+ ClientToScreen(hwnd, &pt);
+ return TrackPopupMenuEx(_hmenu, flags, pt.x, pt.y, hwnd, NULL);
+ }
+
+ int TrackPopupMenuAtCursor(HWND hwnd, UINT flags=TPM_LEFTBUTTON) {
+ POINT pt; GetCursorPos(&pt);
+ return TrackPopupMenuEx(_hmenu, flags, pt.x, pt.y, hwnd, NULL);
+ }
+
+ int TrackPopupMenuAtPos(HWND hwnd, DWORD pos, UINT flags=TPM_LEFTBUTTON) {
+ return TrackPopupMenuEx(_hmenu, flags, GET_X_LPARAM(pos), GET_Y_LPARAM(pos), hwnd, NULL);
+ }
+
+protected:
+ HMENU _hmenu;
+};
+
+
+struct Variant : public VARIANT
+{
+ Variant() {VariantInit(this);}
+ Variant(const VARIANT& var);
+ Variant(const VARIANT* var);
+ ~Variant();
+
+ operator long() const;
+ operator bool() const;
+ operator VARIANT_BOOL() const;
+ operator IDispatch*() const;
+};
+
+
+struct BStr
+{
+ BStr()
+ {
+ _p = NULL;
+ }
+
+ BStr(const BSTR s)
+ {
+ _p = SysAllocString(s);
+ }
+
+ BStr(LPCSTR s)
+ {
+ WCHAR b[BUFFER_LEN];
+
+ if (s)
+ _p = SysAllocStringLen(b, MultiByteToWideChar(CP_ACP, 0, s, -1, b, BUFFER_LEN)-1);
+ else
+ _p = NULL;
+ }
+
+ BStr(LPCWSTR s)
+ {
+ _p = SysAllocString(s);
+ }
+
+ BStr(const VARIANT& var)
+ : _p(NULL)
+ {
+ assign(var);
+ }
+
+ ~BStr()
+ {
+ SysFreeString(_p);
+ }
+
+ void assign(BSTR s);
+ void assign(const VARIANT& var);
+
+ operator BSTR() const
+ {
+ return _p? _p: (BSTR)L"";
+ }
+
+ int length() const
+ {
+ return _p? wcslen(_p): 0;
+ }
+
+protected:
+ BSTR _p;
+};
+
+
+ /// string class for TCHAR strings
+struct String
+#ifdef UNICODE
+ : public wstring
+#else
+ : public string
+#endif
+{
+#ifdef UNICODE
+ typedef wstring super;
+#else
+ typedef string super;
+#endif
+
+ String() {}
+
+ String(LPCTSTR s) {if (s) super::assign(s);}
+ String(LPCTSTR s, int l) : super(s, l) {}
+
+ String(const super& other) : super(other) {}
+ String(const String& other) : super(other) {}
+
+#ifdef UNICODE
+ String(LPCSTR s) {assign(s);}
+ String(LPCSTR s, int l) {assign(s, l);}
+ String(const string& other) {assign(other.c_str());}
+ String& operator=(LPCSTR s) {assign(s); return *this;}
+ void assign(LPCSTR s) {if (s) {TCHAR b[BUFFER_LEN]; super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, -1, b, BUFFER_LEN)-1);} else erase();}
+ void assign(LPCSTR s, int l) {if (s) {TCHAR b[BUFFER_LEN]; super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, l, b, BUFFER_LEN));} else erase();}
+ void assign(const BStr& s) {int l = s.length(); super::assign(s, l);}
+#else
+ String(LPCWSTR s) {assign(s);}
+ String(LPCWSTR s, int l) {assign(s, l);}
+ String(const wstring& other) {assign(other.c_str());}
+ String& operator=(LPCWSTR s) {assign(s); return *this;}
+ void assign(LPCWSTR s) {if (s) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, -1, b, BUFFER_LEN, 0, 0)-1);} else erase();}
+ void assign(LPCWSTR s, int l) {if (s) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, l, b, BUFFER_LEN, 0, 0));} else erase();}
+ void assign(const BStr& s) {int l = s.length(); if (l) {char b[BUFFER_LEN]; super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, l, b, BUFFER_LEN, 0, 0));} else erase();}
+#endif
+ String(const BStr& s) {assign(s);}
+ String& operator=(const BStr& s) {assign(s); return *this;}
+
+ String& operator=(LPCTSTR s) {if (s) super::assign(s); else erase(); return *this;}
+ String& operator=(const super& s) {super::assign(s); return *this;}
+ void assign(LPCTSTR s) {super::assign(s);}
+ void assign(LPCTSTR s, int l) {super::assign(s, l);}
+
+ operator LPCTSTR() const {return c_str();}
+
+#ifdef UNICODE
+ operator string() const {char b[BUFFER_LEN]; return string(b, WideCharToMultiByte(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN, 0, 0)-1);}
+#else
+ operator wstring() const {WCHAR b[BUFFER_LEN]; return wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), -1, b, BUFFER_LEN)-1);}
+#endif
+
+ LPTSTR str() {return (LPTSTR)data();} /// return modifyable character string pointer
+
+ String& printf(LPCTSTR fmt, ...)
+ {
+ va_list l;
+ TCHAR b[BUFFER_LEN];
+
+ va_start(l, fmt);
+ super::assign(b, _vsntprintf(b, COUNTOF(b), fmt, l));
+ va_end(l);
+
+ return *this;
+ }
+
+ String& vprintf(LPCTSTR fmt, va_list l)
+ {
+ TCHAR b[BUFFER_LEN];
+
+ super::assign(b, _vsntprintf(b, COUNTOF(b), fmt, l));
+
+ return *this;
+ }
+
+ String& appendf(LPCTSTR fmt, ...)
+ {
+ va_list l;
+ TCHAR b[BUFFER_LEN];
+
+ va_start(l, fmt);
+ super::append(b, _vsntprintf(b, COUNTOF(b), fmt, l));
+ va_end(l);
+
+ return *this;
+ }
+
+ String& vappendf(LPCTSTR fmt, va_list l)
+ {
+ TCHAR b[BUFFER_LEN];
+
+ super::append(b, _vsntprintf(b, COUNTOF(b), fmt, l));
+
+ return *this;
+ }
+
+ void toLower()
+ {
+ if (!empty())
+ CharLower(str());
+ }
+};
+
+#define _STRING_DEFINED
+
+
+struct FmtString : public String
+{
+ FmtString(LPCTSTR fmt, ...)
+ {
+ va_list l;
+
+ va_start(l, fmt);
+ vprintf(fmt, l);
+ va_end(l);
+ }
+};
+
+
+#ifdef UNICODE
+
+struct ANS
+{
+ ANS(LPCWSTR s)
+ {
+ int l = wcslen(s) + 1;
+ _str = (LPSTR) malloc(2*l);
+
+ if (WideCharToMultiByte(CP_ACP, 0, s, -1, _str, 2*l, 0, 0) <= 0)
+ *_str = '\0';
+ }
+
+ ~ANS()
+ {
+ free(_str);
+ }
+
+ operator LPCSTR() {return _str;}
+
+protected:
+ LPSTR _str;
+};
+
+#define UNC(x) ((LPCWSTR)(x))
+
+#else
+
+#define ANS(x) ((LPCSTR)(x))
+
+struct UNC
+{
+ UNC(LPCSTR s)
+ {
+ int l = strlen(s) + 1;
+ _str = (LPWSTR) malloc(2*l);
+
+ if (_str && MultiByteToWideChar(CP_ACP, 0, s, -1, _str, l) <= 0)
+ *_str = '\0';
+ }
+
+ ~UNC()
+ {
+ free(_str);
+ }
+
+ operator LPCWSTR() {return _str;}
+
+protected:
+ LPWSTR _str;
+};
+
+#endif
+
+
+ // determine windows version string
+String get_windows_version_str();
+
+
+ /// link dynamicly to functions by using GetModuleHandle() and GetProcAddress()
+template<typename FCT> struct DynamicFct
+{
+ DynamicFct(LPCTSTR moduleName, UINT ordinal)
+ {
+ HMODULE hModule = GetModuleHandle(moduleName);
+
+ _fct = (FCT) GetProcAddress(hModule, (LPCSTR)ordinal);
+ }
+
+ DynamicFct(LPCTSTR moduleName, LPCSTR name)
+ {
+ HMODULE hModule = GetModuleHandle(moduleName);
+
+ _fct = (FCT) GetProcAddress(hModule, name);
+ }
+
+ FCT operator*() const {return _fct;}
+ operator bool() const {return _fct? true: false;}
+
+protected:
+ FCT _fct;
+};
+
+
+ /// link dynamicly to functions by using LoadLibrary() and GetProcAddress()
+template<typename FCT> struct DynamicLoadLibFct
+{
+ DynamicLoadLibFct(LPCTSTR moduleName, UINT ordinal)
+ {
+ _hModule = LoadLibrary(moduleName);
+
+ _fct = (FCT) GetProcAddress(_hModule, (LPCSTR)ordinal);
+ }
+
+ DynamicLoadLibFct(LPCTSTR moduleName, LPCSTR name)
+ {
+ _hModule = LoadLibrary(moduleName);
+
+ _fct = (FCT) GetProcAddress(_hModule, name);
+ }
+
+ ~DynamicLoadLibFct()
+ {
+ FreeLibrary(_hModule);
+ }
+
+ FCT operator*() const {return _fct;}
+ operator bool() const {return _fct? true: false;}
+
+protected:
+ HMODULE _hModule;
+ FCT _fct;
+};
+
+
+struct Context
+{
+ Context(const char* ctx)
+ : _ctx(ctx)
+ {
+ _last = s_current;
+ s_current = this;
+ }
+
+ Context(const char* ctx, LPCSTR obj)
+ : _ctx(ctx),
+ _obj(obj)
+ {
+ _last = s_current;
+ s_current = this;
+ }
+
+ Context(const char* ctx, LPCWSTR obj)
+ : _ctx(ctx),
+ _obj(obj)
+ {
+ _last = s_current;
+ s_current = this;
+ }
+
+ Context(const Context& other)
+ : _ctx(other._ctx),
+ _obj(other._obj)
+ {
+ _last = NULL;
+ }
+
+ ~Context()
+ {
+ if (_last) {
+ s_current = _last;
+ _last = NULL;
+ }
+ }
+
+ String toString() const;
+ String getStackTrace() const;
+
+ const char* _ctx;
+ String _obj;
+
+ static Context& current() {return *s_current;}
+
+protected:
+ Context* _last;
+
+ static Context* s_current; ///@todo use TLS
+ static Context s_main;
+};
+
+#define CONTEXT_OBJ __ctx__._obj
+#define CONTEXT(c) Context __ctx__(c)
+#define CURRENT_CONTEXT Context::current()
+#define OBJ_CONTEXT(c, o) Context __ctx__(c, o)
+
+
+extern bool SplitFileSysURL(LPCTSTR url, String& dir_out, String& fname_out);
+
+
+#endif // __cplusplus
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // window.cpp
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+#include <precomp.h>
+
+#include "../resource.h" // for ID_GO_BACK, ...
+
+
+WindowClass::WindowClass(LPCTSTR classname, UINT style_, WNDPROC wndproc)
+{
+ memset(this, 0, sizeof(WNDCLASSEX));
+
+ cbSize = sizeof(WNDCLASSEX);
+ style = style_;
+ hInstance = g_Globals._hInstance;
+ hCursor = LoadCursor(0, IDC_ARROW);
+
+ lpszClassName = classname;
+ lpfnWndProc = wndproc;
+
+ _atomClass = 0;
+}
+
+
+IconWindowClass::IconWindowClass(LPCTSTR classname, UINT nid, UINT style, WNDPROC wndproc)
+ : WindowClass(classname, style, wndproc)
+{
+ hIcon = ResIcon(nid);
+ hIconSm = SmallIcon(nid);
+}
+
+
+Window::WindowMap Window::s_wnd_map;
+
+Window::CREATORFUNC Window::s_window_creator = NULL;
+const void* Window::s_new_info = NULL;
+
+HHOOK Window::s_hcbtHook = 0;
+
+
+Window::StaticWindowData& Window::GetStaticWindowData()
+{
+ static StaticWindowData s_initialized_data;
+
+ return s_initialized_data;
+}
+
+
+Window::Window(HWND hwnd)
+ : WindowHandle(hwnd)
+{
+ Lock lock(GetStaticWindowData()._map_crit_sect); // protect access to s_wnd_map
+
+ s_wnd_map[_hwnd] = this;
+}
+
+Window::~Window()
+{
+ Lock lock(GetStaticWindowData()._map_crit_sect); // protect access to s_wnd_map
+
+ s_wnd_map.erase(_hwnd);
+}
+
+
+HWND Window::Create(CREATORFUNC creator, DWORD dwExStyle,
+ LPCTSTR lpClassName, LPCTSTR lpWindowName,
+ DWORD dwStyle, int x, int y, int w, int h,
+ HWND hwndParent, HMENU hMenu/*, LPVOID lpParam*/)
+{
+ Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info
+
+ s_window_creator = creator;
+ s_new_info = NULL;
+
+ return CreateWindowEx(dwExStyle, lpClassName, lpWindowName, dwStyle,
+ x, y, w, h,
+ hwndParent, hMenu, g_Globals._hInstance, 0/*lpParam*/);
+}
+
+HWND Window::Create(CREATORFUNC_INFO creator, const void* info, DWORD dwExStyle,
+ LPCTSTR lpClassName, LPCTSTR lpWindowName,
+ DWORD dwStyle, int x, int y, int w, int h,
+ HWND hwndParent, HMENU hMenu/*, LPVOID lpParam*/)
+{
+ Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info
+
+ s_window_creator = (CREATORFUNC) creator;
+ s_new_info = info;
+
+ return CreateWindowEx(dwExStyle, lpClassName, lpWindowName, dwStyle,
+ x, y, w, h,
+ hwndParent, hMenu, g_Globals._hInstance, 0/*lpParam*/);
+}
+
+
+Window* Window::create_mdi_child(const ChildWndInfo& info, const MDICREATESTRUCT& mcs, CREATORFUNC_INFO creator)
+{
+ Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info
+
+ s_window_creator = (CREATORFUNC) creator;
+ s_new_info = &info;
+
+ s_hcbtHook = SetWindowsHookEx(WH_CBT, MDICBTHookProc, 0, GetCurrentThreadId());
+
+ HWND hwnd = (HWND) SendMessage(info._hmdiclient, WM_MDICREATE, 0, (LPARAM)&mcs);
+
+ UnhookWindowsHookEx(s_hcbtHook);
+
+ Window* child = get_window(hwnd);
+ s_new_info = NULL;
+
+ if (child && (!hwnd || !child->_hwnd))
+ child = NULL;
+
+ return child;
+}
+
+LRESULT CALLBACK Window::MDICBTHookProc(int code, WPARAM wparam, LPARAM lparam)
+{
+ if (code == HCBT_CREATEWND) {
+ HWND hwnd = (HWND)wparam;
+
+ // create Window controller and associate it with the window handle
+ Window* child = get_window(hwnd);
+
+ if (!child)
+ child = create_controller(hwnd);
+ }
+
+ return CallNextHookEx(s_hcbtHook, code, wparam, lparam);
+}
+
+
+/*
+Window* Window::create_property_sheet(PropertySheetDialog* ppsd, CREATORFUNC creator, const void* info)
+{
+ Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info
+
+ s_window_creator = creator;
+ s_new_info = info;
+
+ s_hcbtHook = SetWindowsHookEx(WH_CBT, PropSheetCBTHookProc, 0, GetCurrentThreadId());
+
+ HWND hwnd = (HWND) PropertySheet(ppsd);
+
+ UnhookWindowsHookEx(s_hcbtHook);
+
+ Window* child = get_window(hwnd);
+ s_new_info = NULL;
+
+ if (child && (!hwnd || !child->_hwnd))
+ child = NULL;
+
+ return child;
+}
+*/
+
+LRESULT CALLBACK Window::PropSheetCBTHookProc(int code, WPARAM wparam, LPARAM lparam)
+{
+ if (code == HCBT_CREATEWND) {
+ HWND hwnd = (HWND)wparam;
+
+ // create Window controller and associate it with the window handle
+ Window* child = get_window(hwnd);
+
+ if (!child)
+ child = create_controller(hwnd);
+ }
+
+ return CallNextHookEx(s_hcbtHook, code, wparam, lparam);
+}
+
+
+ /// get window controller from window handle
+
+Window* Window::get_window(HWND hwnd)
+{
+ {
+ Lock lock(GetStaticWindowData()._map_crit_sect); // protect access to s_wnd_map
+
+ WindowMap::const_iterator found = s_wnd_map.find(hwnd);
+
+ if (found!=s_wnd_map.end())
+ return found->second;
+ }
+
+ return NULL;
+}
+
+
+ /// create controller for a new window
+
+Window* Window::create_controller(HWND hwnd)
+{
+ if (s_window_creator) { // protect for recursion and create the window object only for the first window
+ Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info
+
+ const void* info = s_new_info;
+ s_new_info = NULL;
+
+ CREATORFUNC window_creator = s_window_creator;
+ s_window_creator = NULL;
+
+ if (info)
+ return CREATORFUNC_INFO(window_creator)(hwnd, info);
+ else
+ return CREATORFUNC(window_creator)(hwnd);
+ }
+
+ return NULL;
+}
+
+
+LRESULT Window::Init(LPCREATESTRUCT pcs)
+{
+ return 0;
+}
+
+
+LRESULT CALLBACK Window::WindowWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ Window* pThis = get_window(hwnd);
+
+ if (!pThis)
+ pThis = create_controller(hwnd);
+
+ if (pThis) {
+ switch(nmsg) {
+ case WM_COMMAND:
+ return pThis->Command(LOWORD(wparam), HIWORD(wparam));
+
+ case WM_NOTIFY:
+ return pThis->Notify(wparam, (NMHDR*)lparam);
+
+ case WM_NOTIFYFORMAT:
+ return NFR_CURRENT;
+
+ case WM_CREATE:
+ return pThis->Init((LPCREATESTRUCT)lparam);
+
+ case WM_NCDESTROY:
+ delete pThis;
+ return 0;
+
+ default:
+ return pThis->WndProc(nmsg, wparam, lparam);
+ }
+ }
+ else
+ return DefWindowProc(hwnd, nmsg, wparam, lparam);
+}
+
+LRESULT Window::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ return DefWindowProc(_hwnd, nmsg, wparam, lparam);
+}
+
+int Window::Command(int id, int code)
+{
+ return 1; // no command handler found
+}
+
+int Window::Notify(int id, NMHDR* pnmh)
+{
+ return 0;
+}
+
+void Window::CancelModes()
+{
+ PostMessage(HWND_BROADCAST, WM_CANCELMODE, 0, 0);
+}
+
+
+SubclassedWindow::SubclassedWindow(HWND hwnd)
+ : super(hwnd)
+{
+ _orgWndProc = SubclassWindow(_hwnd, SubclassedWndProc);
+
+ if (!_orgWndProc)
+ delete this;
+}
+
+LRESULT CALLBACK SubclassedWindow::SubclassedWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ SubclassedWindow* pThis = GET_WINDOW(SubclassedWindow, hwnd);
+ assert(pThis);
+
+ if (pThis) {
+ switch(nmsg) {
+ case WM_COMMAND:
+ if (!pThis->Command(LOWORD(wparam), HIWORD(wparam)))
+ return 0;
+ break;
+
+ case WM_NOTIFY:
+ return pThis->Notify(wparam, (NMHDR*)lparam);
+
+ case WM_NOTIFYFORMAT:
+ return NFR_CURRENT;
+
+ case WM_CREATE:
+ return pThis->Init((LPCREATESTRUCT)lparam);
+
+ case WM_NCDESTROY:
+ delete pThis;
+ return 0;
+
+ default:
+ return pThis->WndProc(nmsg, wparam, lparam);
+ }
+ }
+
+ return CallWindowProc(pThis->_orgWndProc, hwnd, nmsg, wparam, lparam);
+}
+
+LRESULT SubclassedWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ return CallWindowProc(_orgWndProc, _hwnd, nmsg, wparam, lparam);
+}
+
+int SubclassedWindow::Command(int id, int code)
+{
+ return 1; // no command handler found
+}
+
+int SubclassedWindow::Notify(int id, NMHDR* pnmh)
+{
+ return CallWindowProc(_orgWndProc, _hwnd, WM_NOTIFY, id, (LPARAM)pnmh);
+}
+
+
+ChildWindow::ChildWindow(HWND hwnd, const ChildWndInfo& info)
+ : super(hwnd),
+ _hwndFrame(GetParent(info._hmdiclient))
+{
+ _focus_pane = 0;
+ _split_pos = DEFAULT_SPLIT_POS;
+ _last_split = DEFAULT_SPLIT_POS;
+}
+
+
+ChildWindow* ChildWindow::create(const ChildWndInfo& info, const RECT& rect, CREATORFUNC_INFO creator,
+ LPCTSTR classname, LPCTSTR title, DWORD style)
+{
+ MDICREATESTRUCT mcs;
+
+ mcs.szClass = classname;
+ mcs.szTitle = title;
+ mcs.hOwner = g_Globals._hInstance;
+ mcs.x = rect.left,
+ mcs.y = rect.top;
+ mcs.cx = rect.right - rect.left;
+ mcs.cy = rect.bottom - rect.top;
+ mcs.style = style;
+ mcs.lParam = 0;
+
+ return static_cast<ChildWindow*>(create_mdi_child(info, mcs, creator));
+}
+
+
+LRESULT ChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_PAINT: {
+ RECT rc;
+ PaintCanvas canvas(_hwnd);
+ ClientRect rt(_hwnd);
+ rt.left = _split_pos-SPLIT_WIDTH/2;
+ rt.right = _split_pos+SPLIT_WIDTH/2+1;
+ HBRUSH lastBrush = SelectBrush(canvas, GetStockBrush(LTGRAY_BRUSH));
+ Rectangle(canvas, rt.left, rt.top-1, rt.right, rt.bottom+1);
+ SetRect(&rc, rt.left, rt.top-1, rt.right, rt.bottom+1);
+ DrawEdge(canvas, &rc, EDGE_RAISED, BF_RECT);
+ SelectObject(canvas, lastBrush);
+ break;}
+
+ case WM_SETCURSOR:
+ if (LOWORD(lparam) == HTCLIENT) {
+ POINT pt;
+ GetCursorPos(&pt);
+ ScreenToClient(_hwnd, &pt);
+
+ if (pt.x>=_split_pos-SPLIT_WIDTH/2 && pt.x<_split_pos+SPLIT_WIDTH/2+1) {
+ SetCursor(LoadCursor(0, IDC_SIZEWE));
+ return TRUE;
+ }
+ }
+ goto def;
+
+ case WM_SIZE:
+ if (wparam != SIZE_MINIMIZED)
+ resize_children(LOWORD(lparam), HIWORD(lparam));
+ goto def;
+
+ case WM_GETMINMAXINFO:
+ DefMDIChildProc(_hwnd, nmsg, wparam, lparam);
+
+ {LPMINMAXINFO lpmmi = (LPMINMAXINFO)lparam;
+
+ lpmmi->ptMaxTrackSize.x <<= 1; // 2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN
+ lpmmi->ptMaxTrackSize.y <<= 1; // 2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN
+ break;}
+
+ case WM_LBUTTONDOWN: {
+ int x = GET_X_LPARAM(lparam);
+
+ ClientRect rt(_hwnd);
+
+ if (x>=_split_pos-SPLIT_WIDTH/2 && x<_split_pos+SPLIT_WIDTH/2+1) {
+ _last_split = _split_pos;
+ SetCapture(_hwnd);
+ }
+
+ break;}
+
+ case WM_LBUTTONUP:
+ if (GetCapture() == _hwnd)
+ ReleaseCapture();
+ break;
+
+ case WM_KEYDOWN:
+ if (wparam == VK_ESCAPE)
+ if (GetCapture() == _hwnd) {
+ _split_pos = _last_split;
+ ClientRect rt(_hwnd);
+ resize_children(rt.right, rt.bottom);
+ _last_split = -1;
+ ReleaseCapture();
+ SetCursor(LoadCursor(0, IDC_ARROW));
+ }
+ break;
+
+ case WM_MOUSEMOVE:
+ if (GetCapture() == _hwnd) {
+ int x = GET_X_LPARAM(lparam);
+
+ ClientRect rt(_hwnd);
+
+ if (x>=0 && x<rt.right) {
+ _split_pos = x;
+ resize_children(rt.right, rt.bottom);
+ rt.left = x-SPLIT_WIDTH/2;
+ rt.right = x+SPLIT_WIDTH/2+1;
+ InvalidateRect(_hwnd, &rt, FALSE);
+ UpdateWindow(_left_hwnd);
+ UpdateWindow(_hwnd);
+ UpdateWindow(_right_hwnd);
+ }
+ }
+ break;
+
+ case PM_DISPATCH_COMMAND:
+ switch(LOWORD(wparam)) {
+ case ID_GO_BACK:
+ if (!_url_history.empty()) {
+ const String& url = jump_to_int(_url_history.top());
+
+ if (jump_to_int(url))
+ set_url(url);
+
+ _url_history.pop();
+ }
+ break;
+
+ case ID_GO_FORWARD:
+ //@@
+ break;
+
+ case ID_GO_UP:
+ ///@todo
+ break;
+
+ case ID_GO_HOME:
+ //@@
+ break;
+
+ default:
+ return FALSE;
+ }
+ return TRUE;
+
+ case WM_MDIACTIVATE:
+ if ((HWND)lparam == _hwnd) {
+ SendMessage(_hwndFrame, PM_SETSTATUSTEXT, 0, (LPARAM)_statusText.c_str());
+ SendMessage(_hwndFrame, PM_URL_CHANGED, 0, (LPARAM)_url.c_str());
+ }
+ break;
+
+ case PM_JUMP_TO_URL:
+ return go_to((LPCTSTR)lparam)? TRUE: FALSE;
+
+ default: def:
+ return DefMDIChildProc(_hwnd, nmsg, wparam, lparam);
+ }
+
+ return 0;
+}
+
+
+void ChildWindow::resize_children(int cx, int cy)
+{
+ HDWP hdwp = BeginDeferWindowPos(2);
+ RECT rt;
+
+ rt.left = 0;
+ rt.top = 0;
+ rt.right = cx;
+ rt.bottom = cy;
+
+ if (_left_hwnd) {
+ cx = _split_pos + SPLIT_WIDTH/2;
+
+ hdwp = DeferWindowPos(hdwp, _left_hwnd, 0, rt.left, rt.top, _split_pos-SPLIT_WIDTH/2-rt.left, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE);
+ } else {
+ _split_pos = 0;
+ cx = 0;
+ }
+
+ if (_right_hwnd)
+ hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, rt.left+cx+1, rt.top, rt.right-cx, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE);
+
+ EndDeferWindowPos(hdwp);
+}
+
+
+bool ChildWindow::go_to(LPCTSTR url)
+{
+ const String& url_str = jump_to_int(url);
+
+ if (!url_str.empty()) {
+ set_url(url_str);
+
+ _url_history.push(url_str);
+
+ return true;
+ } else
+ return false;
+}
+
+void ChildWindow::set_url(LPCTSTR url)
+{
+ if (_url != url) {
+ _url = url;
+
+ SendMessage(_hwndFrame, PM_URL_CHANGED, 0, (LPARAM)url);
+ }
+}
+
+
+WindowSet Window::s_pretranslate_windows;
+
+void Window::register_pretranslate(HWND hwnd)
+{
+ s_pretranslate_windows.insert(hwnd);
+}
+
+void Window::unregister_pretranslate(HWND hwnd)
+{
+ s_pretranslate_windows.erase(hwnd);
+}
+
+BOOL Window::pretranslate_msg(LPMSG pmsg)
+{
+ for(WindowSet::const_iterator it=Window::s_pretranslate_windows.begin(); it!=s_pretranslate_windows.end(); ++it)
+ if (SendMessage(*it, PM_TRANSLATE_MSG, 0, (LPARAM)pmsg))
+ return TRUE;
+
+ return FALSE;
+}
+
+
+WindowSet Window::s_dialogs;
+
+void Window::register_dialog(HWND hwnd)
+{
+ s_dialogs.insert(hwnd);
+}
+
+void Window::unregister_dialog(HWND hwnd)
+{
+ s_dialogs.erase(hwnd);
+}
+
+BOOL Window::dispatch_dialog_msg(MSG* pmsg)
+{
+ for(WindowSet::const_iterator it=Window::s_dialogs.begin(); it!=s_dialogs.end(); ++it)
+ if (IsDialogMessage(*it, pmsg))
+ return TRUE;
+
+ return FALSE;
+}
+
+
+int Window::MessageLoop()
+{
+ MSG msg;
+
+ while(GetMessage(&msg, 0, 0, 0)) {
+ try {
+ if (pretranslate_msg(&msg))
+ continue;
+
+ if (dispatch_dialog_msg(&msg))
+ continue;
+
+ TranslateMessage(&msg);
+
+ try {
+ DispatchMessage(&msg);
+ } catch(COMException& e) {
+ HandleException(e, 0);
+ }
+ } catch(COMException& e) {
+ HandleException(e, 0);
+ }
+ }
+
+ return msg.wParam;
+}
+
+
+LRESULT Window::SendParent(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ HWND parent = GetParent(_hwnd);
+
+ if (!parent)
+ return 0;
+
+ return SendMessage(parent, nmsg, wparam, lparam);
+}
+
+LRESULT Window::PostParent(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ HWND parent = GetParent(_hwnd);
+
+ if (!parent)
+ return 0;
+
+ return PostMessage(parent, nmsg, wparam, lparam);
+}
+
+
+PreTranslateWindow::PreTranslateWindow(HWND hwnd)
+ : super(hwnd)
+{
+ register_pretranslate(hwnd);
+}
+
+PreTranslateWindow::~PreTranslateWindow()
+{
+ unregister_pretranslate(_hwnd);
+}
+
+
+Dialog::Dialog(HWND hwnd)
+ : super(hwnd)
+{
+ register_dialog(hwnd);
+}
+
+Dialog::~Dialog()
+{
+ unregister_dialog(_hwnd);
+}
+
+int Dialog::DoModal(UINT nid, CREATORFUNC creator, HWND hwndParent)
+{
+ Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info
+
+ s_window_creator = creator;
+ s_new_info = NULL;
+
+ ///@todo call Window::pretranslate_msg()
+
+ return DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(nid), hwndParent, DialogProc, 0/*lpParam*/);
+}
+
+int Dialog::DoModal(UINT nid, CREATORFUNC_INFO creator, const void* info, HWND hwndParent)
+{
+ Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info
+
+ s_window_creator = (CREATORFUNC) creator;
+ s_new_info = NULL;
+
+ ///@todo call Window::pretranslate_msg()
+
+ return DialogBoxParam(g_Globals._hInstance, MAKEINTRESOURCE(nid), hwndParent, DialogProc, 0/*lpParam*/);
+}
+
+INT_PTR CALLBACK Window::DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ Window* pThis = get_window(hwnd);
+
+ if (pThis) {
+ switch(nmsg) {
+ case WM_COMMAND:
+ pThis->Command(LOWORD(wparam), HIWORD(wparam));
+ return TRUE; // message has been processed
+
+ case WM_NOTIFY:
+ pThis->Notify(wparam, (NMHDR*)lparam);
+ return TRUE; // message has been processed
+
+ case WM_NOTIFYFORMAT:
+ SetWindowLong(hwnd, DWLP_MSGRESULT, NFR_CURRENT); // set return value NFR_CURRENT
+ return TRUE; // message has been processed
+
+ case WM_NCDESTROY:
+ delete pThis;
+ return TRUE; // message has been processed
+
+ default:
+ return pThis->WndProc(nmsg, wparam, lparam);
+ }
+ } else if (nmsg == WM_INITDIALOG) {
+ pThis = create_controller(hwnd);
+
+ if (pThis)
+ return pThis->Init(NULL);
+ }
+
+ return FALSE; // message has not been processed
+}
+
+LRESULT Dialog::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ return FALSE; // message has not been processed
+}
+
+int Dialog::Command(int id, int code)
+{
+ if (code == BN_CLICKED) {
+ EndDialog(_hwnd, id);
+ return 0; // message has been processed
+ }
+
+ return 1;
+}
+
+
+ResizeManager::ResizeManager(HWND hwnd)
+ : _hwnd(hwnd)
+{
+ ClientRect clnt(hwnd);
+ _last_size.cx = clnt.right;
+ _last_size.cy = clnt.bottom;
+
+ WindowRect rect(hwnd);
+ _min_wnd_size.cx = rect.right - rect.left;
+ _min_wnd_size.cy = rect.bottom - rect.top;
+}
+
+void ResizeManager::HandleSize(int cx, int cy)
+{
+ ClientRect clnt_rect(_hwnd);
+ SIZE new_size = {cx, cy};
+
+ int dx = new_size.cx - _last_size.cx;
+ int dy = new_size.cy - _last_size.cy;
+
+ if (!dx && !dy)
+ return;
+
+ _last_size = new_size;
+
+ HDWP hDWP = BeginDeferWindowPos(size());
+
+ for(ResizeManager::const_iterator it=begin(); it!=end(); ++it) {
+ const ResizeEntry& e = *it;
+ RECT move = {0};
+
+ if (e._flags & MOVE_LEFT)
+ move.left += dx;
+
+ if (e._flags & MOVE_RIGHT)
+ move.right += dx;
+
+ if (e._flags & MOVE_TOP)
+ move.top += dy;
+
+ if (e._flags & MOVE_BOTTOM)
+ move.bottom += dy;
+
+ UINT flags = 0;
+
+ if (!move.left && !move.top)
+ flags = SWP_NOMOVE;
+
+ if (move.right==move.left && move.bottom==move.top)
+ flags |= SWP_NOSIZE;
+
+ if (flags != (SWP_NOMOVE|SWP_NOSIZE)) {
+ HWND hwnd = GetDlgItem(_hwnd, e._id);
+
+ if (hwnd) {
+ WindowRect rect(hwnd);
+ ScreenToClient(_hwnd, rect);
+
+ rect.left += move.left;
+ rect.right += move.right;
+ rect.top += move.top;
+ rect.bottom += move.bottom;
+
+ hDWP = DeferWindowPos(hDWP, hwnd, 0, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, flags|SWP_NOACTIVATE|SWP_NOZORDER);
+ }
+ }
+ }
+
+ EndDeferWindowPos(hDWP);
+}
+
+void ResizeManager::Resize(int dx, int dy)
+{
+ ::SetWindowPos(_hwnd, 0, 0, 0, _min_wnd_size.cx+dx, _min_wnd_size.cy+dy, SWP_NOMOVE|SWP_NOACTIVATE);
+ MoveVisible(_hwnd);
+
+ ClientRect clnt_rect(_hwnd);
+ HandleSize(clnt_rect.right, clnt_rect.bottom);
+}
+
+
+Button::Button(HWND parent, LPCTSTR title, int left, int top, int width, int height,
+ int id, DWORD flags, DWORD exStyle)
+ : WindowHandle(CreateWindowEx(exStyle, TEXT("BUTTON"), title, flags, left, top, width, height,
+ parent, (HMENU)id, g_Globals._hInstance, 0))
+{
+}
+
+
+LRESULT OwnerdrawnButton::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ if (nmsg == PM_DISPATCH_DRAWITEM) {
+ DrawItem((LPDRAWITEMSTRUCT)lparam);
+ return TRUE;
+ } else
+ return super::WndProc(nmsg, wparam, lparam);
+}
+
+
+Static::Static(HWND parent, LPCTSTR title, int left, int top, int width, int height,
+ int id, DWORD flags, DWORD exStyle)
+ : WindowHandle(CreateWindowEx(exStyle, TEXT("STATIC"), title, flags, left, top, width, height,
+ parent, (HMENU)id, g_Globals._hInstance, 0))
+{
+}
+
+
+static RECT s_MyDrawText_Rect = {0, 0, 0, 0};
+
+static BOOL CALLBACK MyDrawText(HDC hdc, LPARAM data, int cnt)
+{
+ ::DrawText(hdc, (LPCTSTR)data, cnt, &s_MyDrawText_Rect, DT_SINGLELINE);
+ return TRUE;
+}
+
+void DrawGrayText(HDC hdc, LPRECT pRect, LPCTSTR title, int dt_flags)
+{
+ COLORREF gray = GetSysColor(COLOR_GRAYTEXT);
+
+ if (gray) {
+ TextColor lcColor(hdc, GetSysColor(COLOR_BTNHIGHLIGHT));
+ RECT shadowRect = {pRect->left+1, pRect->top+1, pRect->right+1, pRect->bottom+1};
+ DrawText(hdc, title, -1, &shadowRect, dt_flags);
+
+ SetTextColor(hdc, gray);
+ DrawText(hdc, title, -1, pRect, dt_flags);
+ } else {
+ int old_r = pRect->right;
+ int old_b = pRect->bottom;
+
+ DrawText(hdc, title, -1, pRect, dt_flags|DT_CALCRECT);
+
+ int x = pRect->left + (old_r-pRect->right)/2;
+ int y = pRect->top + (old_b-pRect->bottom)/2;
+ int w = pRect->right-pRect->left;
+ int h = pRect->bottom-pRect->top;
+ s_MyDrawText_Rect.right = w;
+ s_MyDrawText_Rect.bottom = h;
+
+ GrayString(hdc, GetSysColorBrush(COLOR_GRAYTEXT), MyDrawText, (LPARAM)title, -1, x, y, w, h);
+ }
+}
+
+
+/* not yet used
+void ColorButton::DrawItem(LPDRAWITEMSTRUCT dis)
+{
+ UINT state = DFCS_BUTTONPUSH;
+
+ if (dis->itemState & ODS_DISABLED)
+ state |= DFCS_INACTIVE;
+
+ RECT textRect = {dis->rcItem.left+2, dis->rcItem.top+2, dis->rcItem.right-4, dis->rcItem.bottom-4};
+
+ if (dis->itemState & ODS_SELECTED) {
+ state |= DFCS_PUSHED;
+ ++textRect.left; ++textRect.top;
+ ++textRect.right; ++textRect.bottom;
+ }
+
+ DrawFrameControl(dis->hDC, &dis->rcItem, DFC_BUTTON, state);
+
+ TCHAR title[BUFFER_LEN];
+ GetWindowText(_hwnd, title, BUFFER_LEN);
+
+ BkMode bk_mode(dis->hDC, TRANSPARENT);
+
+ if (dis->itemState & (ODS_DISABLED|ODS_GRAYED))
+ DrawGrayText(dis, &textRect, title, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
+ else {
+ TextColor lcColor(dis->hDC, _textColor);
+ DrawText(dis->hDC, title, -1, &textRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
+ }
+
+ if (dis->itemState & ODS_FOCUS) {
+ RECT rect = {
+ dis->rcItem.left+3, dis->rcItem.top+3,
+ dis->rcItem.right-dis->rcItem.left-4, dis->rcItem.bottom-dis->rcItem.top-4
+ };
+ if (dis->itemState & ODS_SELECTED) {
+ ++rect.left; ++rect.top;
+ ++rect.right; ++rect.bottom;
+ }
+ DrawFocusRect(dis->hDC, &rect);
+ }
+}
+*/
+
+
+void PictureButton::DrawItem(LPDRAWITEMSTRUCT dis)
+{
+ UINT state = DFCS_BUTTONPUSH;
+ int style = GetWindowStyle(_hwnd);
+
+ if (dis->itemState & ODS_DISABLED)
+ state |= DFCS_INACTIVE;
+
+ POINT imagePos;
+ RECT textRect;
+ int dt_flags;
+
+ if (style & BS_BOTTOM) {
+ // align horizontal centered, vertical floating
+ imagePos.x = (dis->rcItem.left + dis->rcItem.right - _cx) / 2;
+ imagePos.y = dis->rcItem.top + 3;
+
+ textRect.left = dis->rcItem.left + 2;
+ textRect.top = dis->rcItem.top + _cy + 4;
+ textRect.right = dis->rcItem.right - 4;
+ textRect.bottom = dis->rcItem.bottom - 4;
+
+ dt_flags = DT_SINGLELINE|DT_CENTER|DT_VCENTER;
+ } else {
+ // horizontal floating, vertical centered
+ imagePos.x = dis->rcItem.left + 3;
+ imagePos.y = (dis->rcItem.top + dis->rcItem.bottom - _cy)/2;
+
+ textRect.left = dis->rcItem.left + _cx + 4;
+ textRect.top = dis->rcItem.top + 2;
+ textRect.right = dis->rcItem.right - 4;
+ textRect.bottom = dis->rcItem.bottom - 4;
+
+ dt_flags = DT_SINGLELINE|DT_VCENTER/*|DT_CENTER*/;
+ }
+
+ if (dis->itemState & ODS_SELECTED) {
+ state |= DFCS_PUSHED;
+ ++imagePos.x; ++imagePos.y;
+ ++textRect.left; ++textRect.top;
+ ++textRect.right; ++textRect.bottom;
+ }
+
+ if (_flat) {
+ FillRect(dis->hDC, &dis->rcItem, _hBrush);
+
+ if (style & BS_FLAT) // Only with BS_FLAT set, there will be drawn a frame without highlight.
+ DrawEdge(dis->hDC, &dis->rcItem, EDGE_RAISED, BF_RECT|BF_FLAT);
+ } else
+ DrawFrameControl(dis->hDC, &dis->rcItem, DFC_BUTTON, state);
+
+ if (_hIcon)
+ DrawIconEx(dis->hDC, imagePos.x, imagePos.y, _hIcon, _cx, _cy, 0, _hBrush, DI_NORMAL);
+ else {
+ MemCanvas mem_dc;
+ BitmapSelection sel(mem_dc, _hBmp);
+ BitBlt(dis->hDC, imagePos.x, imagePos.y, _cx, _cy, mem_dc, 0, 0, SRCCOPY);
+ }
+
+ TCHAR title[BUFFER_LEN];
+ GetWindowText(_hwnd, title, BUFFER_LEN);
+
+ BkMode bk_mode(dis->hDC, TRANSPARENT);
+
+ if (dis->itemState & (ODS_DISABLED|ODS_GRAYED))
+ DrawGrayText(dis->hDC, &textRect, title, dt_flags);
+ else {
+ TextColor lcColor(dis->hDC, GetSysColor(COLOR_BTNTEXT));
+ DrawText(dis->hDC, title, -1, &textRect, dt_flags);
+ }
+
+ if (dis->itemState & ODS_FOCUS) {
+ RECT rect = {
+ dis->rcItem.left+3, dis->rcItem.top+3,
+ dis->rcItem.right-dis->rcItem.left-4, dis->rcItem.bottom-dis->rcItem.top-4
+ };
+ if (dis->itemState & ODS_SELECTED) {
+ ++rect.left; ++rect.top;
+ ++rect.right; ++rect.bottom;
+ }
+ DrawFocusRect(dis->hDC, &rect);
+ }
+}
+
+
+void FlatButton::DrawItem(LPDRAWITEMSTRUCT dis)
+{
+ UINT style = DFCS_BUTTONPUSH;
+
+ if (dis->itemState & ODS_DISABLED)
+ style |= DFCS_INACTIVE;
+
+ RECT textRect = {dis->rcItem.left+2, dis->rcItem.top+2, dis->rcItem.right-4, dis->rcItem.bottom-4};
+
+ if (dis->itemState & ODS_SELECTED) {
+ style |= DFCS_PUSHED;
+ ++textRect.left; ++textRect.top;
+ ++textRect.right; ++textRect.bottom;
+ }
+
+ FillRect(dis->hDC, &dis->rcItem, GetSysColorBrush(COLOR_BTNFACE));
+
+ // highlight the button?
+ if (_active)
+ DrawEdge(dis->hDC, &dis->rcItem, EDGE_ETCHED, BF_RECT);
+ else if (GetWindowStyle(_hwnd) & BS_FLAT) // Only with BS_FLAT there will be drawn a frame to show highlighting.
+ DrawEdge(dis->hDC, &dis->rcItem, EDGE_RAISED, BF_RECT|BF_FLAT);
+
+ TCHAR txt[BUFFER_LEN];
+ int txt_len = GetWindowText(_hwnd, txt, BUFFER_LEN);
+
+ if (dis->itemState & (ODS_DISABLED|ODS_GRAYED)) {
+ COLORREF gray = GetSysColor(COLOR_GRAYTEXT);
+
+ if (gray) {
+ {
+ TextColor lcColor(dis->hDC, GetSysColor(COLOR_BTNHIGHLIGHT));
+ RECT shadowRect = {textRect.left+1, textRect.top+1, textRect.right+1, textRect.bottom+1};
+ DrawText(dis->hDC, txt, txt_len, &shadowRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
+ }
+
+ BkMode mode(dis->hDC, TRANSPARENT);
+ TextColor lcColor(dis->hDC, gray);
+ DrawText(dis->hDC, txt, txt_len, &textRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
+ } else {
+ int old_r = textRect.right;
+ int old_b = textRect.bottom;
+ DrawText(dis->hDC, txt, txt_len, &textRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER|DT_CALCRECT);
+ int x = textRect.left + (old_r-textRect.right)/2;
+ int y = textRect.top + (old_b-textRect.bottom)/2;
+ int w = textRect.right-textRect.left;
+ int h = textRect.bottom-textRect.top;
+ s_MyDrawText_Rect.right = w;
+ s_MyDrawText_Rect.bottom = h;
+ GrayString(dis->hDC, GetSysColorBrush(COLOR_GRAYTEXT), MyDrawText, (LPARAM)txt, txt_len, x, y, w, h);
+ }
+ } else {
+ TextColor lcColor(dis->hDC, _active? _activeColor: _textColor);
+ DrawText(dis->hDC, txt, txt_len, &textRect, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
+ }
+
+ if (dis->itemState & ODS_FOCUS) {
+ RECT rect = {
+ dis->rcItem.left+3, dis->rcItem.top+3,
+ dis->rcItem.right-dis->rcItem.left-4, dis->rcItem.bottom-dis->rcItem.top-4
+ };
+ if (dis->itemState & ODS_SELECTED) {
+ ++rect.left; ++rect.top;
+ ++rect.right; ++rect.bottom;
+ }
+ DrawFocusRect(dis->hDC, &rect);
+ }
+}
+
+LRESULT FlatButton::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case WM_MOUSEMOVE: {
+ bool active = false;
+
+ if (IsWindowEnabled(_hwnd)) {
+ DWORD pid_foreground;
+ HWND hwnd_foreground = GetForegroundWindow(); //@@ may be better look for WM_ACTIVATEAPP ?
+ GetWindowThreadProcessId(hwnd_foreground, &pid_foreground);
+
+ if (GetCurrentProcessId() == pid_foreground) {
+ POINT pt = {GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)};
+ ClientRect clntRect(_hwnd);
+
+ // highlight the button?
+ if (pt.x>=clntRect.left && pt.x<clntRect.right && pt.y>=clntRect.top && pt.y<clntRect.bottom)
+ active = true;
+ }
+ }
+
+ if (active != _active) {
+ _active = active;
+
+ if (active) {
+ TRACKMOUSEEVENT tme = {sizeof(tme), /*TME_HOVER|*/TME_LEAVE, _hwnd/*, HOVER_DEFAULT*/};
+ _TrackMouseEvent(&tme);
+ }
+
+ InvalidateRect(_hwnd, NULL, TRUE);
+ }
+
+ return 0;}
+
+ case WM_LBUTTONUP: {
+ POINT pt = {GET_X_LPARAM(lparam), GET_Y_LPARAM(lparam)};
+ ClientRect clntRect(_hwnd);
+
+ // no more in the active rectangle?
+ if (pt.x<clntRect.left || pt.x>=clntRect.right || pt.y<clntRect.top || pt.y>=clntRect.bottom)
+ goto cancel_press;
+
+ goto def;}
+
+ case WM_CANCELMODE:
+ cancel_press: {
+ TRACKMOUSEEVENT tme = {sizeof(tme), /*TME_HOVER|*/TME_LEAVE|TME_CANCEL, _hwnd/*, HOVER_DEFAULT*/};
+ _TrackMouseEvent(&tme);
+ _active = false;
+ ReleaseCapture();}
+ // fall through
+
+ case WM_MOUSELEAVE:
+ if (_active) {
+ _active = false;
+
+ InvalidateRect(_hwnd, NULL, TRUE);
+ }
+
+ return 0;
+
+ default: def:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+}
+
+
+HyperlinkCtrl::HyperlinkCtrl(HWND hwnd, COLORREF colorLink, COLORREF colorVisited)
+ : super(hwnd),
+ _cmd(ResString(GetDlgCtrlID(hwnd))),
+ _textColor(colorLink),
+ _colorVisited(colorVisited),
+ _hfont(0),
+ _crsr_link(0)
+{
+ init();
+}
+
+HyperlinkCtrl::HyperlinkCtrl(HWND owner, int id, COLORREF colorLink, COLORREF colorVisited)
+ : super(GetDlgItem(owner, id)),
+ _cmd(ResString(id)),
+ _textColor(colorLink),
+ _colorVisited(colorVisited),
+ _hfont(0),
+ _crsr_link(0)
+{
+ init();
+}
+
+void HyperlinkCtrl::init()
+{
+ if (_cmd.empty()) {
+ TCHAR txt[BUFFER_LEN];
+ _cmd.assign(txt, GetWindowText(_hwnd, txt, BUFFER_LEN));
+ }
+}
+
+HyperlinkCtrl::~HyperlinkCtrl()
+{
+ if (_hfont)
+ DeleteObject(_hfont);
+}
+
+LRESULT HyperlinkCtrl::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ switch(nmsg) {
+ case PM_DISPATCH_CTLCOLOR: {
+ if (!_hfont) {
+ HFONT hfont = (HFONT) SendMessage(_hwnd, WM_GETFONT, 0, 0);
+ LOGFONT lf; GetObject(hfont, sizeof(lf), &lf);
+ lf.lfUnderline = TRUE;
+ _hfont = CreateFontIndirect(&lf);
+ }
+
+ HDC hdc = (HDC) wparam;
+ SetTextColor(hdc, _textColor); //@@
+ SelectFont(hdc, _hfont);
+ SetBkMode(hdc, TRANSPARENT);
+ return (LRESULT)GetStockObject(HOLLOW_BRUSH);
+ }
+
+ case WM_SETCURSOR:
+ if (!_crsr_link)
+ _crsr_link = LoadCursor(0, IDC_HAND);
+
+ if (_crsr_link)
+ SetCursor(_crsr_link);
+ return 0;
+
+ case WM_NCHITTEST:
+ return HTCLIENT; // Aktivierung von Maus-Botschaften
+
+ case WM_LBUTTONDOWN:
+ if (LaunchLink()) {
+ _textColor = _colorVisited;
+ InvalidateRect(_hwnd, NULL, FALSE);
+ } else
+ MessageBeep(0);
+ return 0;
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+}
+
+
+ToolTip::ToolTip(HWND owner)
+ : super(CreateWindowEx(WS_EX_TOPMOST|WS_EX_NOPARENTNOTIFY, TOOLTIPS_CLASS, 0,
+ WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
+ owner, 0, g_Globals._hInstance, 0))
+{
+ activate();
+}
+
+
+ListSort::ListSort(HWND hwndListview, PFNLVCOMPARE compare_fct)
+ : WindowHandle(hwndListview),
+ _compare_fct(compare_fct)
+{
+ _sort_crit = 0;
+ _direction = false;
+}
+
+void ListSort::toggle_sort(int idx)
+{
+ if (_sort_crit == idx)
+ _direction = !_direction;
+ else {
+ _sort_crit = idx;
+ _direction = false;
+ }
+}
+
+void ListSort::sort()
+{
+ int idx = ListView_GetSelectionMark(_hwnd);
+ LPARAM param = ListView_GetItemData(_hwnd, idx);
+
+ ListView_SortItems(_hwnd, _compare_fct, (LPARAM)this);
+
+ if (idx >= 0) {
+ idx = ListView_FindItemPara(_hwnd, param);
+ ListView_EnsureVisible(_hwnd, idx, FALSE);
+ }
+}
+
+
+PropSheetPage::PropSheetPage(UINT nid, Window::CREATORFUNC dlg_creator)
+ : _dlg_creator(dlg_creator)
+{
+ PROPSHEETPAGE::dwSize = sizeof(PROPSHEETPAGE);
+ PROPSHEETPAGE::dwFlags = 0;
+ PROPSHEETPAGE::hInstance = g_Globals._hInstance;
+ PROPSHEETPAGE::pszTemplate = MAKEINTRESOURCE(nid);
+ PROPSHEETPAGE::pfnDlgProc = PropSheetPageDlg::DialogProc;
+ PROPSHEETPAGE::lParam = (LPARAM) this;
+}
+
+
+#ifndef PSM_GETRESULT // currently (as of 18.01.2004) missing in MinGW headers
+#define PSM_GETRESULT (WM_USER + 135)
+#define PropSheet_GetResult(hDlg) SNDMSG(hDlg, PSM_GETRESULT, 0, 0)
+#endif
+
+
+PropertySheetDialog::PropertySheetDialog(HWND owner)
+ : _hwnd(0)
+{
+ PROPSHEETHEADER::dwSize = sizeof(PROPSHEETHEADER);
+ PROPSHEETHEADER::dwFlags = PSH_PROPSHEETPAGE | PSH_MODELESS;
+ PROPSHEETHEADER::hwndParent = owner;
+ PROPSHEETHEADER::hInstance = g_Globals._hInstance;
+}
+
+void PropertySheetDialog::add(PropSheetPage& psp)
+{
+ _pages.push_back(psp);
+}
+
+int PropertySheetDialog::DoModal(int start_page)
+{
+ PROPSHEETHEADER::ppsp = (LPCPROPSHEETPAGE) &_pages[0];
+ PROPSHEETHEADER::nPages = _pages.size();
+ PROPSHEETHEADER::nStartPage = start_page;
+/*
+ Window* pwnd = Window::create_property_sheet(this, WINDOW_CREATOR(PropertySheetDlg), NULL);
+ if (!pwnd)
+ return -1;
+
+ HWND hwndPropSheet = *pwnd;
+*/
+ int ret = PropertySheet(this);
+ if (ret == -1)
+ return -1;
+
+ HWND hwndPropSheet = (HWND) ret;
+ HWND hwndparent = GetParent(hwndPropSheet);
+
+ if (hwndparent)
+ EnableWindow(hwndparent, FALSE);
+
+ ret = 0;
+ MSG msg;
+
+ while(GetMessage(&msg, 0, 0, 0)) {
+ try {
+ if (Window::pretranslate_msg(&msg))
+ continue;
+
+ if (PropSheet_IsDialogMessage(hwndPropSheet, &msg))
+ continue;
+
+ if (Window::dispatch_dialog_msg(&msg))
+ continue;
+
+ TranslateMessage(&msg);
+
+ try {
+ DispatchMessage(&msg);
+ } catch(COMException& e) {
+ HandleException(e, 0);
+ }
+
+ if (!PropSheet_GetCurrentPageHwnd(hwndPropSheet)) {
+ ret = PropSheet_GetResult(hwndPropSheet);
+ break;
+ }
+ } catch(COMException& e) {
+ HandleException(e, 0);
+ }
+ }
+
+ if (hwndparent)
+ EnableWindow(hwndparent, TRUE);
+
+ DestroyWindow(hwndPropSheet);
+
+ return ret;
+}
+
+HWND PropertySheetDialog::GetCurrentPage()
+{
+ HWND hdlg = PropSheet_GetCurrentPageHwnd(_hwnd);
+ return hdlg;
+}
+
+
+PropSheetPageDlg::PropSheetPageDlg(HWND hwnd)
+ : super(hwnd)
+{
+}
+
+INT_PTR CALLBACK PropSheetPageDlg::DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam)
+{
+ PropSheetPageDlg* pThis = GET_WINDOW(PropSheetPageDlg, hwnd);
+
+ if (pThis) {
+ switch(nmsg) {
+ case WM_COMMAND:
+ pThis->Command(LOWORD(wparam), HIWORD(wparam));
+ return TRUE; // message has been processed
+
+ case WM_NOTIFY:
+ pThis->Notify(wparam, (NMHDR*)lparam);
+ return TRUE; // message has been processed
+
+ case WM_NOTIFYFORMAT:
+ SetWindowLong(hwnd, DWLP_MSGRESULT, NFR_CURRENT); // set return value NFR_CURRENT
+ return TRUE; // message has been processed
+
+ case WM_NCDESTROY:
+ delete pThis;
+ return TRUE; // message has been processed
+
+ default:
+ return pThis->WndProc(nmsg, wparam, lparam);
+ }
+ } else if (nmsg == WM_INITDIALOG) {
+ PROPSHEETPAGE* psp = (PROPSHEETPAGE*) lparam;
+ PropSheetPage* ppsp = (PropSheetPage*) psp->lParam;
+
+ if (ppsp->_dlg_creator) {
+ pThis = static_cast<PropSheetPageDlg*>(ppsp->_dlg_creator(hwnd));
+
+ if (pThis)
+ return pThis->Init(NULL);
+ }
+ }
+
+ return FALSE; // message has not been processed
+}
+
+int PropSheetPageDlg::Command(int id, int code)
+{
+ // override call to EndDialog in Dialog::Command();
+
+ return FALSE;
+}
--- /dev/null
+/*
+ * Copyright 2003, 2004, 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+ //
+ // Explorer clone
+ //
+ // window.h
+ //
+ // Martin Fuchs, 23.07.2003
+ //
+
+
+typedef set<HWND> WindowSet;
+
+
+ /*
+ Classes are declared using "struct", not "class" because the default
+ access mode is "public". This way we can list the member functions in a
+ natural order without explicitly specifying any access mode at the begin
+ of the definition.
+ First are public constructors and destructor, then public member functions.
+ After that we list protected member varibables and functions. If needed,
+ private implemenation varibales and functions are positioned at the end.
+ */
+
+
+ /// information structure for creation of a MDI child window
+struct ChildWndInfo
+{
+ ChildWndInfo(HWND hmdiclient)
+ : _hmdiclient(hmdiclient) {}
+
+ HWND _hmdiclient;
+};
+
+
+ /**
+ Class Window is the base class for several C++ window wrapper classes.
+ Window objects are allocated from the heap. They are automatically freed
+ when the window gets destroyed.
+ */
+struct Window : public WindowHandle
+{
+ Window(HWND hwnd);
+ virtual ~Window();
+
+
+ typedef map<HWND,Window*> WindowMap;
+
+ typedef Window* (*CREATORFUNC)(HWND);
+ typedef Window* (*CREATORFUNC_INFO)(HWND, const void*);
+
+ static HWND Create(CREATORFUNC creator,
+ DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName,
+ DWORD dwStyle, int x, int y, int w, int h,
+ HWND hwndParent=0, HMENU hMenu=0/*, LPVOID lpParam=0*/);
+
+ static HWND Create(CREATORFUNC_INFO creator, const void* info,
+ DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName,
+ DWORD dwStyle, int x, int y, int w, int h,
+ HWND hwndParent=0, HMENU hMenu=0/*, LPVOID lpParam=0*/);
+
+ static Window* create_mdi_child(const ChildWndInfo& info, const MDICREATESTRUCT& mcs, CREATORFUNC_INFO creator);
+// static Window* create_property_sheet(struct PropertySheetDialog* ppsd, CREATORFUNC creator, const void* info);
+
+ static LRESULT CALLBACK WindowWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
+ static INT_PTR CALLBACK DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ static Window* get_window(HWND hwnd);
+#ifndef _MSC_VER
+ template<typename CLASS> static CLASS* get_window(HWND hwnd) {return static_cast<CLASS*>(get_window(hwnd));}
+#define GET_WINDOW(CLASS, hwnd) Window::get_window<CLASS>(hwnd)
+#endif
+
+ static void register_pretranslate(HWND hwnd);
+ static void unregister_pretranslate(HWND hwnd);
+ static BOOL pretranslate_msg(LPMSG pmsg);
+
+ static void register_dialog(HWND hwnd);
+ static void unregister_dialog(HWND hwnd);
+ static BOOL dispatch_dialog_msg(LPMSG pmsg);
+
+ static int MessageLoop();
+
+
+ LRESULT SendParent(UINT nmsg, WPARAM wparam=0, LPARAM lparam=0);
+ LRESULT PostParent(UINT nmsg, WPARAM wparam=0, LPARAM lparam=0);
+
+ static void CancelModes();
+
+
+protected:
+ virtual LRESULT Init(LPCREATESTRUCT pcs); // WM_CREATE processing
+ virtual LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ virtual int Command(int id, int code); // WM_COMMAND processing
+ virtual int Notify(int id, NMHDR* pnmh); // WM_NOTIFY processing
+
+ static Window* create_controller(HWND hwnd);
+
+
+ static WindowMap s_wnd_map;
+
+ static const void* s_new_info;
+ static CREATORFUNC s_window_creator;
+
+
+ /// structure for managing critical sections as static class information in struct Window
+ struct StaticWindowData {
+ CritSect _map_crit_sect;
+ CritSect _create_crit_sect;
+ };
+
+ static StaticWindowData& GetStaticWindowData();
+
+
+ // MDI child creation
+ static HHOOK s_hcbtHook;
+ static LRESULT CALLBACK MDICBTHookProc(int code, WPARAM wparam, LPARAM lparam);
+ static LRESULT CALLBACK PropSheetCBTHookProc(int code, WPARAM wparam, LPARAM lparam);
+
+ static WindowSet s_pretranslate_windows;
+ static WindowSet s_dialogs;
+};
+
+#ifdef UNICODE
+#define NFR_CURRENT NFR_UNICODE
+#else
+#define NFR_CURRENT NFR_ANSI
+#endif
+
+
+#ifdef _MSC_VER
+template<typename CLASS> struct GetWindowHelper
+{
+ static CLASS* get_window(HWND hwnd) {
+ return static_cast<CLASS*>(Window::get_window(hwnd));
+ }
+};
+#define GET_WINDOW(CLASS, hwnd) GetWindowHelper<CLASS>::get_window(hwnd)
+#endif
+
+
+ /// dynamic casting of Window pointers
+template<typename CLASS> struct TypeCheck
+{
+ static CLASS* dyn_cast(Window* wnd)
+ {return dynamic_cast<CLASS*>(wnd);}
+};
+
+#define WINDOW_DYNAMIC_CAST(CLASS, hwnd) \
+ TypeCheck<CLASS>::dyn_cast(Window::get_window(hwnd))
+
+
+ /**
+ SubclassedWindow is used to wrap already existing window handles
+ into C++ Window objects. To construct a object, use the "new" operator
+ to put it in the heap. It is automatically freed, when the window
+ gets destroyed.
+ */
+struct SubclassedWindow : public Window
+{
+ typedef Window super;
+
+ SubclassedWindow(HWND);
+
+protected:
+ WNDPROC _orgWndProc;
+
+ static LRESULT CALLBACK SubclassedWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ virtual LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ virtual int Command(int id, int code);
+ virtual int Notify(int id, NMHDR* pnmh);
+};
+
+
+ /// template class used in macro WINDOW_CREATOR to define the creater functions for Window objects
+template<typename WND_CLASS> struct WindowCreator
+{
+ static WND_CLASS* window_creator(HWND hwnd)
+ {
+ return new WND_CLASS(hwnd);
+ }
+};
+
+#define WINDOW_CREATOR(WND_CLASS) \
+ ((Window::CREATORFUNC) WindowCreator<WND_CLASS>::window_creator)
+
+
+ /// template class used in macro WINDOW_CREATOR_INFO to the define creater functions for Window objects with additional creation information
+template<typename WND_CLASS, typename INFO_CLASS> struct WindowCreatorInfo
+{
+ static WND_CLASS* window_creator(HWND hwnd, const void* info)
+ {
+ return new WND_CLASS(hwnd, *static_cast<const INFO_CLASS*>(info));
+ }
+};
+
+#define WINDOW_CREATOR_INFO(WND_CLASS, INFO_CLASS) \
+ ((Window::CREATORFUNC_INFO) WindowCreatorInfo<WND_CLASS, INFO_CLASS>::window_creator)
+
+
+ /**
+ WindowClass is a neat wrapper for RegisterClassEx().
+ Just construct a WindowClass object, override the attributes you want
+ to change, then call Register() or simply request the ATOM value to
+ register the window class. You don't have to worry calling Register()
+ more than once. It checks if, the class has already been registered.
+ */
+struct WindowClass : public WNDCLASSEX
+{
+ WindowClass(LPCTSTR classname, UINT style=0, WNDPROC wndproc=Window::WindowWndProc);
+
+ ATOM Register()
+ {
+ if (!_atomClass)
+ _atomClass = RegisterClassEx(this);
+
+ return _atomClass;
+ }
+
+ operator ATOM() {return Register();}
+
+ // return LPCTSTR for the CreateWindowEx() parameter
+ operator LPCTSTR() {return (LPCTSTR)(int)Register();}
+
+protected:
+ ATOM _atomClass;
+};
+
+ /// window class with gray background color
+struct BtnWindowClass : public WindowClass
+{
+ BtnWindowClass(LPCTSTR classname, UINT style=0, WNDPROC wndproc=Window::WindowWndProc)
+ : WindowClass(classname, style, wndproc)
+ {
+ hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
+ }
+};
+
+ /// window class with specified icon from resources
+struct IconWindowClass : public WindowClass
+{
+ IconWindowClass(LPCTSTR classname, UINT nid, UINT style=0, WNDPROC wndproc=Window::WindowWndProc);
+};
+
+
+ // private message constants
+#define PM_DISPATCH_COMMAND (WM_APP+0x00)
+#define PM_TRANSLATE_MSG (WM_APP+0x01)
+
+
+#define SPLIT_WIDTH 5
+#define DEFAULT_SPLIT_POS 300
+#define COLOR_SPLITBAR LTGRAY_BRUSH
+
+
+ /// menu info structure
+struct MenuInfo
+{
+ HMENU _hMenuView;
+};
+
+#define PM_FRM_GET_MENUINFO (WM_APP+0x02)
+
+#define Frame_GetMenuInfo(hwnd) ((MenuInfo*)SNDMSG(hwnd, PM_FRM_GET_MENUINFO, 0, 0))
+
+
+ /**
+ Class ChildWindow represents MDI child windows.
+ It is used with class MainFrame.
+ */
+struct ChildWindow : public Window
+{
+ typedef Window super;
+
+ ChildWindow(HWND hwnd, const ChildWndInfo& info);
+
+ static ChildWindow* create(const ChildWndInfo& info, const RECT& rect, CREATORFUNC_INFO creator,
+ LPCTSTR classname, LPCTSTR title=NULL, DWORD style=0);
+
+ bool go_to(LPCTSTR url);
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ virtual void resize_children(int cx, int cy);
+ virtual String jump_to_int(LPCTSTR url) = 0;
+
+protected:
+ MenuInfo*_menu_info;
+
+ WindowHandle _left_hwnd;
+ WindowHandle _right_hwnd;
+ int _focus_pane; // 0: left 1: right
+
+ int _split_pos;
+ int _last_split;
+
+ HWND _hwndFrame;
+ String _statusText;
+ String _url;
+
+ stack<String> _url_history;
+
+ void set_url(LPCTSTR url);
+};
+
+#define PM_SETSTATUSTEXT (WM_APP+0x1E)
+
+
+ /**
+ PreTranslateWindow is used to register windows to be called by Window::pretranslate_msg().
+ This way you get PM_TRANSLATE_MSG messages before the message loop dispatches messages.
+ You can then for example use TranslateAccelerator() to implement key shortcuts.
+ */
+struct PreTranslateWindow : public Window
+{
+ typedef Window super;
+
+ PreTranslateWindow(HWND);
+ ~PreTranslateWindow();
+};
+
+
+ /**
+ The class DialogWindow implements modeless dialogs, which are managed by
+ Window::dispatch_dialog_msg() in Window::MessageLoop().
+ A DialogWindow object should be constructed by calling Window::Create()
+ and specifying the class using the WINDOW_CREATOR() macro.
+ */
+struct DialogWindow : public Window
+{
+ typedef Window super;
+
+ DialogWindow(HWND hwnd)
+ : super(hwnd)
+ {
+ register_dialog(hwnd);
+ }
+
+ ~DialogWindow()
+ {
+ unregister_dialog(_hwnd);
+ }
+};
+
+
+ /**
+ The class Dialog implements modal dialogs.
+ A Dialog object should be constructed by calling Dialog::DoModal()
+ and specifying the class using the WINDOW_CREATOR() macro.
+ */
+struct Dialog : public Window
+{
+ typedef Window super;
+
+ Dialog(HWND);
+ ~Dialog();
+
+ static int DoModal(UINT nid, CREATORFUNC creator, HWND hwndParent=0);
+ static int DoModal(UINT nid, CREATORFUNC_INFO creator, const void* info, HWND hwndParent=0);
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Command(int id, int code);
+};
+
+
+#define PM_FRM_CALC_CLIENT (WM_APP+0x03)
+#define Frame_CalcFrameClient(hwnd, prt) ((BOOL)SNDMSG(hwnd, PM_FRM_CALC_CLIENT, 0, (LPARAM)(PRECT)prt))
+
+#define PM_JUMP_TO_URL (WM_APP+0x25)
+#define PM_URL_CHANGED (WM_APP+0x26)
+
+
+struct PropSheetPage : public PROPSHEETPAGE
+{
+ PropSheetPage(UINT nid, Window::CREATORFUNC dlg_creator);
+
+ void init(struct PropertySheetDialog*);
+
+protected:
+ friend struct PropSheetPageDlg;
+
+ Window::CREATORFUNC _dlg_creator;
+};
+
+
+ /// Property Sheet dialog
+struct PropertySheetDialog : public PROPSHEETHEADER
+{
+ PropertySheetDialog(HWND owner);
+
+ void add(PropSheetPage& psp);
+ int DoModal(int start_page=0);
+
+ HWND GetCurrentPage();
+
+protected:
+ typedef vector<PROPSHEETPAGE> Vector;
+ Vector _pages;
+ HWND _hwnd;
+};
+
+
+ /// Property Sheet Page (inner dialog)
+struct PropSheetPageDlg : public Dialog
+{
+ typedef Dialog super;
+
+ PropSheetPageDlg(HWND);
+
+protected:
+ friend struct PropertySheetDialog;
+ friend struct PropSheetPage;
+
+ static INT_PTR CALLBACK DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ int Command(int id, int code);
+};
+
+
+/*
+ /// Property Sheet Dialog (outer dialog)
+struct PropertySheetDlg : public SubclassedWindow
+{
+ typedef SubclassedWindow super;
+
+ PropertySheetDlg(HWND hwnd) : super(hwnd) {}
+};
+*/
+
+
+ // Layouting of resizable windows
+
+ /// Flags to specify how to move and resize controls when resizing their parent window
+enum RESIZE_FLAGS {
+ MOVE_LEFT = 0x1,
+ MOVE_RIGHT = 0x2,
+ MOVE_TOP = 0x4,
+ MOVE_BOTTOM = 0x8,
+
+ MOVE_X = MOVE_LEFT | MOVE_RIGHT,
+ MOVE_Y = MOVE_TOP | MOVE_BOTTOM,
+ RESIZE_X= MOVE_RIGHT,
+ RESIZE_Y= MOVE_BOTTOM,
+
+ MOVE = MOVE_X | MOVE_Y,
+ RESIZE = RESIZE_X | RESIZE_Y
+};
+
+ /// structure to assign RESIZE_FLAGS to dialogs control
+struct ResizeEntry
+{
+ ResizeEntry(UINT id, int flags)
+ : _id(id), _flags(flags) {}
+
+ ResizeEntry(HWND hwnd, int flags)
+ : _id(GetDlgCtrlID(hwnd)), _flags(flags) {}
+
+ UINT _id;
+ int _flags;
+};
+
+
+ /// Management of controls in resizable dialogs
+struct ResizeManager : public std::list<ResizeEntry>
+{
+ typedef std::list<ResizeEntry> super;
+
+ ResizeManager(HWND hwnd);
+
+ void Add(UINT id, int flags)
+ {push_back(ResizeEntry(id, flags));}
+
+ void Add(HWND hwnd, int flags)
+ {push_back(ResizeEntry(hwnd, flags));}
+
+ void HandleSize(int cx, int cy);
+ void Resize(int dx, int dy);
+
+ void SetMinMaxInfo(LPMINMAXINFO lpmmi)
+ {
+ lpmmi->ptMinTrackSize.x = _min_wnd_size.cx;
+ lpmmi->ptMinTrackSize.y = _min_wnd_size.cy;
+ }
+
+ SIZE _min_wnd_size;
+
+protected:
+ HWND _hwnd;
+ SIZE _last_size;
+};
+
+
+ /// Controller base template class for resizable dialogs
+template<typename BASE> struct ResizeController : public BASE
+{
+ typedef BASE super;
+
+ ResizeController(HWND hwnd)
+ : super(hwnd),
+ _resize_mgr(hwnd)
+ {
+ }
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+ {
+ switch(nmsg) {
+ case PM_FRM_CALC_CLIENT:
+ GetClientSpace((PRECT)lparam);
+ return TRUE;
+
+ case WM_SIZE:
+ if (wparam != SIZE_MINIMIZED)
+ _resize_mgr.HandleSize(LOWORD(lparam), HIWORD(lparam));
+ goto def;
+
+ case WM_GETMINMAXINFO:
+ _resize_mgr.SetMinMaxInfo((LPMINMAXINFO)lparam);
+ goto def;
+
+ default: def:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+ }
+
+ virtual void GetClientSpace(PRECT prect)
+ {
+ if (!IsIconic(this->_hwnd)) {
+ GetClientRect(this->_hwnd, prect);
+ } else {
+ WINDOWPLACEMENT wp;
+ GetWindowPlacement(this->_hwnd, &wp);
+ prect->left = prect->top = 0;
+ prect->right = wp.rcNormalPosition.right-wp.rcNormalPosition.left-
+ 2*(GetSystemMetrics(SM_CXSIZEFRAME)+GetSystemMetrics(SM_CXEDGE));
+ prect->bottom = wp.rcNormalPosition.bottom-wp.rcNormalPosition.top-
+ 2*(GetSystemMetrics(SM_CYSIZEFRAME)+GetSystemMetrics(SM_CYEDGE))-
+ GetSystemMetrics(SM_CYCAPTION)-GetSystemMetrics(SM_CYMENUSIZE);
+ }
+ }
+
+protected:
+ ResizeManager _resize_mgr;
+};
+
+
+ /**
+ This class constructs button controls.
+ The button will remain existent when the C++ Button object is destroyed.
+ There is no conjunction between C++ object and windows control life time.
+ */
+struct Button : public WindowHandle
+{
+ Button(HWND parent, LPCTSTR text, int left, int top, int width, int height,
+ int id, DWORD flags=WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, DWORD exStyle=0);
+};
+
+
+ /**
+ This class constructs static controls.
+ The control will remain existent when the C++ object is destroyed.
+ There is no conjunction between C++ object and windows control life time.
+ */
+struct Static : public WindowHandle
+{
+ Static(HWND parent, LPCTSTR text, int left, int top, int width, int height,
+ int id, DWORD flags=WS_VISIBLE|WS_CHILD|SS_SIMPLE, DWORD ex_flags=0);
+};
+
+
+ // control color message routing for ColorStatic and HyperlinkCtrl
+
+#define PM_DISPATCH_CTLCOLOR (WM_APP+0x08)
+
+template<typename BASE> struct CtlColorParent : public BASE
+{
+ typedef BASE super;
+
+ CtlColorParent(HWND hwnd)
+ : super(hwnd) {}
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+ {
+ switch(nmsg) {
+ case WM_CTLCOLOR:
+ case WM_CTLCOLORBTN:
+ case WM_CTLCOLORDLG:
+ case WM_CTLCOLORSCROLLBAR:
+ case WM_CTLCOLORSTATIC: {
+ HWND hctl = (HWND) lparam;
+ return SendMessage(hctl, PM_DISPATCH_CTLCOLOR, wparam, nmsg);
+ }
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+ }
+};
+
+
+#define PM_DISPATCH_DRAWITEM (WM_APP+0x09)
+
+ /// draw message routing for ColorButton and PictureButton
+template<typename BASE> struct OwnerDrawParent : public BASE
+{
+ typedef BASE super;
+
+ OwnerDrawParent(HWND hwnd)
+ : super(hwnd) {}
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+ {
+ switch(nmsg) {
+ case WM_DRAWITEM:
+ if (wparam) { // should there be drawn a control?
+ HWND hctl = GetDlgItem(this->_hwnd, wparam);
+
+ if (hctl)
+ return SendMessage(hctl, PM_DISPATCH_DRAWITEM, wparam, lparam);
+ } /*else // or is it a menu entry?
+ ; */
+
+ return 0;
+
+ default:
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+ }
+};
+
+
+ /**
+ Subclass button controls to draw them by using PM_DISPATCH_DRAWITEM
+ The owning window should use the OwnerDrawParent template to route owner draw messages to the buttons.
+ */
+struct OwnerdrawnButton : public SubclassedWindow
+{
+ typedef SubclassedWindow super;
+
+ OwnerdrawnButton(HWND hwnd)
+ : super(hwnd) {}
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ virtual void DrawItem(LPDRAWITEMSTRUCT dis) = 0;
+};
+
+extern void DrawGrayText(HDC hdc, LPRECT pRect, LPCTSTR text, int dt_flags);
+
+
+ /**
+ Subclass button controls to paint colored text labels.
+ The owning window should use the OwnerDrawParent template to route owner draw messages to the buttons.
+ */
+/* not yet used
+struct ColorButton : public OwnerdrawnButton
+{
+ typedef OwnerdrawnButton super;
+
+ ColorButton(HWND hwnd, COLORREF textColor)
+ : super(hwnd), _textColor(textColor) {}
+
+protected:
+ virtual void DrawItem(LPDRAWITEMSTRUCT dis);
+
+ COLORREF _textColor;
+};
+*/
+
+
+struct FlatButton : public OwnerdrawnButton
+{
+ typedef OwnerdrawnButton super;
+
+ FlatButton(HWND hwnd)
+ : super(hwnd), _active(false) {}
+
+ FlatButton(HWND owner, int id)
+ : super(GetDlgItem(owner, IDOK)), _active(false) {}
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ virtual void DrawItem(LPDRAWITEMSTRUCT dis);
+
+ COLORREF _textColor;
+ COLORREF _activeColor;
+ bool _active;
+};
+
+
+ /**
+ Subclass button controls to paint pictures left to the labels.
+ The buttons should have set the style bit BS_OWNERDRAW.
+ The owning window should use the OwnerDrawParent template to route owner draw messages to the buttons.
+ */
+struct PictureButton : public OwnerdrawnButton
+{
+ typedef OwnerdrawnButton super;
+
+ PictureButton(HWND hwnd, HICON hIcon, HBRUSH hbrush=GetSysColorBrush(COLOR_BTNFACE), bool flat=false)
+ : super(hwnd), _hIcon(hIcon), _hBmp(0), _hBrush(hbrush), _flat(flat)
+ {
+ _cx = 16;
+ _cy = 16;
+ }
+
+ PictureButton(HWND hparent, int id, HICON hIcon, HBRUSH hbrush=GetSysColorBrush(COLOR_BTNFACE), bool flat=false)
+ : super(GetDlgItem(hparent, id)), _hIcon(hIcon), _hBmp(0), _hBrush(hbrush), _flat(flat)
+ {
+ _cx = 16;
+ _cy = 16;
+ }
+
+ PictureButton(HWND hwnd, HBITMAP hBmp, HBRUSH hbrush=GetSysColorBrush(COLOR_BTNFACE), bool flat=false)
+ : super(hwnd), _hIcon(0), _hBmp(hBmp), _hBrush(hbrush), _flat(flat)
+ {
+ BITMAP bmp;
+ GetObject(hBmp, sizeof(bmp), &bmp);
+ _cx = bmp.bmWidth;
+ _cy = bmp.bmHeight;
+ }
+
+ PictureButton(HWND hparent, int id, HBITMAP hBmp, HBRUSH hbrush=GetSysColorBrush(COLOR_BTNFACE), bool flat=false)
+ : super(GetDlgItem(hparent, id)), _hIcon(0), _hBmp(hBmp), _hBrush(hbrush), _flat(flat)
+ {
+ BITMAP bmp;
+ GetObject(hBmp, sizeof(bmp), &bmp);
+ _cx = bmp.bmWidth;
+ _cy = bmp.bmHeight;
+ }
+
+protected:
+ virtual void DrawItem(LPDRAWITEMSTRUCT dis);
+
+ HICON _hIcon;
+ HBITMAP _hBmp;
+ HBRUSH _hBrush;
+
+ int _cx;
+ int _cy;
+
+ bool _flat;
+};
+
+
+struct ColorStatic : public SubclassedWindow
+{
+ typedef SubclassedWindow super;
+
+ ColorStatic(HWND hwnd, COLORREF textColor=RGB(255,0,0), HBRUSH hbrush_bkgnd=0, HFONT hfont=0)
+ : super(hwnd),
+ _textColor(textColor),
+ _hbrush_bkgnd(hbrush_bkgnd),
+ _hfont(hfont)
+ {
+ }
+
+ ColorStatic(HWND owner, int id, COLORREF textColor=RGB(255,0,0), HBRUSH hbrush_bkgnd=0, HFONT hfont=0)
+ : super(GetDlgItem(owner, id)),
+ _textColor(textColor),
+ _hbrush_bkgnd(hbrush_bkgnd),
+ _hfont(hfont)
+ {
+ }
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+ {
+ if (nmsg == PM_DISPATCH_CTLCOLOR) {
+ HDC hdc = (HDC) wparam;
+
+ SetTextColor(hdc, _textColor);
+
+ if (_hfont)
+ SelectFont(hdc, _hfont);
+
+ if (_hbrush_bkgnd)
+ return (LRESULT)_hbrush_bkgnd;
+ else {
+ SetBkMode(hdc, TRANSPARENT);
+ return (LRESULT)GetStockBrush(HOLLOW_BRUSH);
+ }
+ } else
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ COLORREF _textColor;
+ HBRUSH _hbrush_bkgnd;
+ HFONT _hfont;
+};
+
+
+ /// Hyperlink Controls
+
+struct HyperlinkCtrl : public SubclassedWindow
+{
+ typedef SubclassedWindow super;
+
+ HyperlinkCtrl(HWND hwnd, COLORREF colorLink=RGB(0,0,255), COLORREF colorVisited=RGB(128,0,128));
+ HyperlinkCtrl(HWND owner, int id, COLORREF colorLink=RGB(0,0,255), COLORREF colorVisited=RGB(128,0,128));
+
+ ~HyperlinkCtrl();
+
+ String _cmd;
+
+protected:
+ COLORREF _textColor;
+ COLORREF _colorVisited;
+ HFONT _hfont;
+ HCURSOR _crsr_link;
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+
+ void init();
+
+ bool LaunchLink()
+ {
+ if (!_cmd.empty()) {
+ HINSTANCE hinst = ShellExecute(GetParent(_hwnd), _T("open"), _cmd, 0, 0, SW_SHOWNORMAL);
+ return (int)hinst > HINSTANCE_ERROR;
+ }
+
+ return true;
+ }
+};
+
+
+ /// encapsulation of tool tip controls
+struct ToolTip : public WindowHandle
+{
+ typedef WindowHandle super;
+
+ ToolTip(HWND owner);
+
+ void activate(BOOL active=TRUE)
+ {
+ SendMessage(_hwnd, TTM_ACTIVATE, active, 0);
+ }
+
+ void add(HWND hparent, HWND htool, LPCTSTR txt=LPSTR_TEXTCALLBACK, LPARAM lparam=0)
+ {
+ TOOLINFO ti = {
+ sizeof(TOOLINFO), TTF_SUBCLASS|TTF_IDISHWND|TTF_TRANSPARENT, hparent, (UINT)htool,
+ {0,0,0,0}, 0, (LPTSTR)txt, lparam
+ };
+
+#ifdef UNICODE ///@todo Why is it neccesary to try both TTM_ADDTOOLW and TTM_ADDTOOLW ?!
+ if (!SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti))
+ SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti);
+#else
+ if (!SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti))
+ SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti);
+#endif
+ }
+
+ void add(HWND hparent, UINT id, const RECT& rect, LPCTSTR txt=LPSTR_TEXTCALLBACK, LPARAM lparam=0)
+ {
+ TOOLINFO ti = {
+ sizeof(TOOLINFO), TTF_SUBCLASS|TTF_TRANSPARENT, hparent, id,
+ {rect.left,rect.top,rect.right,rect.bottom}, 0, (LPTSTR)txt, lparam
+ };
+
+#ifdef UNICODE
+ if (!SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti))
+ SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti);
+#else
+ if (!SendMessage(_hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti))
+ SendMessage(_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&ti);
+#endif
+ }
+
+ void remove(HWND hparent, HWND htool)
+ {
+ TOOLINFO ti = {
+ sizeof(TOOLINFO), TTF_IDISHWND, hparent, (UINT)htool,
+ {0,0,0,0}, 0, 0, 0
+ };
+
+ SendMessage(_hwnd, TTM_DELTOOL, 0, (LPARAM)&ti);
+ }
+
+ void remove(HWND hparent, UINT id)
+ {
+ TOOLINFO ti = {
+ sizeof(TOOLINFO), 0, hparent, id,
+ {0,0,0,0}, 0, 0, 0
+ };
+
+ SendMessage(_hwnd, TTM_DELTOOL, 0, (LPARAM)&ti);
+ }
+};
+
+
+inline int ListView_GetItemData(HWND list_ctrl, int idx)
+{
+ LV_ITEM item;
+
+ item.mask = LVIF_PARAM;
+ item.iItem = idx;
+
+ if (!ListView_GetItem(list_ctrl, &item))
+ return 0;
+
+ return item.lParam;
+}
+
+inline int ListView_FindItemPara(HWND list_ctrl, LPARAM param)
+{
+ LVFINDINFO fi;
+
+ fi.flags = LVFI_PARAM;
+ fi.lParam = param;
+
+ return ListView_FindItem(list_ctrl, (unsigned)-1, &fi);
+}
+
+inline int ListView_GetFocusedItem(HWND list_ctrl)
+{
+ int idx = ListView_GetItemCount(list_ctrl);
+
+ while(--idx >= 0)
+ if (ListView_GetItemState(list_ctrl, idx, LVIS_FOCUSED))
+ break;
+
+ return idx;
+}
+
+
+ /// sorting of list controls
+struct ListSort : public WindowHandle
+{
+ ListSort(HWND hwndListview, PFNLVCOMPARE compare_fct);
+
+ void toggle_sort(int idx);
+ void sort();
+
+ int _sort_crit;
+ bool _direction;
+
+protected:
+ PFNLVCOMPARE _compare_fct;
+
+ static int CALLBACK CompareFunc(LPARAM lparam1, LPARAM lparam2, LPARAM lparamSort);
+};
+
+
+inline LPARAM TreeView_GetItemData(HWND hwndTreeView, HTREEITEM hItem)
+{
+ TVITEM tvItem;
+
+ tvItem.mask = TVIF_PARAM;
+ tvItem.hItem = hItem;
+
+ if (!TreeView_GetItem(hwndTreeView, &tvItem))
+ return 0;
+
+ return tvItem.lParam;
+}
+
+
+enum {TRAYBUTTON_LEFT=0, TRAYBUTTON_RIGHT, TRAYBUTTON_MIDDLE};
+
+#define PM_TRAYICON (WM_APP+0x20)
+
+#define WINMSG_TASKBARCREATED TEXT("TaskbarCreated")
+
+#define WINMSG_SHELLHOOK TEXT("SHELLHOOK")
+
+
+struct TrayIcon
+{
+ TrayIcon(HWND hparent, UINT id)
+ : _hparent(hparent), _id(id) {}
+
+ ~TrayIcon()
+ {Remove();}
+
+ void Add(HICON hIcon, LPCTSTR tooltip=NULL)
+ {Set(NIM_ADD, _id, hIcon, tooltip);}
+
+ void Modify(HICON hIcon, LPCTSTR tooltip=NULL)
+ {Set(NIM_MODIFY, _id, hIcon, tooltip);}
+
+ void Remove()
+ {
+ NOTIFYICONDATA nid = {
+ sizeof(NOTIFYICONDATA), // cbSize
+ _hparent, // hWnd
+ _id, // uID
+ };
+
+ Shell_NotifyIcon(NIM_DELETE, &nid);
+ }
+
+protected:
+ HWND _hparent;
+ UINT _id;
+
+ void Set(DWORD dwMessage, UINT id, HICON hIcon, LPCTSTR tooltip=NULL)
+ {
+ NOTIFYICONDATA nid = {
+ sizeof(NOTIFYICONDATA), // cbSize
+ _hparent, // hWnd
+ id, // uID
+ NIF_MESSAGE|NIF_ICON, // uFlags
+ PM_TRAYICON, // uCallbackMessage
+ hIcon // hIcon
+ };
+
+ if (tooltip)
+ lstrcpyn(nid.szTip, tooltip, COUNTOF(nid.szTip));
+
+ if (nid.szTip[0])
+ nid.uFlags |= NIF_TIP;
+
+ Shell_NotifyIcon(dwMessage, &nid);
+ }
+};
+
+
+template<typename BASE> struct TrayIconControllerTemplate : public BASE
+{
+ typedef BASE super;
+
+ TrayIconControllerTemplate(HWND hwnd) : BASE(hwnd),
+ WM_TASKBARCREATED(RegisterWindowMessage(WINMSG_TASKBARCREATED))
+ {
+ }
+
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+ {
+ if (nmsg == PM_TRAYICON) {
+ switch(lparam) {
+ case WM_MOUSEMOVE:
+ TrayMouseOver(wparam);
+ break;
+
+ case WM_LBUTTONDOWN:
+ TrayClick(wparam, TRAYBUTTON_LEFT);
+ break;
+
+ case WM_LBUTTONDBLCLK:
+ TrayDblClick(wparam, TRAYBUTTON_LEFT);
+ break;
+
+ case WM_RBUTTONDOWN:
+ TrayClick(wparam, TRAYBUTTON_RIGHT);
+ break;
+
+ case WM_RBUTTONDBLCLK:
+ TrayDblClick(wparam, TRAYBUTTON_RIGHT);
+ break;
+
+ case WM_MBUTTONDOWN:
+ TrayClick(wparam, TRAYBUTTON_MIDDLE);
+ break;
+
+ case WM_MBUTTONDBLCLK:
+ TrayDblClick(wparam, TRAYBUTTON_MIDDLE);
+ break;
+ }
+
+ return 0;
+ } else if (nmsg == WM_TASKBARCREATED) {
+ AddTrayIcons();
+ return 0;
+ } else
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+
+ virtual void AddTrayIcons() = 0;
+ virtual void TrayMouseOver(UINT id) {}
+ virtual void TrayClick(UINT id, int btn) {}
+ virtual void TrayDblClick(UINT id, int btn) {}
+
+protected:
+ const UINT WM_TASKBARCREATED;
+};
+
+
+struct EditController : public SubclassedWindow
+{
+ typedef SubclassedWindow super;
+
+ EditController(HWND hwnd)
+ : super(hwnd)
+ {
+ }
+
+protected:
+ LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
+ {
+ if (nmsg==WM_KEYDOWN && wparam==VK_RETURN) {
+ SendParent(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(_hwnd),1), (LPARAM)_hwnd);
+ return 0;
+ } else
+ return super::WndProc(nmsg, wparam, lparam);
+ }
+};
--- /dev/null
+
+ //
+ // XML storage classes
+ //
+ // xmlstorage.cpp
+ //
+ // Copyright (c) 2004, 2005 Martin Fuchs <martin-fuchs@gmx.net>
+ //
+
+
+/*
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+#ifndef _NO_COMMENT
+#define _NO_COMMENT // no #pragma comment(lib, ...) statements in .lib files
+#endif
+
+//#include "xmlstorage.h"
+#include <precomp.h>
+
+
+ // work around GCC's wide string constant bug
+#ifdef __GNUC__
+const LPCXSSTR XMLStorage::XS_TRUE = XS_TRUE_STR;
+const LPCXSSTR XMLStorage::XS_FALSE = XS_FALSE_STR;
+const LPCXSSTR XMLStorage::XS_NUMBERFMT = XS_NUMBERFMT_STR;
+#endif
+
+
+namespace XMLStorage {
+
+
+ /// remove escape characters from zero terminated string
+static std::string unescape(const char* s, char b='"', char e='"')
+{
+ const char* end = s + strlen(s);
+
+// if (*s == b)
+// ++s;
+//
+// if (end>s && end[-1]==e)
+// --end;
+
+ if (*s == b)
+ if (end>s && end[-1]==e)
+ ++s, --end;
+
+ return std::string(s, end-s);
+}
+
+ /// remove escape characters from string with specified length
+static std::string unescape(const char* s, int l, char b='"', char e='"')
+{
+ const char* end = s + l;
+
+// if (*s == b)
+// ++s;
+//
+// if (end>s && end[-1]==e)
+// --end;
+
+ if (*s == b)
+ if (end>s && end[-1]==e)
+ ++s, --end;
+
+ return std::string(s, end-s);
+}
+
+
+ /// move XPath like to position in XML tree
+bool XMLPos::go(const char* path)
+{
+ XMLNode* node = _cur;
+
+ // Is this an absolute path?
+ if (*path == '/') {
+ node = _root;
+ ++path;
+ }
+
+ node = node->find_relative(path);
+
+ if (node) {
+ go_to(node);
+ return true;
+ } else
+ return false;
+}
+
+ /// move XPath like to position in XML tree
+bool const_XMLPos::go(const char* path)
+{
+ const XMLNode* node = _cur;
+
+ // Is this an absolute path?
+ if (*path == '/') {
+ node = _root;
+ ++path;
+ }
+
+ node = node->find_relative(path);
+
+ if (node) {
+ go_to(node);
+ return true;
+ } else
+ return false;
+}
+
+
+const XMLNode* XMLNode::find_relative(const char* path) const
+{
+ const XMLNode* node = this;
+
+ // parse relative path
+ while(*path) {
+ const char* slash = strchr(path, '/');
+ if (slash == path)
+ return NULL;
+
+ int l = slash? slash-path: strlen(path);
+ std::string comp(path, l);
+ path += l;
+
+ // look for [n] and [@attr_name="attr_value"] expressions in path components
+ const char* bracket = strchr(comp.c_str(), '[');
+ l = bracket? bracket-comp.c_str(): comp.length();
+ std::string child_name(comp.c_str(), l);
+ std::string attr_name, attr_value;
+
+ int n = 0;
+ if (bracket) {
+ std::string expr = unescape(bracket, '[', ']');
+ const char* p = expr.c_str();
+
+ n = atoi(p); // read index number
+
+ if (n)
+ n = n - 1; // convert into zero based index
+
+ const char* at = strchr(p, '@');
+
+ if (at) {
+ p = at + 1;
+ const char* equal = strchr(p, '=');
+
+ // read attribute name and value
+ if (equal) {
+ attr_name = unescape(p, equal-p);
+ attr_value = unescape(equal+1);
+ }
+ }
+ }
+
+ if (attr_name.empty())
+ // search n.th child node with specified name
+ node = node->find(child_name, n);
+ else
+ // search n.th child node with specified name and matching attribute value
+ node = node->find(child_name, attr_name, attr_value, n);
+
+ if (!node)
+ return NULL;
+
+ if (*path == '/')
+ ++path;
+ }
+
+ return node;
+}
+
+XMLNode* XMLNode::create_relative(const char* path)
+{
+ XMLNode* node = this;
+
+ // parse relative path
+ while(*path) {
+ const char* slash = strchr(path, '/');
+ if (slash == path)
+ return NULL;
+
+ int l = slash? slash-path: strlen(path);
+ std::string comp(path, l);
+ path += l;
+
+ // look for [n] and [@attr_name="attr_value"] expressions in path components
+ const char* bracket = strchr(comp.c_str(), '[');
+ l = bracket? bracket-comp.c_str(): comp.length();
+ std::string child_name(comp.c_str(), l);
+ std::string attr_name, attr_value;
+
+ int n = 0;
+ if (bracket) {
+ std::string expr = unescape(bracket, '[', ']');
+ const char* p = expr.c_str();
+
+ n = atoi(p); // read index number
+
+ if (n)
+ n = n - 1; // convert into zero based index
+
+ const char* at = strchr(p, '@');
+
+ if (at) {
+ p = at + 1;
+ const char* equal = strchr(p, '=');
+
+ // read attribute name and value
+ if (equal) {
+ attr_name = unescape(p, equal-p);
+ attr_value = unescape(equal+1);
+ }
+ }
+ }
+
+ XMLNode* child;
+
+ if (attr_name.empty())
+ // search n.th child node with specified name
+ child = node->find(child_name, n);
+ else
+ // search n.th child node with specified name and matching attribute value
+ child = node->find(child_name, attr_name, attr_value, n);
+
+ if (!child) {
+ child = new XMLNode(child_name);
+ node->add_child(child);
+
+ if (!attr_name.empty())
+ (*node)[attr_name] = attr_value;
+ }
+
+ node = child;
+
+ if (*path == '/')
+ ++path;
+ }
+
+ return node;
+}
+
+
+ /// read XML stream into XML tree below _pos
+XML_Status XMLReaderBase::read()
+{
+ XML_Status status = XML_STATUS_OK;
+
+ while(status == XML_STATUS_OK) {
+ char* buffer = (char*) XML_GetBuffer(_parser, BUFFER_LEN);
+
+ int l = read_buffer(buffer, BUFFER_LEN);
+ if (l < 0)
+ break;
+
+ status = XML_ParseBuffer(_parser, l, false);
+ }
+
+ if (status != XML_STATUS_ERROR)
+ status = XML_ParseBuffer(_parser, 0, true);
+
+ if (_pos->_children.empty())
+ _pos->_trailing.append(_content);
+ else
+ _pos->_children.back()->_trailing.append(_content);
+
+ _content.erase();
+
+ return status;
+}
+
+
+ /// store XML version and encoding into XML reader
+void XMLCALL XMLReaderBase::XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone)
+{
+ XMLReaderBase* pReader = (XMLReaderBase*) userData;
+
+ if (version)
+ pReader->_xml_version = version;
+
+ if (encoding)
+ pReader->_encoding = encoding;
+}
+
+ /// notifications about XML start tag
+void XMLCALL XMLReaderBase::XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts)
+{
+ XMLReaderBase* pReader = (XMLReaderBase*) userData;
+ XMLPos& pos = pReader->_pos;
+
+ // search for end of first line
+ const char* s = pReader->_content.c_str();
+ const char* p = s;
+ const char* e = p + pReader->_content.length();
+
+ for(; p<e; ++p)
+ if (*p == '\n') {
+ ++p;
+ break;
+ }
+
+ if (p != s)
+ if (pos->_children.empty()) { // no children in last node?
+ if (pReader->_last_tag == TAG_START)
+ pos->_content.append(s, p-s);
+ else if (pReader->_last_tag == TAG_END)
+ pos->_trailing.append(s, p-s);
+ // else TAG_NONE -> don't store white space in root node
+ } else
+ pos->_children.back()->_trailing.append(s, p-s);
+
+ std::string leading;
+
+ if (p != e)
+ leading.assign(p, e-p);
+
+ XMLNode* node = new XMLNode(String_from_XML_Char(name), leading);
+
+ pos.add_down(node);
+
+ while(*atts) {
+ const XML_Char* attr_name = *atts++;
+ const XML_Char* attr_value = *atts++;
+
+ (*node)[String_from_XML_Char(attr_name)] = String_from_XML_Char(attr_value);
+ }
+
+ pReader->_last_tag = TAG_START;
+ pReader->_content.erase();
+}
+
+ /// notifications about XML end tag
+void XMLCALL XMLReaderBase::XML_EndElementHandler(void* userData, const XML_Char* name)
+{
+ XMLReaderBase* pReader = (XMLReaderBase*) userData;
+ XMLPos& pos = pReader->_pos;
+
+ // search for end of first line
+ const char* s = pReader->_content.c_str();
+ const char* p = s;
+ const char* e = p + pReader->_content.length();
+
+ for(; p<e; ++p)
+ if (*p == '\n') {
+ ++p;
+ break;
+ }
+
+ if (p != s)
+ if (pos->_children.empty()) // no children in current node?
+ pos->_content.append(s, p-s);
+ else
+ if (pReader->_last_tag == TAG_START)
+ pos->_content.append(s, p-s);
+ else
+ pos->_children.back()->_trailing.append(s, p-s);
+
+ if (p != e)
+ pos->_end_leading.assign(p, e-p);
+
+ pos.back();
+
+ pReader->_last_tag = TAG_END;
+ pReader->_content.erase();
+}
+
+ /// store content, white space and comments
+void XMLCALL XMLReaderBase::XML_DefaultHandler(void* userData, const XML_Char* s, int len)
+{
+ XMLReaderBase* pReader = (XMLReaderBase*) userData;
+
+ pReader->_content.append(s, len);
+}
+
+
+ /// return error strings for Expat errors
+std::string XMLReaderBase::get_error_string() const
+{
+ XML_Error error = XML_GetErrorCode(_parser);
+
+ switch(error) {
+ case XML_ERROR_NONE: return "XML_ERROR_NONE";
+ case XML_ERROR_NO_MEMORY: return "XML_ERROR_NO_MEMORY";
+ case XML_ERROR_SYNTAX: return "XML_ERROR_SYNTAX";
+ case XML_ERROR_NO_ELEMENTS: return "XML_ERROR_NO_ELEMENTS";
+ case XML_ERROR_INVALID_TOKEN: return "XML_ERROR_INVALID_TOKEN";
+ case XML_ERROR_UNCLOSED_TOKEN: return "XML_ERROR_UNCLOSED_TOKEN";
+ case XML_ERROR_PARTIAL_CHAR: return "XML_ERROR_PARTIAL_CHAR";
+ case XML_ERROR_TAG_MISMATCH: return "XML_ERROR_TAG_MISMATCH";
+ case XML_ERROR_DUPLICATE_ATTRIBUTE: return "XML_ERROR_DUPLICATE_ATTRIBUTE";
+ case XML_ERROR_JUNK_AFTER_DOC_ELEMENT: return "XML_ERROR_JUNK_AFTER_DOC_ELEMENT";
+ case XML_ERROR_PARAM_ENTITY_REF: return "XML_ERROR_PARAM_ENTITY_REF";
+ case XML_ERROR_UNDEFINED_ENTITY: return "XML_ERROR_UNDEFINED_ENTITY";
+ case XML_ERROR_RECURSIVE_ENTITY_REF: return "XML_ERROR_RECURSIVE_ENTITY_REF";
+ case XML_ERROR_ASYNC_ENTITY: return "XML_ERROR_ASYNC_ENTITY";
+ case XML_ERROR_BAD_CHAR_REF: return "XML_ERROR_BAD_CHAR_REF";
+ case XML_ERROR_BINARY_ENTITY_REF: return "XML_ERROR_BINARY_ENTITY_REF";
+ case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF: return "XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF";
+ case XML_ERROR_MISPLACED_XML_PI: return "XML_ERROR_MISPLACED_XML_PI";
+ case XML_ERROR_UNKNOWN_ENCODING: return "XML_ERROR_UNKNOWN_ENCODING";
+ case XML_ERROR_INCORRECT_ENCODING: return "XML_ERROR_INCORRECT_ENCODING";
+ case XML_ERROR_UNCLOSED_CDATA_SECTION: return "XML_ERROR_UNCLOSED_CDATA_SECTION";
+ case XML_ERROR_EXTERNAL_ENTITY_HANDLING: return "XML_ERROR_EXTERNAL_ENTITY_HANDLING";
+ case XML_ERROR_NOT_STANDALONE: return "XML_ERROR_NOT_STANDALONE";
+ case XML_ERROR_UNEXPECTED_STATE: return "XML_ERROR_UNEXPECTED_STATE";
+ case XML_ERROR_ENTITY_DECLARED_IN_PE: return "XML_ERROR_ENTITY_DECLARED_IN_PE";
+ case XML_ERROR_FEATURE_REQUIRES_XML_DTD: return "XML_ERROR_FEATURE_REQUIRES_XML_DTD";
+ case XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING: return "XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING";
+ case XML_ERROR_UNBOUND_PREFIX: return "XML_ERROR_UNBOUND_PREFIX";
+ // EXPAT version >= 1.95.8
+#if XML_MAJOR_VERSION>1 || (XML_MAJOR_VERSION==1 && XML_MINOR_VERSION>95) || (XML_MAJOR_VERSION==1 && XML_MINOR_VERSION==95 && XML_MICRO_VERSION>7)
+ case XML_ERROR_UNDECLARING_PREFIX: return "XML_ERROR_UNDECLARING_PREFIX";
+ case XML_ERROR_INCOMPLETE_PE: return "XML_ERROR_INCOMPLETE_PE";
+ case XML_ERROR_XML_DECL: return "XML_ERROR_XML_DECL";
+ case XML_ERROR_TEXT_DECL: return "XML_ERROR_TEXT_DECL";
+ case XML_ERROR_PUBLICID: return "XML_ERROR_PUBLICID";
+ case XML_ERROR_SUSPENDED: return "XML_ERROR_SUSPENDED";
+ case XML_ERROR_NOT_SUSPENDED: return "XML_ERROR_NOT_SUSPENDED";
+ case XML_ERROR_ABORTED: return "XML_ERROR_ABORTED";
+ case XML_ERROR_FINISHED: return "XML_ERROR_FINISHED";
+ case XML_ERROR_SUSPEND_PE: return "XML_ERROR_SUSPEND_PE";
+#endif
+#if XML_MAJOR_VERSION>=2
+ /* Added in 2.0. */
+ case XML_ERROR_RESERVED_PREFIX_XML: return "XML_ERROR_RESERVED_PREFIX_XML";
+ case XML_ERROR_RESERVED_PREFIX_XMLNS: return "XML_ERROR_RESERVED_PREFIX_XMLNS";
+ case XML_ERROR_RESERVED_NAMESPACE_URI: return "XML_ERROR_RESERVED_NAMESPACE_URI";
+#endif
+ }
+
+ std::ostringstream out;
+
+ out << "XML parser error #" << error;
+
+ return out.str();
+}
+
+
+ /// encode XML string literals
+std::string EncodeXMLString(const XS_String& str)
+{
+ LPCXSSTR s = str.c_str();
+ LPXSSTR buffer = (LPXSSTR)alloca(6*sizeof(XS_CHAR)*XS_len(s)); // worst case """ / "'"
+ LPXSSTR o = buffer;
+
+ for(LPCXSSTR p=s; *p; ++p)
+ switch(*p) {
+ case '&':
+ *o++ = '&'; *o++ = 'a'; *o++ = 'm'; *o++ = 'p'; *o++ = ';';
+ break;
+
+ case '<':
+ *o++ = '&'; *o++ = 'l'; *o++ = 't'; *o++ = ';';
+ break;
+
+ case '>':
+ *o++ = '&'; *o++ = 'g'; *o++ = 't'; *o++ = ';';
+ break;
+
+ case '"':
+ *o++ = '&'; *o++ = 'q'; *o++ = 'u'; *o++ = 'o'; *o++ = 't'; *o++ = ';';
+ break;
+
+ case '\'':
+ *o++ = '&'; *o++ = 'a'; *o++ = 'p'; *o++ = 'o'; *o++ = 's'; *o++ = ';';
+ break;
+
+ default:
+ if ((unsigned)*p<20 && *p!='\t' && *p!='\r' && *p!='\n') {
+ char b[16];
+ sprintf(b, "&%d;", (unsigned)*p);
+ for(const char*q=b; *q; )
+ *o++ = *q++;
+ } else
+ *o++ = *p;
+ }
+
+#ifdef XS_STRING_UTF8
+ return XS_String(buffer, o-buffer);
+#else
+ return get_utf8(buffer, o-buffer);
+#endif
+}
+
+ /// decode XML string literals
+XS_String DecodeXMLString(const XS_String& str)
+{
+ LPCXSSTR s = str.c_str();
+ LPXSSTR buffer = (LPXSSTR)alloca(sizeof(XS_CHAR)*XS_len(s));
+ LPXSSTR o = buffer;
+
+ for(LPCXSSTR p=s; *p; ++p)
+ if (*p == '&') {
+ if (!XS_nicmp(p+1, XS_TEXT("lt;"), 3)) {
+ *o++ = '<';
+ p += 3;
+ } else if (!XS_nicmp(p+1, XS_TEXT("gt;"), 3)) {
+ *o++ = '>';
+ p += 3;
+ } else if (!XS_nicmp(p+1, XS_TEXT("amp;"), 4)) {
+ *o++ = '&';
+ p += 4;
+ } else if (!XS_nicmp(p+1, XS_TEXT("quot;"), 5)) {
+ *o++ = '"';
+ p += 5;
+ } else if (!XS_nicmp(p+1, XS_TEXT("apos;"), 5)) {
+ *o++ = '\'';
+ p += 5;
+ } else
+ *o++ = *p;
+ } else
+ *o++ = *p;
+
+ return XS_String(buffer, o-buffer);
+}
+
+
+ /// write node with children tree to output stream using original white space
+void XMLNode::write_worker(std::ostream& out, int indent) const
+{
+ out << _leading << '<' << EncodeXMLString(*this);
+
+ for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it)
+ out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\"";
+
+ if (!_children.empty() || !_content.empty()) {
+ out << '>' << _content;
+
+ for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
+ (*it)->write_worker(out, indent+1);
+
+ out << _end_leading << "</" << EncodeXMLString(*this) << '>';
+ } else
+ out << "/>";
+
+ out << _trailing;
+}
+
+
+ /// pretty print node with children tree to output stream
+void XMLNode::pretty_write_worker(std::ostream& out, int indent) const
+{
+ for(int i=indent; i--; )
+ out << XML_INDENT_SPACE;
+
+ out << '<' << EncodeXMLString(*this);
+
+ for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it)
+ out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\"";
+
+ if (!_children.empty() || !_content.empty()) {
+ out << ">\n";
+
+ for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
+ (*it)->pretty_write_worker(out, indent+1);
+
+ for(int i=indent; i--; )
+ out << XML_INDENT_SPACE;
+
+ out << "</" << EncodeXMLString(*this) << ">\n";
+ } else
+ out << "/>\n";
+}
+
+
+ /// write node with children tree to output stream using smart formating
+void XMLNode::smart_write_worker(std::ostream& out, int indent) const
+{
+ if (_leading.empty())
+ for(int i=indent; i--; )
+ out << XML_INDENT_SPACE;
+ else
+ out << _leading;
+
+ out << '<' << EncodeXMLString(*this);
+
+ for(AttributeMap::const_iterator it=_attributes.begin(); it!=_attributes.end(); ++it)
+ out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\"";
+
+ if (_children.empty() && _content.empty())
+ out << "/>";
+ else {
+ out << '>';
+
+ if (_content.empty())
+ out << '\n';
+ else
+ out << _content;
+
+ Children::const_iterator it = _children.begin();
+
+ if (it != _children.end()) {
+ for(; it!=_children.end(); ++it)
+ (*it)->smart_write_worker(out, indent+1);
+
+ if (_end_leading.empty())
+ for(int i=indent; i--; )
+ out << XML_INDENT_SPACE;
+ else
+ out << _end_leading;
+ } else
+ out << _end_leading;
+
+ out << "</" << EncodeXMLString(*this) << '>';
+ }
+
+ if (_trailing.empty())
+ out << '\n';
+ else
+ out << _trailing;
+}
+
+
+} // namespace XMLStorage
--- /dev/null
+
+ //
+ // XML storage classes
+ //
+ // xmlstorage.h
+ //
+ // Copyright (c) 2004, 2005 Martin Fuchs <martin-fuchs@gmx.net>
+ //
+
+
+/*
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+#ifndef _XMLSTORAGE_H
+
+#include <expat/expat.h>
+
+#ifdef _MSC_VER
+#pragma comment(lib, "libexpat.lib")
+#pragma warning(disable: 4786)
+#endif
+
+
+#include <windows.h> // for LPCTSTR
+
+#ifdef UNICODE
+#define _UNICODE
+#endif
+
+#include <tchar.h>
+#include <malloc.h>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <stack>
+#include <list>
+#include <map>
+
+
+#ifndef BUFFER_LEN
+#define BUFFER_LEN 2048
+#endif
+
+
+namespace XMLStorage {
+
+
+#ifndef XS_String
+
+#ifdef XS_STRING_UTF8
+#define XS_CHAR char
+#define XS_TEXT(x) x
+#define LPXSSTR LPSTR
+#define LPCXSSTR LPCSTR
+#define XS_icmp stricmp
+#define XS_nicmp strnicmp
+#define XS_toi atoi
+#define XS_len strlen
+#define XS_snprintf snprintf
+#define XS_vsnprintf vsnprintf
+#else
+#define XS_CHAR TCHAR
+#define XS_TEXT(x) TEXT(x)
+#define LPXSSTR LPTSTR
+#define LPCXSSTR LPCTSTR
+#define XS_icmp _tcsicmp
+#define XS_nicmp _tcsnicmp
+#define XS_toi _ttoi
+#define XS_len _tcslen
+#define XS_snprintf _sntprintf
+#define XS_vsnprintf _vsntprintf
+#endif
+
+#ifndef COUNTOF
+#define COUNTOF(b) (sizeof(b)/sizeof(b[0]))
+#endif
+
+#if defined(_STRING_DEFINED) && !defined(XS_STRING_UTF8)
+
+#define XS_String String
+
+#else // _STRING_DEFINED, !XS_STRING_UTF8
+
+ /// string class for TCHAR strings
+
+struct XS_String
+#if defined(UNICODE) && !defined(XS_STRING_UTF8)
+ : public std::wstring
+#else
+ : public std::string
+#endif
+{
+#if defined(UNICODE) && !defined(XS_STRING_UTF8)
+ typedef std::wstring super;
+#else
+ typedef std::string super;
+#endif
+
+ XS_String() {}
+
+ XS_String(LPCXSSTR s) {if (s) super::assign(s);}
+ XS_String(LPCXSSTR s, size_t l) : super(s, l) {}
+
+ XS_String(const super& other) : super(other) {}
+ XS_String(const XS_String& other) : super(other) {}
+
+#if defined(UNICODE) && !defined(XS_STRING_UTF8)
+ XS_String(LPCSTR s) {assign(s);}
+ XS_String(LPCSTR s, size_t l) {assign(s, l);}
+ XS_String(const std::string& other) {assign(other.c_str());}
+ XS_String& operator=(LPCSTR s) {assign(s); return *this;}
+ void assign(LPCSTR s) {if (s) {size_t bl=strlen(s); LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, bl, b, bl));} else erase();}
+ void assign(LPCSTR s, size_t l) {if (s) {size_t bl=l; LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); super::assign(b, MultiByteToWideChar(CP_ACP, 0, s, l, b, bl));} else erase();}
+#else
+ XS_String(LPCWSTR s) {assign(s);}
+ XS_String(LPCWSTR s, size_t l) {assign(s, l);}
+ XS_String(const std::wstring& other) {assign(other.c_str());}
+ XS_String& operator=(LPCWSTR s) {assign(s); return *this;}
+#ifdef XS_STRING_UTF8
+ void assign(const XS_String& s) {assign(s.c_str());}
+ void assign(LPCWSTR s) {if (s) {size_t bl=wcslen(s); LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_UTF8, 0, s, (int)bl, b, (int)bl, 0, 0));} else erase();}
+ void assign(LPCWSTR s, size_t l) {size_t bl=l; if (s) {LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_UTF8, 0, s, (int)l, b, (int)bl, 0, 0));} else erase();}
+#else // if !UNICODE && !XS_STRING_UTF8
+ void assign(LPCWSTR s) {if (s) {size_t bl=wcslen(s); LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, (int)bl, b, (int)bl, 0, 0));} else erase();}
+ void assign(LPCWSTR s, size_t l) {size_t bl=l; if (s) {LPSTR b=(LPSTR)alloca(bl); super::assign(b, WideCharToMultiByte(CP_ACP, 0, s, (int)l, b, (int)bl, 0, 0));} else erase();}
+#endif
+#endif
+
+ XS_String& operator=(LPCXSSTR s) {if (s) super::assign(s); else erase(); return *this;}
+ XS_String& operator=(const super& s) {super::assign(s); return *this;}
+ void assign(LPCXSSTR s) {super::assign(s);}
+ void assign(LPCXSSTR s, size_t l) {super::assign(s, l);}
+
+ operator LPCXSSTR() const {return c_str();}
+
+#ifdef XS_STRING_UTF8
+ operator std::wstring() const {size_t bl=length(); LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); return std::wstring(b, MultiByteToWideChar(CP_UTF8, 0, c_str(), bl, b, bl));}
+#elif defined(UNICODE)
+ operator std::string() const {size_t bl=length(); LPSTR b=(LPSTR)alloca(bl); return std::string(b, WideCharToMultiByte(CP_ACP, 0, c_str(), bl, b, bl, 0, 0));}
+#else
+ operator std::wstring() const {size_t bl=length(); LPWSTR b=(LPWSTR)alloca(sizeof(WCHAR)*bl); return std::wstring(b, MultiByteToWideChar(CP_ACP, 0, c_str(), (int)bl, b, (int)bl));}
+#endif
+
+ XS_String& printf(LPCXSSTR fmt, ...)
+ {
+ va_list l;
+ XS_CHAR b[BUFFER_LEN];
+
+ va_start(l, fmt);
+ super::assign(b, XS_vsnprintf(b, COUNTOF(b), fmt, l));
+ va_end(l);
+
+ return *this;
+ }
+
+ XS_String& vprintf(LPCXSSTR fmt, va_list l)
+ {
+ XS_CHAR b[BUFFER_LEN];
+
+ super::assign(b, XS_vsnprintf(b, COUNTOF(b), fmt, l));
+
+ return *this;
+ }
+
+ XS_String& appendf(LPCXSSTR fmt, ...)
+ {
+ va_list l;
+ XS_CHAR b[BUFFER_LEN];
+
+ va_start(l, fmt);
+ super::append(b, XS_vsnprintf(b, COUNTOF(b), fmt, l));
+ va_end(l);
+
+ return *this;
+ }
+
+ XS_String& vappendf(LPCXSSTR fmt, va_list l)
+ {
+ XS_CHAR b[BUFFER_LEN];
+
+ super::append(b, XS_vsnprintf(b, COUNTOF(b), fmt, l));
+
+ return *this;
+ }
+};
+
+#endif // _STRING_DEFINED, !XS_STRING_UTF8
+
+#endif // XS_String
+
+
+#ifndef XS_STRING_UTF8
+
+inline void assign_utf8(XS_String& s, const char* str)
+{
+ int lutf8 = (int)strlen(str);
+
+#ifdef UNICODE
+ LPTSTR buffer = (LPTSTR)alloca(sizeof(TCHAR)*lutf8);
+ int l = MultiByteToWideChar(CP_UTF8, 0, str, lutf8, buffer, lutf8);
+#else
+ LPWSTR wbuffer = (LPWSTR)alloca(sizeof(WCHAR)*lutf8);
+ int l = MultiByteToWideChar(CP_UTF8, 0, str, lutf8, wbuffer, lutf8);
+
+ int bl=2*l; LPSTR buffer = (LPSTR)alloca(bl);
+ l = WideCharToMultiByte(CP_ACP, 0, wbuffer, l, buffer, bl, 0, 0);
+#endif
+
+ s.assign(buffer, l);
+}
+
+inline std::string get_utf8(LPCTSTR s, size_t l)
+{
+#ifdef UNICODE
+ size_t bl=2*l; LPSTR buffer = (LPSTR)alloca(bl);
+ l = WideCharToMultiByte(CP_UTF8, 0, s, (int)l, buffer, (int)bl, 0, 0);
+#else
+ LPWSTR wbuffer = (LPWSTR)alloca(sizeof(WCHAR)*l);
+ l = MultiByteToWideChar(CP_ACP, 0, s, (int)l, wbuffer, (int)l);
+
+ size_t bl=2*l; LPSTR buffer = (LPSTR)alloca(bl);
+ l = WideCharToMultiByte(CP_UTF8, 0, wbuffer, (int)l, buffer, (int)bl, 0, 0);
+#endif
+
+ return std::string(buffer, l);
+}
+
+inline std::string get_utf8(const XS_String& s)
+{
+ return get_utf8(s.c_str(), s.length());
+}
+
+#endif // XS_STRING_UTF8
+
+extern std::string EncodeXMLString(const XS_String& str);
+extern XS_String DecodeXMLString(const XS_String& str);
+
+
+#ifdef __GNUC__
+#include <ext/stdio_filebuf.h>
+typedef __gnu_cxx::stdio_filebuf<char> STDIO_FILEBUF;
+#else
+typedef std::filebuf STDIO_FILEBUF;
+#endif
+
+
+struct FileHolder
+{
+ FileHolder(LPCTSTR path, LPCTSTR mode)
+ {
+#ifdef __STDC_WANT_SECURE_LIB__ // secure CRT functions using VS 2005
+ if (_tfopen_s(&_pfile, path, mode) != 0)
+ _pfile = NULL;
+#else
+ _pfile = _tfopen(path, mode);
+#endif
+ }
+
+ ~FileHolder()
+ {
+ if (_pfile)
+ fclose(_pfile);
+ }
+
+protected:
+ FILE* _pfile;
+};
+
+ /// input file stream with ANSI/UNICODE file names
+struct tifstream : public std::istream, FileHolder
+{
+ typedef std::istream super;
+
+ tifstream(LPCTSTR path)
+ : super(&_buf),
+ FileHolder(path, TEXT("r")),
+#ifdef __GNUC__
+ _buf(_pfile, ios::in)
+#else
+ _buf(_pfile)
+#endif
+ {
+ }
+
+protected:
+ STDIO_FILEBUF _buf;
+};
+
+ /// output file stream with ANSI/UNICODE file names
+struct tofstream : public std::ostream, FileHolder
+{
+ typedef std::ostream super;
+
+ tofstream(LPCTSTR path)
+ : super(&_buf),
+ FileHolder(path, TEXT("w")),
+#ifdef __GNUC__
+ _buf(_pfile, ios::out)
+#else
+ _buf(_pfile)
+#endif
+ {
+ }
+
+ ~tofstream()
+ {
+ flush();
+ }
+
+protected:
+ STDIO_FILEBUF _buf;
+};
+
+
+ // write XML files with 2 spaces indenting
+#define XML_INDENT_SPACE " "
+
+
+#ifdef XML_UNICODE // Are XML_Char strings UTF-16 encoded?
+
+typedef XS_String String_from_XML_Char;
+
+#elif defined(XS_STRING_UTF8)
+
+typedef XS_String String_from_XML_Char;
+
+#else
+
+ /// converter from Expat strings to XMLStorage internal strings
+struct String_from_XML_Char : public XS_String
+{
+ String_from_XML_Char(const XML_Char* str)
+ {
+ assign_utf8(*this, str);
+ }
+};
+
+#endif
+
+
+#if defined(UNICODE) && !defined(XS_STRING_UTF8)
+
+ // optimization for faster UNICODE/ASCII string comparison without temporary A/U conversion
+inline bool operator==(const XS_String& s1, const char* s2)
+{
+ LPCWSTR p = s1;
+ const unsigned char* q = (const unsigned char*)s2;
+
+ while(*p && *q)
+ if (*p++ != *q++)
+ return false;
+
+ return *p == *q;
+};
+
+#endif
+
+
+ /// in memory representation of an XML node
+struct XMLNode : public XS_String
+{
+#if defined(UNICODE) && !defined(XS_STRING_UTF8)
+ // optimized read access without temporary A/U conversion when using ASCII attribute names
+ struct AttributeMap : public std::map<XS_String, XS_String>
+ {
+ typedef std::map<XS_String, XS_String> super;
+
+ const_iterator find(const char* x) const
+ {
+ for(const_iterator it=begin(); it!=end(); ++it)
+ if (it->first == x)
+ return it;
+
+ return end();
+ }
+
+ const_iterator find(const key_type& x) const
+ {
+ return super::find(x);
+ }
+
+ iterator find(const key_type& x)
+ {
+ return super::find(x);
+ }
+ };
+#else
+ typedef std::map<XS_String, XS_String> AttributeMap;
+#endif
+
+ /// internal children node list
+ struct Children : public std::list<XMLNode*>
+ {
+ void assign(const Children& other)
+ {
+ clear();
+
+ for(Children::const_iterator it=other.begin(); it!=other.end(); ++it)
+ push_back(new XMLNode(**it));
+ }
+
+ void clear()
+ {
+ while(!empty()) {
+ XMLNode* node = back();
+ pop_back();
+
+ node->clear();
+ delete node;
+ }
+ }
+ };
+
+ // access to protected class members for XMLPos and XMLReader
+ friend struct XMLPos;
+ friend struct const_XMLPos;
+ friend struct XMLReaderBase;
+
+ XMLNode(const XS_String& name)
+ : XS_String(name)
+ {
+ }
+
+ XMLNode(const XS_String& name, const std::string& leading)
+ : XS_String(name),
+ _leading(leading)
+ {
+ }
+
+ XMLNode(const XMLNode& other)
+ : _attributes(other._attributes),
+ _leading(other._leading),
+ _content(other._content),
+ _end_leading(other._end_leading),
+ _trailing(other._trailing)
+ {
+ for(Children::const_iterator it=other._children.begin(); it!=other._children.end(); ++it)
+ _children.push_back(new XMLNode(**it));
+ }
+
+ ~XMLNode()
+ {
+ while(!_children.empty()) {
+ delete _children.back();
+ _children.pop_back();
+ }
+ }
+
+ void clear()
+ {
+ _leading.erase();
+ _content.erase();
+ _end_leading.erase();
+ _trailing.erase();
+
+ _attributes.clear();
+ _children.clear();
+
+ XS_String::erase();
+ }
+
+ XMLNode& operator=(const XMLNode& other)
+ {
+ _children.assign(other._children);
+
+ _attributes = other._attributes;
+
+ _leading = other._leading;
+ _content = other._content;
+ _end_leading = other._end_leading;
+ _trailing = other._trailing;
+
+ return *this;
+ }
+
+ /// add a new child node
+ void add_child(XMLNode* child)
+ {
+ _children.push_back(child);
+ }
+
+ /// write access to an attribute
+ void put(const XS_String& attr_name, const XS_String& value)
+ {
+ _attributes[attr_name] = value;
+ }
+
+ /// C++ write access to an attribute
+ XS_String& operator[](const XS_String& attr_name)
+ {
+ return _attributes[attr_name];
+ }
+
+ /// read only access to an attribute
+ template<typename T> XS_String get(const T& attr_name) const
+ {
+ AttributeMap::const_iterator found = _attributes.find(attr_name);
+
+ if (found != _attributes.end())
+ return found->second;
+ else
+ return XS_String();
+ }
+
+ /// convenient value access in children node
+ XS_String subvalue(const XS_String& name, const XS_String& attr_name, int n=0) const
+ {
+ const XMLNode* node = find(name, n);
+
+ if (node)
+ return node->get(attr_name);
+ else
+ return XS_String();
+ }
+
+ /// convenient storage of distinct values in children node
+ XS_String& subvalue(const XS_String& name, const XS_String& attr_name, int n=0)
+ {
+ XMLNode* node = find(name, n);
+
+ if (!node) {
+ node = new XMLNode(name);
+ add_child(node);
+ }
+
+ return (*node)[attr_name];
+ }
+
+#if defined(UNICODE) && !defined(XS_STRING_UTF8)
+ /// convenient value access in children node
+ XS_String subvalue(const char* name, const char* attr_name, int n=0) const
+ {
+ const XMLNode* node = find(name, n);
+
+ if (node)
+ return node->get(attr_name);
+ else
+ return XS_String();
+ }
+
+ /// convenient storage of distinct values in children node
+ XS_String& subvalue(const char* name, const XS_String& attr_name, int n=0)
+ {
+ XMLNode* node = find(name, n);
+
+ if (!node) {
+ node = new XMLNode(name);
+ add_child(node);
+ }
+
+ return (*node)[attr_name];
+ }
+#endif
+
+ const Children& get_children() const
+ {
+ return _children;
+ }
+
+ Children& get_children()
+ {
+ return _children;
+ }
+
+ XS_String get_content() const
+ {
+#ifdef XS_STRING_UTF8
+ const XS_String& ret = _content;
+#else
+ XS_String ret;
+ assign_utf8(ret, _content.c_str());
+#endif
+
+ return DecodeXMLString(ret.c_str());
+ }
+
+ void set_content(const XS_String& s)
+ {
+ _content.assign(EncodeXMLString(s.c_str()));
+ }
+
+ enum WRITE_MODE {
+ FORMAT_SMART = 0, /// preserve original white space and comments if present; pretty print otherwise
+ FORMAT_ORIGINAL = 1, /// write XML stream preserving original white space and comments
+ FORMAT_PRETTY = 2 /// pretty print node to stream without preserving original white space
+ };
+
+ /// write node with children tree to output stream
+ std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART, int indent=0) const
+ {
+ switch(mode) {
+ case FORMAT_PRETTY:
+ pretty_write_worker(out, indent);
+ break;
+
+ case FORMAT_ORIGINAL:
+ write_worker(out, indent);
+ break;
+
+ default: // FORMAT_SMART
+ smart_write_worker(out, indent);
+ }
+
+ return out;
+ }
+
+protected:
+ Children _children;
+ AttributeMap _attributes;
+
+ std::string _leading;
+ std::string _content;
+ std::string _end_leading;
+ std::string _trailing;
+
+ XMLNode* get_first_child() const
+ {
+ if (!_children.empty())
+ return _children.front();
+ else
+ return NULL;
+ }
+
+ XMLNode* find(const XS_String& name, int n=0) const
+ {
+ for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
+ if (**it == name)
+ if (!n--)
+ return *it;
+
+ return NULL;
+ }
+
+ XMLNode* find(const XS_String& name, const XS_String& attr_name, const XS_String& attr_value, int n=0) const
+ {
+ for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) {
+ const XMLNode& node = **it;
+
+ if (node==name && node.get(attr_name)==attr_value)
+ if (!n--)
+ return *it;
+ }
+
+ return NULL;
+ }
+
+#if defined(UNICODE) && !defined(XS_STRING_UTF8)
+ XMLNode* find(const char* name, int n=0) const
+ {
+ for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it)
+ if (**it == name)
+ if (!n--)
+ return *it;
+
+ return NULL;
+ }
+
+ template<typename T, typename U>
+ XMLNode* find(const char* name, const T& attr_name, const U& attr_value, int n=0) const
+ {
+ for(Children::const_iterator it=_children.begin(); it!=_children.end(); ++it) {
+ const XMLNode& node = **it;
+
+ if (node==name && node.get(attr_name)==attr_value)
+ if (!n--)
+ return *it;
+ }
+
+ return NULL;
+ }
+#endif
+
+ /// XPath find function (const)
+ const XMLNode* find_relative(const char* path) const;
+
+ /// XPath find function
+ XMLNode* find_relative(const char* path)
+ {return const_cast<XMLNode*>(const_cast<const XMLNode*>(this)->find_relative(path));}
+
+ /// relative XPath create function
+ XMLNode* create_relative(const char* path);
+
+ void write_worker(std::ostream& out, int indent) const;
+ void pretty_write_worker(std::ostream& out, int indent) const;
+ void smart_write_worker(std::ostream& out, int indent) const;
+};
+
+
+ /// iterator access to children nodes with name filtering
+struct XMLChildrenFilter
+{
+ XMLChildrenFilter(XMLNode::Children& children, const XS_String& name)
+ : _begin(children.begin(), children.end(), name),
+ _end(children.end(), children.end(), name)
+ {
+ }
+
+ XMLChildrenFilter(XMLNode* node, const XS_String& name)
+ : _begin(node->get_children().begin(), node->get_children().end(), name),
+ _end(node->get_children().end(), node->get_children().end(), name)
+ {
+ }
+
+ /// internal iterator class
+ struct iterator
+ {
+ typedef XMLNode::Children::iterator BaseIterator;
+
+ iterator(BaseIterator begin, BaseIterator end, const XS_String& filter_name)
+ : _cur(begin),
+ _end(end),
+ _filter_name(filter_name)
+ {
+ search_next();
+ }
+
+ operator BaseIterator()
+ {
+ return _cur;
+ }
+
+ const XMLNode* operator*() const
+ {
+ return *_cur;
+ }
+
+ XMLNode* operator*()
+ {
+ return *_cur;
+ }
+
+ iterator& operator++()
+ {
+ ++_cur;
+ search_next();
+
+ return *this;
+ }
+
+ iterator operator++(int)
+ {
+ iterator ret = *this;
+
+ ++_cur;
+ search_next();
+
+ return ret;
+ }
+
+ bool operator==(const BaseIterator& other) const
+ {
+ return _cur == other;
+ }
+
+ bool operator!=(const BaseIterator& other) const
+ {
+ return _cur != other;
+ }
+
+ protected:
+ BaseIterator _cur;
+ BaseIterator _end;
+ XS_String _filter_name;
+
+ void search_next()
+ {
+ while(_cur!=_end && **_cur!=_filter_name)
+ ++_cur;
+ }
+ };
+
+ iterator begin()
+ {
+ return _begin;
+ }
+
+ iterator end()
+ {
+ return _end;
+ }
+
+protected:
+ iterator _begin;
+ iterator _end;
+};
+
+
+ /// read only iterator access to children nodes with name filtering
+struct const_XMLChildrenFilter
+{
+ const_XMLChildrenFilter(const XMLNode::Children& children, const XS_String& name)
+ : _begin(children.begin(), children.end(), name),
+ _end(children.end(), children.end(), name)
+ {
+ }
+
+ const_XMLChildrenFilter(const XMLNode* node, const XS_String& name)
+ : _begin(node->get_children().begin(), node->get_children().end(), name),
+ _end(node->get_children().end(), node->get_children().end(), name)
+ {
+ }
+
+ /// internal iterator class
+ struct const_iterator
+ {
+ typedef XMLNode::Children::const_iterator BaseIterator;
+
+ const_iterator(BaseIterator begin, BaseIterator end, const XS_String& filter_name)
+ : _cur(begin),
+ _end(end),
+ _filter_name(filter_name)
+ {
+ search_next();
+ }
+
+ operator BaseIterator()
+ {
+ return _cur;
+ }
+
+ const XMLNode* operator*() const
+ {
+ return *_cur;
+ }
+
+ const_iterator& operator++()
+ {
+ ++_cur;
+ search_next();
+
+ return *this;
+ }
+
+ const_iterator operator++(int)
+ {
+ const_iterator ret = *this;
+
+ ++_cur;
+ search_next();
+
+ return ret;
+ }
+
+ bool operator==(const BaseIterator& other) const
+ {
+ return _cur == other;
+ }
+
+ bool operator!=(const BaseIterator& other) const
+ {
+ return _cur != other;
+ }
+
+ protected:
+ BaseIterator _cur;
+ BaseIterator _end;
+ XS_String _filter_name;
+
+ void search_next()
+ {
+ while(_cur!=_end && **_cur!=_filter_name)
+ ++_cur;
+ }
+ };
+
+ const_iterator begin()
+ {
+ return _begin;
+ }
+
+ const_iterator end()
+ {
+ return _end;
+ }
+
+protected:
+ const_iterator _begin;
+ const_iterator _end;
+};
+
+
+ /// iterator for XML trees
+struct XMLPos
+{
+ XMLPos(XMLNode* root)
+ : _root(root),
+ _cur(root)
+ {
+ }
+
+ XMLPos(const XMLPos& other)
+ : _root(other._root),
+ _cur(other._cur)
+ { // don't copy _stack
+ }
+
+ XMLPos(XMLNode* node, const XS_String& name)
+ : _root(node),
+ _cur(node)
+ {
+ smart_create(name);
+ }
+
+ XMLPos(XMLNode* node, const XS_String& name, const XS_String& attr_name, const XS_String& attr_value)
+ : _root(node),
+ _cur(node)
+ {
+ smart_create(name, attr_name, attr_value);
+ }
+
+ XMLPos(const XMLPos& other, const XS_String& name)
+ : _root(other._root),
+ _cur(other._cur)
+ {
+ smart_create(name);
+ }
+
+ XMLPos(const XMLPos& other, const XS_String& name, const XS_String& attr_name, const XS_String& attr_value)
+ : _root(other._root),
+ _cur(other._cur)
+ {
+ smart_create(name, attr_name, attr_value);
+ }
+
+ /// access to current node
+ XMLNode& cur()
+ {
+ return *_cur;
+ }
+
+ const XMLNode& cur() const
+ {
+ return *_cur;
+ }
+
+ /// C++ access to current node
+ operator const XMLNode*() const {return _cur;}
+ operator XMLNode*() {return _cur;}
+
+ const XMLNode* operator->() const {return _cur;}
+ XMLNode* operator->() {return _cur;}
+
+ const XMLNode& operator*() const {return *_cur;}
+ XMLNode& operator*() {return *_cur;}
+
+ /// attribute access
+ XS_String get(const XS_String& attr_name) const
+ {
+ return _cur->get(attr_name);
+ }
+
+ /// attribute setting
+ void put(const XS_String& attr_name, const XS_String& value)
+ {
+ _cur->put(attr_name, value);
+ }
+
+ /// C++ attribute access
+ template<typename T> XS_String get(const T& attr_name) const {return (*_cur)[attr_name];}
+ XS_String& operator[](const XS_String& attr_name) {return (*_cur)[attr_name];}
+
+ /// insert children when building tree
+ void add_down(XMLNode* child)
+ {
+ _cur->add_child(child);
+ go_to(child);
+ }
+
+ /// go back to previous position
+ bool back()
+ {
+ if (!_stack.empty()) {
+ _cur = _stack.top();
+ _stack.pop();
+ return true;
+ } else
+ return false;
+ }
+
+ /// go down to first child
+ bool go_down()
+ {
+ XMLNode* node = _cur->get_first_child();
+
+ if (node) {
+ go_to(node);
+ return true;
+ } else
+ return false;
+ }
+
+ /// search for child and go down
+ bool go_down(const XS_String& name, int n=0)
+ {
+ XMLNode* node = _cur->find(name, n);
+
+ if (node) {
+ go_to(node);
+ return true;
+ } else
+ return false;
+ }
+
+ /// move XPath like to position in XML tree
+ bool go(const char* path);
+
+ /// create child nodes using XPath notation and move to the deepest child
+ bool create_relative(const char* path)
+ {
+ XMLNode* node = _cur->create_relative(path);
+ if (!node)
+ return false; // invalid path specified
+
+ go_to(node);
+ return true;
+ }
+
+ /// create node and move to it
+ void create(const XS_String& name)
+ {
+ add_down(new XMLNode(name));
+ }
+
+ /// create node if not already existing and move to it
+ void smart_create(const XS_String& name)
+ {
+ XMLNode* node = _cur->find(name);
+
+ if (node)
+ go_to(node);
+ else
+ add_down(new XMLNode(name));
+ }
+
+ /// search matching child node identified by key name and an attribute value
+ void smart_create(const XS_String& name, const XS_String& attr_name, const XS_String& attr_value)
+ {
+ XMLNode* node = _cur->find(name, attr_name, attr_value);
+
+ if (node)
+ go_to(node);
+ else {
+ node = new XMLNode(name);
+ add_down(node);
+ (*node)[attr_name] = attr_value;
+ }
+ }
+
+#if defined(UNICODE) && !defined(XS_STRING_UTF8)
+ /// search for child and go down
+ bool go_down(const char* name, int n=0)
+ {
+ XMLNode* node = _cur->find(name, n);
+
+ if (node) {
+ go_to(node);
+ return true;
+ } else
+ return false;
+ }
+
+ /// create node and move to it
+ void create(const char* name)
+ {
+ add_down(new XMLNode(name));
+ }
+
+ /// create node if not already existing and move to it
+ void smart_create(const char* name)
+ {
+ XMLNode* node = _cur->find(name);
+
+ if (node)
+ go_to(node);
+ else
+ add_down(new XMLNode(name));
+ }
+
+ /// search matching child node identified by key name and an attribute value
+ template<typename T, typename U>
+ void smart_create(const char* name, const T& attr_name, const U& attr_value)
+ {
+ XMLNode* node = _cur->find(name, attr_name, attr_value);
+
+ if (node)
+ go_to(node);
+ else {
+ XMLNode* node = new XMLNode(name);
+ add_down(node);
+ (*node)[attr_name] = attr_value;
+ }
+ }
+#endif
+
+ XS_String& str() {return *_cur;}
+ const XS_String& str() const {return *_cur;}
+
+protected:
+ XMLNode* _root;
+ XMLNode* _cur;
+ std::stack<XMLNode*> _stack;
+
+ /// go to specified node
+ void go_to(XMLNode* child)
+ {
+ _stack.push(_cur);
+ _cur = child;
+ }
+};
+
+
+ /// iterator for XML trees
+struct const_XMLPos
+{
+ const_XMLPos(const XMLNode* root)
+ : _root(root),
+ _cur(root)
+ {
+ }
+
+ const_XMLPos(const const_XMLPos& other)
+ : _root(other._root),
+ _cur(other._cur)
+ { // don't copy _stack
+ }
+
+ /// access to current node
+ const XMLNode& cur() const
+ {
+ return *_cur;
+ }
+
+ /// C++ access to current node
+ operator const XMLNode*() const {return _cur;}
+
+ const XMLNode* operator->() const {return _cur;}
+
+ const XMLNode& operator*() const {return *_cur;}
+
+ /// attribute access
+ XS_String get(const XS_String& attr_name) const
+ {
+ return _cur->get(attr_name);
+ }
+
+ /// C++ attribute access
+ template<typename T> XS_String get(const T& attr_name) const {return _cur->get(attr_name);}
+
+ /// go back to previous position
+ bool back()
+ {
+ if (!_stack.empty()) {
+ _cur = _stack.top();
+ _stack.pop();
+ return true;
+ } else
+ return false;
+ }
+
+ /// go down to first child
+ bool go_down()
+ {
+ const XMLNode* node = _cur->get_first_child();
+
+ if (node) {
+ go_to(node);
+ return true;
+ } else
+ return false;
+ }
+
+ /// search for child and go down
+ bool go_down(const XS_String& name, int n=0)
+ {
+ XMLNode* node = _cur->find(name, n);
+
+ if (node) {
+ go_to(node);
+ return true;
+ } else
+ return false;
+ }
+
+ /// move XPath like to position in XML tree
+ bool go(const char* path);
+
+#if defined(UNICODE) && !defined(XS_STRING_UTF8)
+ /// search for child and go down
+ bool go_down(const char* name, int n=0)
+ {
+ XMLNode* node = _cur->find(name, n);
+
+ if (node) {
+ go_to(node);
+ return true;
+ } else
+ return false;
+ }
+#endif
+
+ const XS_String& str() const {return *_cur;}
+
+protected:
+ const XMLNode* _root;
+ const XMLNode* _cur;
+ std::stack<const XMLNode*> _stack;
+
+ /// go to specified node
+ void go_to(const XMLNode* child)
+ {
+ _stack.push(_cur);
+ _cur = child;
+ }
+};
+
+
+#define XS_TRUE_STR XS_TEXT("true")
+#define XS_FALSE_STR XS_TEXT("false")
+#define XS_NUMBERFMT_STR XS_TEXT("%d")
+
+ // work around GCC's wide string constant bug
+#ifdef __GNUC__
+extern const LPCXSSTR XS_TRUE;
+extern const LPCXSSTR XS_FALSE;
+extern const LPCXSSTR XS_NUMBERFMT;
+#else
+#define XS_TRUE XS_TRUE_STR
+#define XS_FALSE XS_FALSE_STR
+#define XS_NUMBERFMT XS_NUMBERFMT_STR
+#endif
+
+
+ /// type converter for boolean data
+struct XMLBool
+{
+ XMLBool(bool value=false)
+ : _value(value)
+ {
+ }
+
+ XMLBool(LPCXSSTR value, bool def=false)
+ {
+ if (value && *value)
+ _value = !XS_icmp(value, XS_TRUE);
+ else
+ _value = def;
+ }
+
+ XMLBool(const XMLNode* node, const XS_String& attr_name, bool def=false)
+ {
+ const XS_String& value = node->get(attr_name);
+
+ if (!value.empty())
+ _value = !XS_icmp(value.c_str(), XS_TRUE);
+ else
+ _value = def;
+ }
+
+ operator bool() const
+ {
+ return _value;
+ }
+
+ bool operator!() const
+ {
+ return !_value;
+ }
+
+ operator LPCXSSTR() const
+ {
+ return _value? XS_TRUE: XS_FALSE;
+ }
+
+protected:
+ bool _value;
+
+private:
+ void operator=(const XMLBool&); // disallow assignment operations
+};
+
+ /// type converter for boolean data with write access
+struct XMLBoolRef
+{
+ XMLBoolRef(XMLNode* node, const XS_String& attr_name, bool def=false)
+ : _ref((*node)[attr_name])
+ {
+ if (_ref.empty())
+ assign(def);
+ }
+
+ operator bool() const
+ {
+ return !XS_icmp(_ref.c_str(), XS_TRUE);
+ }
+
+ bool operator!() const
+ {
+ return XS_icmp(_ref.c_str(), XS_TRUE)? true: false;
+ }
+
+ XMLBoolRef& operator=(bool value)
+ {
+ assign(value);
+
+ return *this;
+ }
+
+ void assign(bool value)
+ {
+ _ref.assign(value? XS_TRUE: XS_FALSE);
+ }
+
+ void toggle()
+ {
+ assign(!operator bool());
+ }
+
+protected:
+ XS_String& _ref;
+};
+
+
+ /// type converter for integer data
+struct XMLInt
+{
+ XMLInt(int value)
+ : _value(value)
+ {
+ }
+
+ XMLInt(LPCXSSTR value, int def=0)
+ {
+ if (value && *value)
+ _value = XS_toi(value);
+ else
+ _value = def;
+ }
+
+ XMLInt(const XMLNode* node, const XS_String& attr_name, int def=0)
+ {
+ const XS_String& value = node->get(attr_name);
+
+ if (!value.empty())
+ _value = XS_toi(value.c_str());
+ else
+ _value = def;
+ }
+
+ operator int() const
+ {
+ return _value;
+ }
+
+ operator XS_String() const
+ {
+ XS_CHAR buffer[32];
+ XS_snprintf(buffer, COUNTOF(buffer), XS_NUMBERFMT, _value);
+ return buffer;
+ }
+
+protected:
+ int _value;
+
+private:
+ void operator=(const XMLInt&); // disallow assignment operations
+};
+
+ /// type converter for integer data with write access
+struct XMLIntRef
+{
+ XMLIntRef(XMLNode* node, const XS_String& attr_name, int def=0)
+ : _ref((*node)[attr_name])
+ {
+ if (_ref.empty())
+ assign(def);
+ }
+
+ XMLIntRef& operator=(int value)
+ {
+ assign(value);
+
+ return *this;
+ }
+
+ operator int() const
+ {
+ return XS_toi(_ref.c_str());
+ }
+
+ void assign(int value)
+ {
+ XS_CHAR buffer[32];
+ XS_snprintf(buffer, COUNTOF(buffer), XS_NUMBERFMT, value);
+ _ref.assign(buffer);
+ }
+
+protected:
+ XS_String& _ref;
+};
+
+
+ /// type converter for string data
+struct XMLString
+{
+ XMLString(const XS_String& value)
+ : _value(value)
+ {
+ }
+
+ XMLString(LPCXSSTR value, LPCXSSTR def=XS_TEXT(""))
+ {
+ if (value && *value)
+ _value = value;
+ else
+ _value = def;
+ }
+
+ XMLString(const XMLNode* node, const XS_String& attr_name, LPCXSSTR def=XS_TEXT(""))
+ {
+ const XS_String& value = node->get(attr_name);
+
+ if (!value.empty())
+ _value = value;
+ else
+ _value = def;
+ }
+
+ operator const XS_String&() const
+ {
+ return _value;
+ }
+
+ const XS_String& c_str() const
+ {
+ return _value;
+ }
+
+protected:
+ XS_String _value;
+
+private:
+ void operator=(const XMLString&); // disallow assignment operations
+};
+
+ /// type converter for string data with write access
+struct XMStringRef
+{
+ XMStringRef(XMLNode* node, const XS_String& attr_name, LPCXSSTR def=XS_TEXT(""))
+ : _ref((*node)[attr_name])
+ {
+ if (_ref.empty())
+ assign(def);
+ }
+
+ XMStringRef(XMLNode* node, const XS_String& node_name, const XS_String& attr_name, LPCXSSTR def=XS_TEXT(""))
+ : _ref(node->subvalue(node_name, attr_name))
+ {
+ if (_ref.empty())
+ assign(def);
+ }
+
+ XMStringRef& operator=(const XS_String& value)
+ {
+ assign(value);
+
+ return *this;
+ }
+
+ operator const XS_String&() const
+ {
+ return _ref;
+ }
+
+ void assign(const XS_String& value)
+ {
+ _ref.assign(value);
+ }
+
+protected:
+ XS_String& _ref;
+};
+
+
+template<typename T>
+ inline void read_option(T& var, const_XMLPos& cfg, LPCXSSTR key)
+ {
+ const XS_String& val = cfg.get(key);
+
+ if (!val.empty())
+ var = val;
+ }
+
+template<>
+ inline void read_option(int& var, const_XMLPos& cfg, LPCXSSTR key)
+ {
+ const XS_String& val = cfg.get(key);
+
+ if (!val.empty())
+ var = XS_toi(val.c_str());
+ }
+
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4355)
+#endif
+
+ /// XML reader base class
+struct XMLReaderBase
+{
+ XMLReaderBase(XMLNode* node)
+ : _pos(node),
+ _parser(XML_ParserCreate(NULL))
+ {
+ XML_SetUserData(_parser, this);
+ XML_SetXmlDeclHandler(_parser, XML_XmlDeclHandler);
+ XML_SetElementHandler(_parser, XML_StartElementHandler, XML_EndElementHandler);
+ XML_SetDefaultHandler(_parser, XML_DefaultHandler);
+
+ _last_tag = TAG_NONE;
+ }
+
+ virtual ~XMLReaderBase()
+ {
+ XML_ParserFree(_parser);
+ }
+
+ XML_Status read();
+
+ virtual int read_buffer(char* buffer, int len) = 0;
+
+ std::string get_position() const
+ {
+ int line = XML_GetCurrentLineNumber(_parser);
+ int column = XML_GetCurrentColumnNumber(_parser);
+
+ std::ostringstream out;
+ out << "(" << line << ") : [column " << column << "]";
+
+ return out.str();
+ }
+
+ std::string get_instructions() const {return _instructions;}
+
+ XML_Error get_error_code() {return XML_GetErrorCode(_parser);}
+ std::string get_error_string() const;
+
+protected:
+ XMLPos _pos;
+ XML_Parser _parser;
+ std::string _xml_version;
+ std::string _encoding;
+ std::string _instructions;
+
+ std::string _content;
+ enum {TAG_NONE, TAG_START, TAG_END} _last_tag;
+
+ static void XMLCALL XML_XmlDeclHandler(void* userData, const XML_Char* version, const XML_Char* encoding, int standalone);
+ static void XMLCALL XML_StartElementHandler(void* userData, const XML_Char* name, const XML_Char** atts);
+ static void XMLCALL XML_EndElementHandler(void* userData, const XML_Char* name);
+ static void XMLCALL XML_DefaultHandler(void* userData, const XML_Char* s, int len);
+};
+
+
+ /// XML file reader
+struct XMLReader : public XMLReaderBase
+{
+ XMLReader(XMLNode* node, std::istream& in)
+ : XMLReaderBase(node),
+ _in(in)
+ {
+ }
+
+ /// read XML stream into XML tree below _pos
+ int read_buffer(char* buffer, int len)
+ {
+ if (!_in.good())
+ return -1;
+
+ _in.read(buffer, len);
+
+ return _in.gcount();
+ }
+
+protected:
+ std::istream& _in;
+};
+
+
+ /// management of XML file headers
+struct XMLHeader
+{
+ XMLHeader(const std::string& xml_version="1.0", const std::string& encoding="UTF-8", const std::string& doctype="")
+ : _version(xml_version),
+ _encoding(encoding),
+ _doctype(doctype)
+ {
+ }
+
+ void print(std::ostream& out, bool pretty=true) const
+ {
+ out << "<?xml version=\"" << _version << "\" encoding=\"" << _encoding << "\"?>";
+
+ if (pretty)
+ out << std::endl;
+
+ if (!_doctype.empty())
+ out << _doctype << '\n';
+
+ if (!_additional.empty())
+ out << _additional << '\n';
+ }
+
+ std::string _version;
+ std::string _encoding;
+ std::string _doctype;
+ std::string _additional;
+};
+
+
+ /// XML document holder
+struct XMLDoc : public XMLNode
+{
+ XMLDoc()
+ : XMLNode(""),
+ _last_error(XML_ERROR_NONE)
+ {
+ }
+
+ XMLDoc(LPCTSTR path)
+ : XMLNode(""),
+ _last_error(XML_ERROR_NONE)
+ {
+ read(path);
+ }
+
+ std::istream& read(std::istream& in)
+ {
+ XMLReader reader(this, in);
+
+ read(reader);
+
+ return in;
+ }
+
+ bool read(LPCTSTR path)
+ {
+ tifstream in(path);
+ XMLReader reader(this, in);
+
+//#if defined(_STRING_DEFINED) && !defined(XS_STRING_UTF8)
+// return read(reader, std::string(ANS(path)));
+//#else
+ return read(reader, XS_String(path));
+//#endif
+ }
+
+ bool read(XMLReaderBase& reader)
+ {
+ XML_Status status = reader.read();
+
+ _header._additional = reader.get_instructions();
+
+ if (status == XML_STATUS_ERROR) {
+ std::ostringstream out;
+
+ out << "input stream" << reader.get_position() << " " << reader.get_error_string();
+
+ _last_error = reader.get_error_code();
+ _last_error_msg = out.str();
+ }
+
+ return status != XML_STATUS_ERROR;
+ }
+
+ bool read(XMLReaderBase& reader, const std::string& display_path)
+ {
+ XML_Status status = reader.read();
+
+ _header._additional = reader.get_instructions();
+
+ if (status == XML_STATUS_ERROR) {
+ std::ostringstream out;
+
+ out << display_path << reader.get_position() << " " << reader.get_error_string();
+
+ _last_error = reader.get_error_code();
+ _last_error_msg = out.str();
+ }
+
+ return status != XML_STATUS_ERROR;
+ }
+
+ /// write XML stream preserving previous white space and comments
+ std::ostream& write(std::ostream& out, WRITE_MODE mode=FORMAT_SMART) const
+ {
+ _header.print(out);
+
+ if (!_children.empty())
+ _children.front()->write(out);
+
+ return out;
+ }
+
+ /// write XML stream with formating
+ std::ostream& write_formating(std::ostream& out) const
+ {
+ return write(out, FORMAT_PRETTY);
+ }
+
+ void write(LPCTSTR path, WRITE_MODE mode=FORMAT_SMART) const
+ {
+ tofstream out(path);
+
+ write(out, mode);
+ }
+
+ void write_formating(LPCTSTR path) const
+ {
+ tofstream out(path);
+
+ write_formating(out);
+ }
+
+ XMLHeader _header;
+ XML_Error _last_error;
+ std::string _last_error_msg;
+};
+
+
+ /// XML message wrapper
+struct XMLMessage : public XMLDoc
+{
+ XMLMessage(const char* name)
+ : _pos(this)
+ {
+ _pos.create(name);
+ }
+
+ XMLPos _pos;
+};
+
+
+enum PRETTY_FLAGS {
+ PRETTY_PLAIN = 0,
+ PRETTY_LINEFEED = 1,
+ PRETTY_INDENT = 2
+};
+
+struct XMLWriter
+{
+ XMLWriter(std::ostream& out, PRETTY_FLAGS pretty=PRETTY_INDENT, const XMLHeader& header=XMLHeader())
+ : _pofstream(NULL),
+ _out(out),
+ _pretty(pretty)
+ {
+ header.print(_out, false);
+ }
+
+ XMLWriter(LPCTSTR path, PRETTY_FLAGS pretty=PRETTY_INDENT, const XMLHeader& header=XMLHeader())
+ : _pofstream(new tofstream(path)),
+ _out(*_pofstream),
+ _pretty(pretty)
+ {
+ header.print(_out, false);
+ }
+
+ ~XMLWriter()
+ {
+ _out << std::endl;
+ delete _pofstream;
+ }
+
+ /// create node and move to it
+ void create(const XS_String& name)
+ {
+ if (!_stack.empty()) {
+ StackEntry& last = _stack.top();
+
+ if (last._state < PRE_CLOSED) {
+ write_attributes(last);
+ close_pre(last);
+ }
+
+ ++last._children;
+ }
+
+ StackEntry entry;
+ entry._node_name = name;
+ _stack.push(entry);
+
+ write_pre(entry);
+ }
+
+ /// go back to previous position
+ bool back()
+ {
+ if (!_stack.empty()) {
+ write_post(_stack.top());
+
+ _stack.pop();
+ return true;
+ } else
+ return false;
+ }
+
+ /// attribute setting
+ void put(const XS_String& attr_name, const XS_String& value)
+ {
+ if (!_stack.empty())
+ _stack.top()._attributes[attr_name] = value;
+ }
+
+ /// C++ write access to an attribute
+ XS_String& operator[](const XS_String& attr_name)
+ {
+ if (_stack.empty())
+ return s_empty_attr;
+
+ return _stack.top()._attributes[attr_name];
+ }
+
+ void set_content(const XS_String& s)
+ {
+ if (!_stack.empty())
+ _stack.top()._content = s;
+ }
+
+ // public for access in StackEntry
+ enum WRITESTATE {
+ NOTHING, /*PRE,*/ ATTRIBUTES, PRE_CLOSED, /*CONTENT,*/ POST
+ };
+
+protected:
+ tofstream* _pofstream;
+ std::ostream& _out;
+ PRETTY_FLAGS _pretty;
+
+ typedef XMLNode::AttributeMap AttrMap;
+
+ struct StackEntry {
+ XS_String _node_name;
+ AttrMap _attributes;
+ std::string _content;
+ WRITESTATE _state;
+ bool _children;
+
+ StackEntry() : _state(NOTHING), _children(false) {}
+ };
+
+ std::stack<StackEntry> _stack;
+
+ static XS_String s_empty_attr;
+
+ void close_pre(StackEntry& entry)
+ {
+ _out << '>';
+
+ entry._state = PRE_CLOSED;
+ }
+
+ void write_pre(StackEntry& entry)
+ {
+ if (_pretty >= PRETTY_LINEFEED)
+ _out << std::endl;
+
+ if (_pretty == PRETTY_INDENT)
+ for(int i=_stack.size(); --i>0; )
+ _out << XML_INDENT_SPACE;
+
+ _out << '<' << EncodeXMLString(entry._node_name);
+ //entry._state = PRE;
+ }
+
+ void write_attributes(StackEntry& entry)
+ {
+ for(AttrMap::const_iterator it=entry._attributes.begin(); it!=entry._attributes.end(); ++it)
+ _out << ' ' << EncodeXMLString(it->first) << "=\"" << EncodeXMLString(it->second) << "\"";
+
+ entry._state = ATTRIBUTES;
+ }
+
+ void write_post(StackEntry& entry)
+ {
+ if (entry._state < ATTRIBUTES)
+ write_attributes(entry);
+
+ if (entry._children || !entry._content.empty()) {
+ if (entry._state < PRE_CLOSED)
+ close_pre(entry);
+
+ _out << entry._content;
+ //entry._state = CONTENT;
+
+ if (_pretty>=PRETTY_LINEFEED && entry._content.empty())
+ _out << std::endl;
+
+ if (_pretty==PRETTY_INDENT && entry._content.empty())
+ for(int i=_stack.size(); --i>0; )
+ _out << XML_INDENT_SPACE;
+
+ _out << "</" << EncodeXMLString(entry._node_name) << ">";
+ } else {
+ _out << "/>";
+ }
+
+ entry._state = POST;
+ }
+};
+
+
+} // namespace XMLStorage
+
+#define _XMLSTORAGE_H
+#endif // _XMLSTORAGE_H
--- /dev/null
+<?xml version="1.0"?>\r
+<rbuild xmlns:xi="http://www.w3.org/2001/XInclude">\r
+ <group>\r
+<!--\r
+ <directory name="cmd">\r
+ <xi:include href="cmd/cmd.rbuild" />\r
+ </directory>\r
+ <directory name="explorer">\r
+ <xi:include href="explorer/explorer.rbuild" />\r
+ </directory>\r
+-->\r
+ </group>\r
+</rbuild>\r