!C99Shell v. 1.0 pre-release build #13!

Software: Apache. PHP/5.5.15 

uname -a: Windows NT SVR-DMZ 6.1 build 7600 (Windows Server 2008 R2 Enterprise Edition) i586 

SYSTEM 

Safe-mode: OFF (not secure)

C:\dmz\FileZillaFTP\source\interface\   drwxrwxrwx
Free 4.1 GB of 39.52 GB (10.37%)
Detected drives: [ a ] [ c ] [ d ] [ e ] [ f ]
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     MainFrm.cpp (35.15 KB)      -rw-rw-rw-
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// FileZilla Server - a Windows ftp server

// Copyright (C) 2002-2004 - Tim Kosse <tim.kosse@gmx.de>

// 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

// MainFrm.cpp : Implementierung der Klasse CMainFrame
//

#include "stdafx.h"
#include "FileZilla server.h"
#include "misc/led.h"
#include "MainFrm.h"
#include "../iputils.h"
#include "../platform.h"
#include "statusview.h"
#include "usersdlg.h"
#include "GroupsDlg.h"
#include "options.h"
#include "usersview.h"
#include "userslistctrl.h"
#include "misc/systemtray.h"
#include "offlineaskdlg.h"
#include "../version.h"
#include "AdminSocket.h"
#include "OptionsDlg.h"
#include "ConnectDialog.h"
#include "mainfrm.h"
#include "../defs.h"
#include "OutputFormat.h"

#if defined(_DEBUG) && !defined(MMGR)
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ON_WM_CREATE()
    ON_WM_SETFOCUS()
    ON_WM_SIZE()
    ON_WM_CLOSE()
    ON_COMMAND(ID_EDIT_SETTINGS, OnEditSettings)
    ON_COMMAND(ID_ACTIVE, OnActive)
    ON_UPDATE_COMMAND_UI(ID_ACTIVE, OnUpdateActive)
    ON_WM_SYSCOMMAND()
    ON_COMMAND(ID_TRAY_EXIT, OnTrayExit)
    ON_COMMAND(ID_TRAY_RESTORE, OnTrayRestore)
    ON_COMMAND(ID_LOCK, OnLock)
    ON_UPDATE_COMMAND_UI(ID_LOCK, OnUpdateLock)
    ON_WM_TIMER()
    ON_COMMAND(ID_USERS, OnMenuEditUsers)
    ON_COMMAND(ID_GROUPS, OnMenuEditGroups)
    ON_COMMAND(ID_FILE_CONNECT, OnFileConnect)
    ON_COMMAND(ID_FILE_DISCONNECT, OnFileDisconnect)
    ON_UPDATE_COMMAND_UI(ID_FILE_DISCONNECT, OnUpdateFileDisconnect)
    ON_UPDATE_COMMAND_UI(ID_EDIT_SETTINGS, OnUpdateEditSettings)
    ON_UPDATE_COMMAND_UI(ID_MENU_EDIT_USERS, OnUpdateMenuEditUsers)
    ON_UPDATE_COMMAND_UI(ID_MENU_EDIT_GROUPS, OnUpdateMenuEditGroups)
    ON_UPDATE_COMMAND_UI(ID_USERS, OnUpdateUsers)
    ON_UPDATE_COMMAND_UI(ID_GROUPS, OnUpdateGroups)
    ON_COMMAND(ID_MENU_EDIT_USERS, OnMenuEditUsers)
    ON_COMMAND(ID_MENU_EDIT_GROUPS, OnMenuEditGroups)
    ON_COMMAND(ID_USERLISTTOOLBAR_DISPLAYLOGICAL, OnDisplayLogicalNames)
    ON_COMMAND(ID_USERLISTTOOLBAR_DISPLAYPHYSICAL, OnDisplayPhysicalNames)
    ON_UPDATE_COMMAND_UI(ID_USERLISTTOOLBAR_DISPLAYLOGICAL, OnUpdateDisplayLogicalNames)
    ON_UPDATE_COMMAND_UI(ID_USERLISTTOOLBAR_DISPLAYPHYSICAL, OnUpdateDisplayPhysicalNames)
    ON_COMMAND(ID_USERLISTTOOLBAR_SORT, OnDisplaySortMenu)
    ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)
    ON_COMMAND(ID_DISPLAY_SORTBYUSERID, OnDisplaySortByUserid)
    ON_COMMAND(ID_DISPLAY_SORTBYACCOUNT, OnDisplaySortByAccount)
    ON_COMMAND(ID_DISPLAY_SORTBYIP, OnDisplaySortByIP)
    ON_UPDATE_COMMAND_UI(ID_DISPLAY_SORTBYUSERID, OnUpdateDisplaySortByUserid)
    ON_UPDATE_COMMAND_UI(ID_DISPLAY_SORTBYACCOUNT, OnUpdateDisplaySortByAccount)
    ON_UPDATE_COMMAND_UI(ID_DISPLAY_SORTBYIP, OnUpdateDisplaySortByIP)
    ON_WM_DESTROY()
    //}}AFX_MSG_MAP
    ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

static UINT indicators[] =
{
    ID_SEPARATOR,           // Statusleistenanzeige
    ID_INDICATOR_RECVCOUNT,
    ID_INDICATOR_RECVRATE,
    ID_INDICATOR_SENDCOUNT,
    ID_INDICATOR_SENDRATE,
    ID_INDICATOR_RECVLED,
    ID_INDICATOR_SENDLED,
    ID_SEPARATOR
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame Konstruktion/Zerstörung

CMainFrame::CMainFrame(COptions *pOptions)
{
    ASSERT(pOptions);
    s_winClassName = 0;
    nTrayNotificationMsg_ = RegisterWindowMessage(_T("FileZilla Server Tray Notification Message"));
    m_bQuit = FALSE;
    m_nSendCount = 0;
    m_nRecvCount = 0;
    m_lastchecktime = GetTickCount();
    m_lastreaddiff = 0;
    m_lastwritediff = 0;
    m_nOldRecvCount = 0;
    m_nOldSendCount = 0;
    m_pOptions = pOptions;
    m_pAdminSocket = NULL;
    m_nServerState = 0;
    m_nEdit = 0;

    m_pOptionsDlg = 0;
    m_pUsersDlg = 0;
    m_pGroupsDlg = 0;

    m_nReconnectTimerID = 0;
    m_nReconnectCount = 0;
}

CMainFrame::~CMainFrame()
{
    delete m_pOptions;
    m_pOptions = 0;
    CloseAdminSocket(false);
    delete [] s_winClassName; //Does seem to crash
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    SetupTrayIcon();

    if (!m_wndReBar.Create(this))
        return -1;

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP
        | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("Could not create Toolbar 1\n");
        return -1;      // Fehler bei Erstellung
    }
    
    if (!m_wndUserListToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_ALIGN_LEFT
        | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndUserListToolBar.LoadToolBar(IDR_USERLISTTOOLBAR))
    {
        TRACE0("Could not create Toolbar 2\n");
        return -1;      // Fehler bei Erstellung
    }
    m_wndUserListToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
    DWORD dwStyle = m_wndUserListToolBar.GetButtonStyle(m_wndUserListToolBar.CommandToIndex(ID_USERLISTTOOLBAR_SORT));
    dwStyle |= TBSTYLE_DROPDOWN;
    m_wndUserListToolBar.SetButtonStyle(m_wndUserListToolBar.CommandToIndex(ID_USERLISTTOOLBAR_SORT), dwStyle);

    m_wndReBar.AddBar(&m_wndToolBar);
    m_wndReBar.AddBar(&m_wndUserListToolBar);
    m_wndReBar.GetReBarCtrl().MinimizeBand(0);
    
    if (!m_wndStatusBar.Create(this) ||
        !m_wndStatusBar.SetIndicators(indicators,
          sizeof(indicators)/sizeof(UINT)))
    {
        TRACE0("Statusleiste konnte nicht erstellt werden\n");
        return -1;      // Fehler bei Erstellung
    }

    // The last statusbar pane is a fake one, it has zero width.
    m_wndStatusBar.SetPaneInfo(7, 0, SBPS_NOBORDERS, 0);

    CRect rect;
    m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(ID_INDICATOR_RECVLED), rect);  

    //Create the first LED control
    m_RecvLed.Create(_T(""), WS_VISIBLE|WS_CHILD, rect, &m_wndStatusBar, m_wndStatusBar.CommandToIndex(ID_INDICATOR_RECVLED)); 
    m_RecvLed.SetLed( CLed::LED_COLOR_GREEN, CLed::LED_OFF, CLed::LED_ROUND);

    //Create the second LED control
    m_SendLed.Create(_T(""), WS_VISIBLE|WS_CHILD, rect, &m_wndStatusBar, m_wndStatusBar.CommandToIndex(ID_INDICATOR_SENDLED)); 
    m_SendLed.SetLed( CLed::LED_COLOR_RED, CLed::LED_OFF, CLed::LED_ROUND);

    m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(ID_INDICATOR_SENDLED), &rect);
    m_wndStatusBar.SetPaneInfo(m_wndStatusBar.CommandToIndex(ID_INDICATOR_RECVLED),ID_INDICATOR_RECVLED,SBPS_NOBORDERS,6);
    m_wndStatusBar.SetPaneInfo(m_wndStatusBar.CommandToIndex(ID_INDICATOR_SENDLED),ID_INDICATOR_SENDLED,SBPS_NOBORDERS,6);

    ShowStatus(GetVersionString(), 0);
    ShowStatus(_T("Copyright 2001-2011 by Tim Kosse (tim.kosse@filezilla-project.org)"), 0);

    m_nTimerID = SetTimer(7777, 10000, 0);
    m_nRateTimerID = SetTimer(7778, 1000, 0);

    SetStatusbarText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_SENDCOUNT), _T("0 bytes sent"));
    SetStatusbarText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_RECVCOUNT), _T("0 bytes received"));
    SetStatusbarText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_RECVRATE), _T("0 B/s"));
    SetStatusbarText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_SENDRATE), _T("0 B/s"));

    CConnectDialog dlg(m_pOptions);
    if (!m_pOptions->GetOptionVal(IOPTION_ALWAYS) && dlg.DoModal() != IDOK)
        return 0;

    m_pAdminSocket = new CAdminSocket(this);
    ShowStatus("Connecting to server...", 0);
    DoConnect();

    return 0;
}

//////////////////
// Helper function to register a new window class based on an already
// existing window class, but with a different name and icon. 
// Returns new name if successful; otherwise NULL.
//
static bool RegisterSimilarClass(LPCTSTR lpszNewClassName,
    LPCTSTR lpszOldClassName, UINT nIDResource)
{
    // Get class info for old class.
    //
    HINSTANCE hInst = AfxGetInstanceHandle();
    WNDCLASS wc;
    if (!::GetClassInfo(hInst, lpszOldClassName, &wc)) {
        TRACE("Can't find window class %s\n", lpszOldClassName);
        return false;
    }

    // Register new class with same info, but different name and icon.
    //
    wc.lpszClassName = lpszNewClassName;
    wc.hIcon = ::LoadIcon(hInst, MAKEINTRESOURCE(nIDResource));
    if (!AfxRegisterClass(&wc)) {
        TRACE("Unable to register window class%s\n", lpszNewClassName);
        return false;
    }
    return true;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    if( !CFrameWnd::PreCreateWindow(cs) )
        return FALSE;
    
    // ZU ERLEDIGEN: Ändern Sie hier die Fensterklasse oder das Erscheinungsbild, indem Sie
    //  CREATESTRUCT cs modifizieren.

    cs.lpszClass = AfxRegisterWndClass(0);

    cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

    //Change the window class name
    if (!s_winClassName) 
    {
        s_winClassName = new TCHAR[_tcslen(_T("FileZilla Server Main Window")) + 1];
        _tcscpy(s_winClassName, _T("FileZilla Server Main Window"));
        RegisterSimilarClass(s_winClassName, cs.lpszClass, IDR_MAINFRAME);
    }
    cs.lpszClass = s_winClassName;

    return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame Nachrichten-Handler
void CMainFrame::OnSetFocus(CWnd* pOldWnd)
{
    // Fokus an das Ansichtfenster weitergeben
}

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
    // andernfalls die Standardbehandlung durchführen
    return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
    CRect rect;
    GetClientRect(rect);

    // Unterteiltes Fenster erstellen
    if (!m_wndSplitter.CreateStatic(this, 2, 1))
        return FALSE;
    if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CStatusView), CSize(1, rect.Height() - 150), pContext))
    {
        m_wndSplitter.DestroyWindow();
        return FALSE;
    }
    m_pStatusPane = (CStatusView*)m_wndSplitter.GetPane(0, 0);

    if (!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CUsersView), CSize(1, 150), pContext))
    {
        m_wndSplitter.DestroyWindow();
        return FALSE;
    }
    m_pUsersPane = (CUsersView*) m_wndSplitter.GetPane(1, 0);

    // Filename display option.
    GetUsersPane()->m_pListCtrl->SetDisplayPhysicalNames(m_pOptions->GetOptionVal(IOPTION_FILENAMEDISPLAY) != 0);

    // Set layout options.
    int sortInfo = (int)m_pOptions->GetOptionVal(IOPTION_USERSORTING);
    GetUsersPane()->m_pListCtrl->SetSortColumn(sortInfo & 0x0F, sortInfo >> 4);

    return CFrameWnd::OnCreateClient(lpcs, pContext);
}

CStatusView* CMainFrame::GetStatusPane()
{
    return m_pStatusPane;
}

CUsersView* CMainFrame::GetUsersPane()
{
    return m_pUsersPane;
}

void CMainFrame::OnSize(UINT nType, int cx, int cy) 
{
    if (m_wndStatusBar.GetSafeHwnd())
    {
        if (nType!=SIZE_MAXIMIZED)
            m_wndStatusBar.SetPaneInfo(m_wndStatusBar.CommandToIndex(ID_INDICATOR_SENDLED),ID_INDICATOR_SENDLED,SBPS_NOBORDERS,0);
        else
            m_wndStatusBar.SetPaneInfo(m_wndStatusBar.CommandToIndex(ID_INDICATOR_SENDLED),ID_INDICATOR_SENDLED,SBPS_NOBORDERS,10);
    }

    if (m_wndSplitter.GetSafeHwnd())
    {
        //Hide the queue if visible
        m_wndSplitter.HideRow(1, 0);
    }
    //Now only the main splitter gets resized
    CFrameWnd::OnSize(nType, cx, cy);
    if (m_wndSplitter.GetSafeHwnd())
    {
        //Restore the queue
        m_wndSplitter.ShowRow(1);
    }
    
    if (m_wndStatusBar.GetSafeHwnd())
    {
        RECT rc;

        m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(ID_INDICATOR_RECVLED), &rc);

        // Reposition the first LED correctly!
        m_RecvLed.SetWindowPos(&wndTop, rc.left, rc.top+1, rc.right - rc.left,
            rc.bottom - rc.top, 0); 

        m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(ID_INDICATOR_SENDLED), &rc);
    
        // Reposition the second LED correctly!
        m_SendLed.SetWindowPos(&wndTop, rc.left, rc.top+1, rc.right - rc.left,
                rc.bottom - rc.top, 0); 
    }
}

void CMainFrame::OnClose() 
{
    CFrameWnd::OnClose();
}

void CMainFrame::OnEditSettings() 
{
    if (m_nEdit)
    {
        MessageBeep(MB_OK);
        return;
    }
    m_nEdit |= 0x04;
    SendCommand(5, 0, 0);
    ShowStatus(_T("Retrieving settings, please wait..."), 0);
}

void CMainFrame::OnActive() 
{
    if (m_nServerState & STATE_ONLINE && !(m_nServerState & STATE_MASK_GOOFFLINE))
    {
        if (!GetUsersPane()->m_pListCtrl->GetItemCount())
        {
            if (AfxMessageBox(_T("Do you really want to take the server offline?"), MB_YESNO | MB_ICONQUESTION) != IDYES)
                return;
            int nServerState = m_nServerState | STATE_GOOFFLINE_NOW;
            unsigned char buffer[2];
            buffer[0] = nServerState / 256;
            buffer[1] = nServerState % 256;
            SendCommand(2, buffer, 2);
            ShowStatus(_T("Server is going offline..."), 0);
            return;
        }
        else
        {
            COfflineAskDlg dlg;
            if (dlg.DoModal() != IDOK)
                return;
            if (dlg.m_nRadio == 2)
            {
                int nServerState = m_nServerState | STATE_GOOFFLINE_WAITTRANSFER;
                unsigned char buffer[2];
                buffer[0] = nServerState / 256;
                buffer[1] = nServerState % 256;
                SendCommand(2, buffer, 2);
                ShowStatus(_T("Server is going offline..."), 0);
                return;
            }
            if (dlg.m_nRadio == 1)
            {
                int nServerState = m_nServerState | STATE_GOOFFLINE_LOGOUT;
                unsigned char buffer[2];
                buffer[0] = nServerState / 256;
                buffer[1] = nServerState % 256;
                SendCommand(2, buffer, 2);
                ShowStatus(_T("Server is going offline..."), 0);                
                return;
            }                
            else
            {
                int nServerState = m_nServerState | STATE_GOOFFLINE_NOW;
                unsigned char buffer[2];
                buffer[0] = nServerState / 256;
                buffer[1] = nServerState % 256;
                SendCommand(2, buffer, 2);
                ShowStatus(_T("Server is going offline..."), 0);
                return;
            }
        }
    }
    else
    {
        int nServerState = 1 + (m_nServerState & STATE_LOCKED);
        unsigned char buffer[2];
        buffer[0] = nServerState / 256;
        buffer[1] = nServerState % 256;
        SendCommand(2, buffer, 2);
    }
}

void CMainFrame::OnUpdateActive(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable(m_pAdminSocket && m_pAdminSocket->IsConnected());
    pCmdUI->SetCheck(m_nServerState & STATE_ONLINE && !(m_nServerState & STATE_MASK_GOOFFLINE));
}

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
    CFrameWnd::OnSysCommand(nID, lParam);
    if (nID == SC_MINIMIZE)
        ShowWindow(SW_HIDE);
    else if (nID == SC_RESTORE)
        ShowWindow(SW_SHOW);
}

//// SetupTrayIcon /////////////////////////////////////////////////////
// If we're minimized, create an icon in the systray.  Otherwise, remove
// the icon, if one is present.

void CMainFrame::SetupTrayIcon()
{
    m_TrayIcon.Create(0, nTrayNotificationMsg_, _T("FileZilla Server"),
        0, IDR_SYSTRAY_MENU);
    m_TrayIcon.SetIcon(IDI_UNKNOWN);
}


//// SetupTaskBarButton ////////////////////////////////////////////////
// Show or hide the taskbar button for this app, depending on whether
// we're minimized right now or not.

void CMainFrame::OnTrayExit() 
{
    if (!m_bQuit)
        OnClose();    
}

void CMainFrame::OnTrayRestore() 
{
    ShowWindow(SW_RESTORE);
    ShowWindow(SW_SHOW);
}

void CMainFrame::SetIcon()
{
    if (!m_pAdminSocket || !m_pAdminSocket->IsConnected())
    {
        m_TrayIcon.StopAnimation();
        m_TrayIcon.SetIcon(IDI_UNKNOWN);
    }
    else if (!(m_nServerState & STATE_ONLINE) || m_nServerState & STATE_MASK_GOOFFLINE)
    {
        if (!GetUsersPane()->m_pListCtrl->GetItemCount())
        {    
            m_TrayIcon.StopAnimation();
            m_TrayIcon.SetIcon(IDI_RED);
        }
        else
        {
            m_TrayIcon.SetIconList(IDI_GREEN, IDI_RED);
            m_TrayIcon.Animate(500);
        }
    }
    else if (m_nServerState & STATE_LOCKED)
    {
        if (GetUsersPane()->m_pListCtrl->GetItemCount())
        {    
            m_TrayIcon.SetIconList(IDI_GREEN, IDI_YELLOW);
            m_TrayIcon.Animate(300);
        }
        else
        {
            m_TrayIcon.SetIconList(IDI_YELLOW, IDI_RED);
            m_TrayIcon.Animate(500);
        }

    }
    else
    {
        m_TrayIcon.StopAnimation();
        m_TrayIcon.SetIcon(GetUsersPane()->m_pListCtrl->GetItemCount()?IDI_GREEN:IDI_YELLOW);
    }

}

void CMainFrame::OnLock() 
{
    if (!(m_nServerState & STATE_ONLINE) || m_nServerState & STATE_MASK_GOOFFLINE)
        return;
    if (m_nServerState & STATE_LOCKED)
    {
        int nServerState = m_nServerState & ~STATE_LOCKED;
        unsigned char buffer[2];
        buffer[0] = nServerState / 256;
        buffer[1] = nServerState % 256;
        SendCommand(2, buffer, 2);
    }
    else
    {
        if (AfxMessageBox(_T("Do you really want to lock the server? No new connenctions will be accepted while locked."), MB_YESNO|MB_ICONQUESTION)!=IDYES)
            return;
        int nServerState = m_nServerState | STATE_LOCKED;
        unsigned char buffer[2];
        buffer[0] = nServerState / 256;
        buffer[1] = nServerState % 256;
        SendCommand(2, buffer, 2);
        ShowStatus("Server locked", 0);    
    }    
}

void CMainFrame::OnUpdateLock(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable(m_pAdminSocket && m_pAdminSocket->IsConnected() && m_nServerState & STATE_ONLINE && !(m_nServerState & STATE_MASK_GOOFFLINE));
    pCmdUI->SetCheck((m_nServerState & STATE_LOCKED) ? 1 : 0);
    
}

CString FormatSpeed(__int64 diff, const int span)
{
    diff = (__int64)((double)diff * 1000 / span);

    CString str = _T("");
    CString digit;

    int shift = 0;
    while (diff >= 10000)
    {
        diff /= 10;
        shift++;
    }

    while (diff)
    {
        digit = (TCHAR)('0' + static_cast<TCHAR>(diff % 10));
        str = digit + str;
        diff /= 10;
    }

    if (str == _T(""))
        str = _T("0");

    if (shift % 3)
        str = str.Left((shift % 3) + 1) + "," + str.Right(str.GetLength() - (shift % 3) - 1);
    shift += 2;
    shift /= 3;
    if (!shift)
        str += _T(" B/s");
    else if (shift == 1)
        str += _T(" KB/s");
    else if (shift == 2)
        str += _T(" MB/s");
    else if (shift == 3)
        str += _T(" GB/s");
    else if (shift == 4)
        str += _T(" TB/s");
    else
        str = _T("n/a"); //If this happens, you really have a fast connection
    return str;
}

void CMainFrame::OnTimer(UINT_PTR nIDEvent) 
{
    if (!nIDEvent)
        return;
    else if (nIDEvent == m_nTimerID)
    {
        SendCommand(8);
        m_TrayIcon.RefreshIcon();
    }
    else if (nIDEvent == m_nRateTimerID)
    {
        const int span = GetTickCount() - m_lastchecktime;
        m_lastchecktime=GetTickCount();

        __int64 diff = m_nSendCount - m_nOldSendCount;
        m_nOldSendCount = m_nSendCount;

        if (m_lastwritediff && diff)
        {
            __int64 tmp = diff;
            diff = (diff + m_lastwritediff) / 2;
            m_lastwritediff = tmp;
        }
        else
            m_lastwritediff = diff;

        CString writeSpeed = FormatSpeed(diff, span);        
        SetStatusbarText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_SENDRATE), writeSpeed);
        
        diff = m_nRecvCount - m_nOldRecvCount;
        m_nOldRecvCount = m_nRecvCount;

        if (m_lastreaddiff && diff)
        {
            __int64 tmp = diff;
            diff = (diff + m_lastreaddiff) / 2;
            m_lastreaddiff = tmp;
        }
        else
            m_lastreaddiff = diff;
        
        CString readSpeed = FormatSpeed(diff, span);        
        SetStatusbarText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_RECVRATE), readSpeed);
    }
    else if (nIDEvent == m_nReconnectTimerID)
    {
        KillTimer(m_nReconnectTimerID);
        m_nReconnectTimerID = 0;
        
        if (m_pAdminSocket)
            return;

        m_pAdminSocket = new CAdminSocket(this);
        ShowStatus("Reconnecting to server...", 0);
        DoConnect();
    }

    CFrameWnd::OnTimer(nIDEvent);
}

void CMainFrame::SetStatusbarText(int nIndex,CString str)
{
    m_wndStatusBar.GetStatusBarCtrl().SetText(str,nIndex,0);
    HFONT hFont = (HFONT)m_wndStatusBar.SendMessage(WM_GETFONT);
    if (str=="")
    {
        str.LoadString(m_wndStatusBar.GetItemID(nIndex));        
    }
    CClientDC dcScreen(NULL);
    HGDIOBJ hOldFont = NULL;
    if (hFont != NULL)
    hOldFont = dcScreen.SelectObject(hFont);
    int cx=dcScreen.GetTextExtent(str).cx;
    int cxold;
    unsigned int nID,nStyle;
    m_wndStatusBar.GetPaneInfo(nIndex,nID,nStyle,cxold);
    if (cx!=cxold)
    {
        if (cx<cxold)
            cx=cxold;
        m_wndStatusBar.SetPaneInfo(nIndex,nID,nStyle,cx);
    
    }
    if (hOldFont != NULL)
        dcScreen.SelectObject(hOldFont);

}

void CMainFrame::OnMenuEditUsers() 
{
    if (m_nEdit)
    {
        MessageBeep(MB_OK);
        return;
    }
    m_nEdit |= 1;
    SendCommand(6, 0, 0);
    ShowStatus(_T("Retrieving account settings, please wait..."), 0);
}

void CMainFrame::OnMenuEditGroups() 
{
    if (m_nEdit)
    {
        MessageBeep(MB_OK);
        return;
    }
    m_nEdit |= 2;
    SendCommand(6, 0, 0);
    ShowStatus(_T("Retrieving account settings, please wait..."), 0);
}

void CMainFrame::ShowStatus(const CString& status, int nType)
{
    CStatusView *view = GetStatusPane();
    view->ShowStatus(status, nType);
}

void CMainFrame::ShowStatusRaw(const char *status, int nType)
{
#ifdef _UNICODE
    CString msg(ConvFromNetwork(status));
#else
    CString msg(ConvToLocal(ConvFromNetwork(status)));
#endif
    ShowStatus(msg, nType);
}

void CMainFrame::ParseReply(int nReplyID, unsigned char *pData, int nDataLength)
{
    switch(nReplyID)
    {
    case 0:
        {
            ShowStatus(_T("Logged on"), 0);
            SendCommand(2);
            unsigned char buffer = USERCONTROL_GETLIST;
            SendCommand(3, &buffer, 1);
        }
        break;
    case 1:
        {
            char *pBuffer = new char[nDataLength];
            memcpy(pBuffer, pData+1, nDataLength-1);
            pBuffer[nDataLength-1] = 0;
            ShowStatusRaw(pBuffer, *pData);
            delete [] pBuffer;
        }
        break;
    case 2:
        m_nServerState = *pData*256 + pData[1];
        SetIcon();
        break;
    case 3:
        {
            if (nDataLength<2)
            {
                ShowStatus(_T("Protocol error: Unexpected data length"), 1);
                return;
            }
            else if (!GetUsersPane()->m_pListCtrl->ParseUserControlCommand(pData, nDataLength))
                ShowStatus(_T("Protocol error: Invalid data"), 1);
        }
        break;
    case 5:
        if (nDataLength == 1)
        {
            if (*pData == 0)
                ShowStatus(_T("Done sending settings."), 0);
            else if (*pData == 1)
                ShowStatus(_T("Could not change settings"), 1);
            break;
        }
        ShowStatus(_T("Done retrieving settings"), 0);
        if (nDataLength<2)
            ShowStatus(_T("Protocol error: Unexpected data length"), 1);
        else
        {
            if ((m_nEdit & 0x1C) == 0x04)
            {
                m_pOptionsDlg = new COptionsDlg(m_pOptions, m_pAdminSocket->IsLocal());
                m_nEdit |= 0x08;
                if (!m_pOptionsDlg->Init(pData, nDataLength))
                {
                    ShowStatus(_T("Protocol error: Invalid data"), 1);
                    delete m_pOptionsDlg;
                    m_pOptionsDlg = 0;
                    m_nEdit = 0;
                }
                else if (!PostMessage(WM_APP))
                {
                    ShowStatus(_T("Can't send window message"), 1);
                    delete m_pOptionsDlg;
                    m_pOptionsDlg = 0;
                    m_nEdit = 0;
                }
            }
        }
        break;
    case 6:
        if (nDataLength == 1)
        {
            if (*pData == 0)
                ShowStatus(_T("Done sending account settings."), 0);
            else if (*pData == 1)
                ShowStatus(_T("Could not change account settings"), 1);
            break;
        }
        ShowStatus(_T("Done retrieving account settings"), 0);
        if (nDataLength<2)
            ShowStatus(_T("Protocol error: Unexpected data length"), 1);
        else
        {
            if ((m_nEdit & 0x19) == 0x01)
            {
                m_pUsersDlg = new CUsersDlg(this, m_pAdminSocket->IsLocal());
                m_nEdit |= 0x08;
                if (!m_pUsersDlg->Init(pData, nDataLength))
                {
                    ShowStatus(_T("Protocol error: Invalid data"), 1);
                    delete m_pUsersDlg;
                    m_pUsersDlg = 0;
                    m_nEdit = 0;
                    break;
                }
                else if (!PostMessage(WM_APP))
                {
                    ShowStatus(_T("Can't send window message"), 1);
                    delete m_pUsersDlg;
                    m_pUsersDlg = 0;
                    m_nEdit = 0;
                }
            }
            if ((m_nEdit & 0x1A) == 0x02)
            {
                m_pGroupsDlg = new CGroupsDlg(this, m_pAdminSocket->IsLocal());
                m_nEdit |= 0x08;
                if (!m_pGroupsDlg->Init(pData, nDataLength))
                {
                    ShowStatus(_T("Protocol error: Invalid data"), 1);
                    delete m_pGroupsDlg;
                    m_pGroupsDlg = 0;
                    m_nEdit = 0;
                    break;
                }
                else if (!PostMessage(WM_APP))
                {
                    ShowStatus(_T("Can't send window message"), 1);
                    delete m_pGroupsDlg;
                    m_pGroupsDlg = 0;
                    m_nEdit = 0;
                }
            }
        }
        break;
    case 8:
        break;
    default:
        {
            CString str;
            str.Format(_T("Protocol error: Unexpected reply id (%d)."), nReplyID);
            ShowStatus(str, 1);
            break;
        }
    }
}

void CMainFrame::ParseStatus(int nStatusID, unsigned char *pData, int nDataLength)
{
    switch(nStatusID)
    {
    case 1:
        {
            char *pBuffer = new char[nDataLength];
            memcpy(pBuffer, pData+1, nDataLength-1);
            pBuffer[nDataLength-1] = 0;
            ShowStatusRaw(pBuffer, *pData);
            delete [] pBuffer;
        }
        break;
    case 2:
        m_nServerState = *pData*256 + pData[1];
        SetIcon();
        break;
    case 3:
        {
            if (nDataLength<2)
            {
                ShowStatus(_T("Protocol error: Unexpected data length"), 1);
                return;
            }
            else if (!GetUsersPane()->m_pListCtrl->ParseUserControlCommand(pData, nDataLength))
                ShowStatus(_T("Protocol error: Invalid data"), 1);
        }
        break;
    case 4:
        {
            if (nDataLength < 10)
            {
                ShowStatus(_T("Protocol error: Unexpected data length"), 1);
                return;
            }
            
            CString msg;

            char *buffer = new char[nDataLength - 9 + 1];
            unsigned char *p = pData + 9;
            char *q = buffer;
            int pos = 0;
            while ((pos + 9) < nDataLength)
            {
                if (*p == '-')
                {
                    *q = 0;
                    msg = ConvFromNetwork(buffer);
                    q = buffer;
                    
                    DWORD timeHigh = GET32(pData + 1);
                    DWORD timeLow = GET32(pData + 5);

                    FILETIME fFileTime;
                    fFileTime.dwHighDateTime = timeHigh;
                    fFileTime.dwLowDateTime = timeLow;

                    SYSTEMTIME sFileTime;
                    FileTimeToSystemTime(&fFileTime, &sFileTime);
                    
                    TCHAR datetime[200];
                    int res = GetDateFormat(
                            LOCALE_USER_DEFAULT,    // locale for which date is to be formatted
                            DATE_SHORTDATE,            // flags specifying function options
                            &sFileTime,                // date to be formatted
                            0,                        // date format string
                            datetime,                // buffer for storing formatted string
                            200                        // size of buffer
                        );

                    if (res)
                    {
                        msg += datetime;
                        msg += ' ';
                    }
    
                    res = GetTimeFormat(
                            LOCALE_USER_DEFAULT,    // locale for which date is to be formatted
                            TIME_FORCE24HOURFORMAT,    // flags specifying function options
                            &sFileTime,                // date to be formatted
                            0,                        // date format string
                            datetime,                // buffer for storing formatted string
                            200                        // size of buffer
                        );

                    if (res)
                    {
                        msg += datetime;
                        msg += ' ';
                    }

                    if ((nDataLength - pos - 9) > 0)
                    {
                        memcpy(q, p, nDataLength - pos - 9);
                        q += nDataLength - pos - 9;
                    }
                    break;
                }
                else
                    *(q++) = *(p++);

                pos++;
            }
            *q = 0;
            if (q != buffer)
                msg += ConvFromNetwork(buffer);
            if (msg != _T(""))
                ShowStatus(msg, *pData);
            delete [] buffer;
        }
        break;
    case 7:
        if (nDataLength != 5)
            ShowStatus(_T("Protocol error: Invalid data"), 1);
        else
        {
            int nType = *pData;
            int size = (int)GET32(pData + 1);
            
            if (!nType)
            {
                m_nRecvCount += size;
                m_RecvLed.Ping(100);
                CString str;
                str.Format(_T("%s bytes received"), makeUserFriendlyString(m_nRecvCount).GetString());
                SetStatusbarText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_RECVCOUNT), str);
            }
            else
            {
                m_nSendCount += size;
                m_SendLed.Ping(100);
                CString str;
                str.Format(_T("%s bytes sent"), makeUserFriendlyString(m_nSendCount).GetString());
                SetStatusbarText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_SENDCOUNT), str);
            }

        }
        break;
    default:
        {
            CString str;
            str.Format(_T("Protocol error: Unexpected status id (%d)."), nStatusID);
            ShowStatus(str, 1);
        }
        break;

    }
}

BOOL CMainFrame::SendCommand(int nType)
{
    if (!m_pAdminSocket)
        return FALSE;
    if (!m_pAdminSocket->SendCommand(nType))
    {
        CloseAdminSocket();
        ShowStatus("Error: Connection to server lost...", 1);
        return FALSE;
    }
    return TRUE;
}

BOOL CMainFrame::SendCommand(int nType, void *pData, int nDataLength)
{
    if (!m_pAdminSocket)
        return FALSE;
    if (!m_pAdminSocket->SendCommand(nType, pData, nDataLength))
    {
        CloseAdminSocket();
        ShowStatus("Error: Connection to server lost...", 1);
        return FALSE;
    }
    return TRUE;
}

void CMainFrame::CloseAdminSocket(bool shouldReconnect /*=true*/)
{
    if (m_pAdminSocket)
    {
        m_pAdminSocket->DoClose();
        delete m_pAdminSocket;
        m_pAdminSocket = NULL;
        SetIcon();

        CString title;
        title.LoadString(IDR_MAINFRAME);
        SetWindowText(title + _T(" (disconnected)"));
    }
    m_nEdit = 0;

    if (!shouldReconnect)
    {
        if (m_nReconnectTimerID)
        {
            KillTimer(m_nReconnectTimerID);
            m_nReconnectTimerID = 0;
        }
    }
    else
    {
        if (!m_nReconnectTimerID)
        {
            m_nReconnectCount++;
            if (m_nReconnectCount < 15)
            {
                ShowStatus("Trying to reconnect in 5 seconds", 0);
                m_nReconnectTimerID = SetTimer(7779, 5000, 0);
            }
            else
                m_nReconnectCount = 0;
        }
    }
}

void CMainFrame::OnFileConnect() 
{
    if (m_nReconnectTimerID)
    {
        KillTimer(m_nReconnectTimerID);
        m_nReconnectTimerID = 0;
    }
    if (m_pAdminSocket)
        if (AfxMessageBox(_T("Do you really want to close the current connection?"), MB_ICONQUESTION|MB_YESNO) != IDYES)
            return;
    CConnectDialog dlg(m_pOptions);
    if (dlg.DoModal() == IDOK)
    {
        CloseAdminSocket(false);
        m_pAdminSocket = new CAdminSocket(this);
        ShowStatus("Connecting to server...", 0);
        DoConnect();
    }
}

void CMainFrame::OnFileDisconnect() 
{
    CloseAdminSocket(false);
}

void CMainFrame::OnUpdateFileDisconnect(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable(m_pAdminSocket?TRUE:FALSE);    
}

void CMainFrame::OnUpdateEditSettings(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable(m_pAdminSocket && m_pAdminSocket->IsConnected());
}

void CMainFrame::OnUpdateMenuEditUsers(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable(m_pAdminSocket && m_pAdminSocket->IsConnected());
}

void CMainFrame::OnUpdateMenuEditGroups(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable(m_pAdminSocket && m_pAdminSocket->IsConnected());
}

void CMainFrame::OnUpdateUsers(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable(m_pAdminSocket && m_pAdminSocket->IsConnected());
}

void CMainFrame::OnUpdateGroups(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable(m_pAdminSocket && m_pAdminSocket->IsConnected());
}

// this function gets called whenever the user decides to quit the app
// (by pressing the 'x' for example
void CMainFrame::OnDestroy() 
{
    m_pOptions->SetOption(IOPTION_USERSORTING, GetUsersPane()->m_pListCtrl->GetSortColumn() + (GetUsersPane()->m_pListCtrl->GetSortDirection() << 4));
    CloseAdminSocket(false);
    CFrameWnd::OnDestroy();
}

BOOL CMainFrame::OnEraseBkgnd(CDC* pDC)
{
    return TRUE;
}

LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if (message == WM_APP)
    {
        if ((m_nEdit & 0x1C) == 0x0C)
        {
            m_nEdit |= 0x10;
            if (m_pOptionsDlg->Show())
            {
                char *pBuffer;
                DWORD dwBufferLength;
                if (m_pOptionsDlg->GetAsCommand(&pBuffer, &dwBufferLength))
                {
                    SendCommand(5, pBuffer, dwBufferLength);
                    ShowStatus(_T("Sending settings, please wait..."), 0);
                    delete [] pBuffer;
                }
                else
                    ShowStatus(_T("Could not serialize settings, too much data."), 1);
            }
            delete m_pOptionsDlg;
            m_pOptionsDlg = 0;
            m_nEdit = 0;
        }
        else if ((m_nEdit & 0x19) == 0x09)
        {
            m_nEdit |= 0x10;
            if (m_pUsersDlg->DoModal() == IDOK)
            {
                char *pBuffer;
                DWORD dwBufferLength;
                if (m_pUsersDlg->GetAsCommand(&pBuffer, &dwBufferLength))
                {
                    SendCommand(6, pBuffer, dwBufferLength);
                    ShowStatus(_T("Sending account settings, please wait..."), 0);
                    delete [] pBuffer;
                }
            }
            delete m_pUsersDlg;
            m_pUsersDlg = 0;
            m_nEdit = 0;
        }
        else if ((m_nEdit & 0x1A) == 0x0A)
        {
            m_nEdit |= 0x10;
            if (m_pGroupsDlg->DoModal() == IDOK)
            {
                char *pBuffer;
                DWORD dwBufferLength;
                if (m_pGroupsDlg->GetAsCommand(&pBuffer, &dwBufferLength))
                {
                    SendCommand(6, pBuffer, dwBufferLength);
                    ShowStatus(_T("Sending account settings, please wait..."), 0);
                    delete [] pBuffer;
                }
            }
            delete m_pGroupsDlg;
            m_pGroupsDlg = 0;
            m_nEdit = 0;
        }
    }
    else if (message == WM_APP + 1)
        OnAdminInterfaceClosed();
    
    return CFrameWnd::DefWindowProc(message, wParam, lParam);
}

void CMainFrame::OnAdminInterfaceConnected()
{
    m_nReconnectCount = 0;

    CString title;
    title.LoadString(IDR_MAINFRAME);
    CString ip;
    UINT port;
    if (m_pAdminSocket->GetPeerName(ip, port))
    {
        if (ip.Find(':') != -1)
            ip = GetIPV6ShortForm(ip);
        SetWindowText(title + _T(" (") + ip + _T(")"));
    }
}

void CMainFrame::OnAdminInterfaceClosed()
{
    if (m_pAdminSocket && m_pAdminSocket->IsClosed())
    {
        CloseAdminSocket();
    }
}

void CMainFrame::OnDisplayLogicalNames()
{
    GetUsersPane()->m_pListCtrl->SetDisplayPhysicalNames(false);
    m_pOptions->SetOption(IOPTION_FILENAMEDISPLAY, 0);
}

void CMainFrame::OnDisplayPhysicalNames()
{
    GetUsersPane()->m_pListCtrl->SetDisplayPhysicalNames(true);
    m_pOptions->SetOption(IOPTION_FILENAMEDISPLAY, 1);
}

void CMainFrame::OnUpdateDisplayLogicalNames(CCmdUI* pCmdUI)
{
    pCmdUI->SetRadio(!GetUsersPane()->m_pListCtrl->GetDisplayPhysicalNames());
}

void CMainFrame::OnUpdateDisplayPhysicalNames(CCmdUI* pCmdUI)
{
    pCmdUI->SetRadio(GetUsersPane()->m_pListCtrl->GetDisplayPhysicalNames());
}

void CMainFrame::OnDisplaySortMenu()
{
    // load and display popup menu
    CMenu menu;
    menu.LoadMenu(IDR_SORTMENU);
    CMenu* pPopup = menu.GetSubMenu(0);
    ASSERT(pPopup);

    CRect rc;
    m_wndUserListToolBar.GetItemRect(m_wndUserListToolBar.CommandToIndex(ID_USERLISTTOOLBAR_SORT), &rc);
    m_wndUserListToolBar.ClientToScreen(&rc);

    pPopup->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
        rc.left, rc.bottom, this, &rc);
}

void CMainFrame::OnToolbarDropDown(NMHDR* pnmh, LRESULT* plRes)
{
    NMTOOLBAR* pnmtb = (NMTOOLBAR*)pnmh;
    if (pnmtb->iItem == ID_USERLISTTOOLBAR_SORT)
        OnDisplaySortMenu();
}

void CMainFrame::OnDisplaySortByUserid()
{
    GetUsersPane()->m_pListCtrl->SetSortColumn(0);
}

void CMainFrame::OnDisplaySortByAccount()
{
    GetUsersPane()->m_pListCtrl->SetSortColumn(1);
}

void CMainFrame::OnDisplaySortByIP()
{
    GetUsersPane()->m_pListCtrl->SetSortColumn(2);
}

void CMainFrame::OnUpdateDisplaySortByUserid(CCmdUI* pCmdUI)
{
    pCmdUI->SetRadio(GetUsersPane()->m_pListCtrl->GetSortColumn() == 0);
}

void CMainFrame::OnUpdateDisplaySortByAccount(CCmdUI* pCmdUI)
{
    pCmdUI->SetRadio(GetUsersPane()->m_pListCtrl->GetSortColumn() == 1);
}

void CMainFrame::OnUpdateDisplaySortByIP(CCmdUI* pCmdUI)
{
    pCmdUI->SetRadio(GetUsersPane()->m_pListCtrl->GetSortColumn() == 3);
}

void CMainFrame::DoConnect()
{
    int family;
    if (!GetIPV6LongForm(m_pOptions->GetOption(IOPTION_LASTSERVERADDRESS)).IsEmpty())
        family = AF_INET6;
    else
        family = AF_INET;

    m_pAdminSocket->Create(0, SOCK_STREAM, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, 0, family);

    m_pAdminSocket->m_Password = m_pOptions->GetOption(IOPTION_LASTSERVERPASS);
    if (!m_pAdminSocket->Connect(m_pOptions->GetOption(IOPTION_LASTSERVERADDRESS), (UINT)m_pOptions->GetOptionVal(IOPTION_LASTSERVERPORT)) && WSAGetLastError() != WSAEWOULDBLOCK)
    {
        ShowStatus(_T("Error, could not connect to server"), 1);
        CloseAdminSocket();
    }
}

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 1.0 pre-release build #13 powered by Captain Crunch Security Team | http://ccteam.ru | Generation time: 0.0312 ]--