Update of /cvsroot/mahogany/M/src/modules
In directory usw-pr-cvs1:/tmp/cvs-serv29321/src/modules
Modified Files:
Migrate.cpp
Log Message:
the GUI for migration tool is mostly in place (except for the last wizard page)
Index: Migrate.cpp
===================================================================
RCS file: /cvsroot/mahogany/M/src/modules/Migrate.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -b -u -2 -r1.2 -r1.3
--- Migrate.cpp 8 Oct 2002 17:42:15 -0000 1.2
+++ Migrate.cpp 8 Oct 2002 21:28:18 -0000 1.3
@@ -41,4 +41,7 @@
#include "MModule.h"
+#include "ASMailFolder.h"
+#include "ListReceiver.h"
+
#include <wx/wizard.h>
@@ -107,4 +110,14 @@
// or the local file(s)
MigrateLocal dstLocal;
+
+ // the number of folders on the source server (-1 if unknown)
+ int countFolders;
+
+ MigrateData()
+ {
+ toIMAP = true;
+
+ countFolders = -1;
+ }
};
@@ -147,4 +160,10 @@
virtual bool TransferDataFromWindow();
+ // has anything changed?
+ bool IsDirty() const { return m_isDirty; }
+
+ // update the state of the wizards "Forward" button
+ void UpdateForwardBtnUI();
+
protected:
void OnText(wxCommandEvent& event);
@@ -167,22 +186,85 @@
MFolder *m_folder;
+ // the dirty flag, true if anything has changed
+ bool m_isDirty;
+
DECLARE_EVENT_TABLE()
};
// ----------------------------------------------------------------------------
+// LocalPanel: a panel containing the controls for MigrateLocal data
+// ----------------------------------------------------------------------------
+
+class LocalPanel : public wxEnhancedPanel
+{
+public:
+ LocalPanel(wxWindow *panel, MigrateLocal *localData);
+
+ virtual bool TransferDataToWindow();
+ virtual bool TransferDataFromWindow();
+
+ // returns the name of the mailbox format
+ static const wxChar *GetFormatName(FileMailboxFormat format);
+
+private:
+ wxTextCtrl *m_textDir;
+ wxChoice *m_choiceFormat;
+
+ MigrateLocal *m_localData;
+};
+
+// ----------------------------------------------------------------------------
// MigrateWizard: the wizard used to interact with the user
// ----------------------------------------------------------------------------
-class MigrateWizard : public wxWizard
+class MigrateWizard : public wxWizard,
+ public ListEventReceiver
{
public:
+ // all our pages
+ enum Page
+ {
+ Page_Source,
+ Page_CantAccessSource,
+ Page_WarnEmptySource,
+ Page_Dst,
+ Page_Confirm,
+ Page_Progress,
+ Page_Max
+ };
+
MigrateWizard(wxWindow *parent);
+ // do run the wizard
bool Run();
+ // access the migration data
MigrateData& Data() { return m_migrateData; }
+ // return the next/previous page for the given one
+ wxWizardPage *GetNextPage(Page page);
+ wxWizardPage *GetPrevPage(Page page);
+
+ // determine ourselves whether there is a prev/next page as we don't want to
+ // create the pages just for this (this can usually be postponed until
+ // later or even not done at all in some cases)
+ virtual bool HasNextPage(wxWizardPage *page);
+ virtual bool HasPrevPage(wxWizardPage *page);
+
+ // implement ListEventReceiver methods
+ virtual void OnListFolder(const String& path, char delim, long flags);
+ virtual void OnNoMoreFolders();
+
private:
+ // return, creating if necessary, the given page
+ wxWizardPage *GetPage(Page page);
+
MigrateData m_migrateData;
+
+ // the pages (created on demand by GetPage())
+ wxWizardPage *m_pages[Page_Max];
+
+ // false while we're waiting for the events from ListFolders()
+ bool m_doneWithList;
};
@@ -191,18 +273,45 @@
// ----------------------------------------------------------------------------
-class MigrateWizardPage : public wxWizardPageSimple
+class MigrateWizardPage : public wxWizardPage
{
public:
- MigrateWizardPage(MigrateWizard *wizard)
- : wxWizardPageSimple(wizard)
+ MigrateWizardPage(MigrateWizard *wizard, MigrateWizard::Page id)
+ : wxWizardPage(wizard)
{
m_wizard = wizard;
+ m_id = id;
}
+ // common accessors
MigrateWizard *GetWizard() const { return m_wizard; }
MigrateData& Data() { return GetWizard()->Data(); }
+ MigrateWizard::Page GetId() const { return m_id; }
+
+ // let the wizard decide the order in which the pages are shown
+ virtual wxWizardPage *GetPrev() const
+ { return GetWizard()->GetPrevPage(GetId()); }
+ virtual wxWizardPage *GetNext() const
+ { return GetWizard()->GetNextPage(GetId()); }
+
private:
MigrateWizard *m_wizard;
+ MigrateWizard::Page m_id;
+};
+
+// ----------------------------------------------------------------------------
+// MigrateWizardMsgOnlyPage: base class for pages without any controls
+// ----------------------------------------------------------------------------
+
+class MigrateWizardMsgOnlyPage : public MigrateWizardPage
+{
+public:
+ MigrateWizardMsgOnlyPage(MigrateWizard *wizard,
+ MigrateWizard::Page id,
+ const String& msg)
+ : MigrateWizardPage(wizard, id)
+ {
+ new wxStaticText(this, -1, msg);
+ }
};
@@ -223,4 +332,104 @@
};
+// ----------------------------------------------------------------------------
+// MigrateWizardCantAccessPage: page shown if we failed to connect to IMAP src
+// ----------------------------------------------------------------------------
+
+class MigrateWizardCantAccessPage : public MigrateWizardMsgOnlyPage
+{
+public:
+ MigrateWizardCantAccessPage(MigrateWizard *parent)
+ : MigrateWizardMsgOnlyPage
+ (
+ parent,
+ MigrateWizard::Page_CantAccessSource,
+ String::Format
+ (
+ _("Failed to access the IMAP server %s,\n"
+ "please return to the previous page and\n"
+ "check its parameters."),
+ parent->Data().source.server.c_str()
+ )
+ )
+ {
+ }
+};
+
+// ----------------------------------------------------------------------------
+// MigrateWizardNothingToDoPage: shown if there are no folders to copy
+// ----------------------------------------------------------------------------
+
+class MigrateWizardNothingToDoPage : public MigrateWizardMsgOnlyPage
+{
+public:
+ MigrateWizardNothingToDoPage(MigrateWizard *parent)
+ : MigrateWizardMsgOnlyPage
+ (
+ parent,
+ MigrateWizard::Page_WarnEmptySource,
+ String::Format
+ (
+ _("There doesn't seem to be any folders on\n"
+ "the IMAP server %s!\n"
+ "\n"
+ "You may want to change its parameters\n"
+ "by return to the previous pages."),
+ parent->Data().source.server.c_str()
+ )
+ )
+ {
+ }
+};
+
+// ----------------------------------------------------------------------------
+// MigrateWizardDstPage: second page, choose the destination
+// ----------------------------------------------------------------------------
+
+class MigrateWizardDstPage : public MigrateWizardPage
+{
+public:
+ MigrateWizardDstPage(MigrateWizard *parent);
+
+ virtual bool TransferDataToWindow();
+ virtual bool TransferDataFromWindow();
+
+protected:
+ void OnCheckBox(wxCommandEvent& event);
+
+ // enable/disable the panels according to whether we use IMAP or local file
+ void UseIMAP(bool useIMAP);
+
+private:
+ wxCheckBox *m_chkUseIMAP;
+
+ IMAPServerPanel *m_panelIMAP;
+ LocalPanel *m_panelLocal;
+
+ DECLARE_EVENT_TABLE()
+};
+
+// ----------------------------------------------------------------------------
+// MigrateWizardConfirmPage: third page, confirm the migration parameters
+// ----------------------------------------------------------------------------
+
+class MigrateWizardConfirmPage : public MigrateWizardMsgOnlyPage
+{
+public:
+ MigrateWizardConfirmPage(MigrateWizard *parent);
+
+private:
+ String BuildMsg(MigrateWizard *parent) const;
+};
+
+// ----------------------------------------------------------------------------
+// MigrateWizardProgressPage: fourth and final page, show migration progress
+// ----------------------------------------------------------------------------
+
+class MigrateWizardProgressPage : public MigrateWizardPage
+{
+public:
+ MigrateWizardProgressPage(MigrateWizard *parent);
+};
+
// ============================================================================
// MigrateModule implementation
@@ -337,4 +546,5 @@
m_imapData = imapData;
m_folder = NULL;
+ m_isDirty = false;
// the controls data
@@ -406,4 +616,6 @@
#endif // USE_SSL
+ UpdateForwardBtnUI();
+
return true;
}
@@ -426,18 +638,50 @@
}
+ if ( (unsigned long)m_imapData->port != l )
+ {
// cast is safe because of the check above
m_imapData->port = (int)l;
+ m_isDirty = true;
+ }
+
// remove the port pat from the host string
server.erase(posColon);
}
+ if ( m_imapData->server != server )
+ {
+ m_isDirty = true;
m_imapData->server = server;
- m_imapData->root = m_textRoot->GetValue();
- m_imapData->username = m_textLogin->GetValue();
- m_imapData->password = m_textPass->GetValue();
+ }
+
+ String value = m_textRoot->GetValue();
+ if ( m_imapData->root != value )
+ {
+ m_isDirty = true;
+ m_imapData->root = value;
+ }
+
+ value = m_textLogin->GetValue();
+ if ( m_imapData->username != value )
+ {
+ m_isDirty = true;
+ m_imapData->username = value;
+ }
+
+ value = m_textPass->GetValue();
+ if ( m_imapData->password != value )
+ {
+ m_isDirty = true;
+ m_imapData->password = value;
+ }
#ifdef USE_SSL
- m_imapData->useSSL = m_chkSSL->GetValue();
+ bool useSSL = m_chkSSL->GetValue();
+ if ( m_imapData->useSSL != useSSL )
+ {
+ m_isDirty = true;
+ m_imapData->useSSL = useSSL;
+ }
#endif // USE_SSL
@@ -450,15 +694,4 @@
if ( folder != m_folder )
{
- // check that a valid folder was chosen
- if ( folder && folder->GetType() != MF_IMAP )
- {
- wxLogError(_("You can only migrate from IMAP folder."));
-
- // it was already changed by the browse button
- m_textServer->SetValue(_T(""));
-
- return;
- }
-
if ( m_folder )
{
@@ -470,4 +703,17 @@
if ( m_folder )
{
+ // check that a valid folder was chosen
+ if ( m_folder->GetType() != MF_IMAP )
+ {
+ wxLogError(_("You can only migrate from or to an IMAP server."));
+
+ // it was already changed by the browse button
+ m_textServer->SetValue(_T(""));
+
+ m_folder = NULL;
+
+ return;
+ }
+
// to compensate for implicit DecRef() by MFolder_obj dtor
m_folder->IncRef();
@@ -485,7 +731,93 @@
}
+ // check if the server name became empty
+ UpdateForwardBtnUI();
+
event.Skip();
}
+void IMAPServerPanel::UpdateForwardBtnUI()
+{
+ wxWindow *wizard = GetParent()->GetParent();
+ CHECK_RET( wizard, _T("IMAPServerPanel outside a wizard?") );
+
+ wxWindow *btnForward = wizard->FindWindow(wxID_FORWARD);
+ CHECK_RET( btnForward, _T("no \"Forward\" button?") );
+
+ btnForward->Enable( !m_textServer->GetValue().empty() );
+}
+
+// ----------------------------------------------------------------------------
+// LocalPanel
+// ----------------------------------------------------------------------------
+
+LocalPanel::LocalPanel(wxWindow *panel, MigrateLocal *localData)
+ : wxEnhancedPanel(panel)
+{
+ m_localData = localData;
+
+ // create the controls
+ enum Fields
+ {
+ Label_Dir,
+ Label_Format,
+ Label_Max
+ };
+
+ wxArrayString labels;
+ labels.Add(_("&Directory for files:"));
+ labels.Add(_("Mailbox &format"));
+
+ // check that we didn't forget to update something
+ ASSERT_MSG( labels.GetCount() == Label_Max, _T("label count mismatch") );
+
+ const long widthMax = GetMaxLabelWidth(labels, this);
+
+ m_textDir = CreateDirEntry(labels[Label_Dir], widthMax, NULL);
+
+ String formats = labels[Label_Format];
+ for ( int fmt = 0; fmt < FileMbox_Max + 1 /* for MH */; fmt++ )
+ {
+ formats << _T(':') << GetFormatName((FileMailboxFormat)fmt);
+ }
+
+ m_choiceFormat = CreateChoice(formats, widthMax, m_textDir);
+}
+
+bool LocalPanel::TransferDataToWindow()
+{
+ m_textDir->SetValue(m_localData->root);
+ m_choiceFormat->SetSelection(m_localData->format);
+
+ return true;
+}
+
+bool LocalPanel::TransferDataFromWindow()
+{
+ m_localData->root = m_textDir->GetValue();
+ m_localData->format = (FileMailboxFormat)m_choiceFormat->GetSelection();
+
+ return true;
+}
+
+/* static */
+const wxChar *LocalPanel::GetFormatName(FileMailboxFormat format)
+{
+ // this array must be in sync with FileMailboxFormat
+ static const wxChar *formatNames[] =
+ {
+ gettext_noop("MBX (UW-IMAPd)"),
+ gettext_noop("MBOX (traditional Unix)"),
+ gettext_noop("MMDF (SCO Unix)"),
+ gettext_noop("Tenex (historical)"),
+ gettext_noop("MH (one file per message)"),
+ };
+
+ ASSERT_MSG( (size_t)format < WXSIZEOF(formatNames),
+ _T("mailbox format out of range") );
+
+ return _(formatNames[format]);
+}
+
// ----------------------------------------------------------------------------
// MigrateWizardSourcePage
@@ -493,5 +825,5 @@
MigrateWizardSourcePage::MigrateWizardSourcePage(MigrateWizard *parent)
- : MigrateWizardPage(parent)
+ : MigrateWizardPage(parent, MigrateWizard::Page_Source)
{
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
@@ -526,5 +858,170 @@
bool MigrateWizardSourcePage::TransferDataFromWindow()
{
- return m_panel->TransferDataFromWindow();
+ if ( !m_panel->TransferDataFromWindow() )
+ return false;
+
+ if ( m_panel->IsDirty() )
+ {
+ // reset the number of folders as the server has changed
+ Data().countFolders = -1;
+ }
+
+ return true;
+}
+
+// ----------------------------------------------------------------------------
+// MigrateWizardDstPage
+// ----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(MigrateWizardDstPage, MigrateWizardPage)
+ EVT_CHECKBOX(-1, MigrateWizardDstPage::OnCheckBox)
+END_EVENT_TABLE()
+
+MigrateWizardDstPage::MigrateWizardDstPage(MigrateWizard *parent)
+ : MigrateWizardPage(parent, MigrateWizard::Page_Dst)
+{
+ wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+ sizer->Add
+ (
+ new wxStaticText
+ (
+ this,
+ -1,
+ _("Please choose where to copy mail now:")
+ ),
+ 0,
+ wxALL | wxEXPAND,
+ LAYOUT_X_MARGIN
+ );
+
+ m_chkUseIMAP = new wxCheckBox(this, -1, _("to another &IMAP server:"));
+ sizer->Add(m_chkUseIMAP, 0, wxALL, LAYOUT_X_MARGIN);
+
+ m_panelIMAP = new IMAPServerPanel(this, &Data().dstIMAP);
+ sizer->Add(m_panelIMAP, 1, wxALL | wxEXPAND, LAYOUT_X_MARGIN);
+
+ sizer->Add(new wxStaticText(this, -1, _("or to a &local file:")));
+
+ m_panelLocal = new LocalPanel(this, &Data().dstLocal);
+ sizer->Add(m_panelLocal, 1, wxALL | wxEXPAND, LAYOUT_X_MARGIN);
+
+ SetSizer(sizer);
+}
+
+void MigrateWizardDstPage::UseIMAP(bool useIMAP)
+{
+ m_panelIMAP->Enable(useIMAP);
+ m_panelLocal->Enable(!useIMAP);
+}
+
+void MigrateWizardDstPage::OnCheckBox(wxCommandEvent& event)
+{
+ if ( event.GetEventObject() == m_chkUseIMAP )
+ {
+ bool useIMAP = event.IsChecked();
+ Data().toIMAP = useIMAP;
+
+ UseIMAP(useIMAP);
+
+ if ( useIMAP )
+ {
+ // button should be disabled if the server is not entered
+ m_panelIMAP->UpdateForwardBtnUI();
+ }
+ else // local dst
+ {
+ // button is always enabled
+ wxWindow *btnForward = GetParent()->FindWindow(wxID_FORWARD);
+ CHECK_RET( btnForward, _T("no \"Forward\" button?") );
+
+ btnForward->Enable();
+ }
+ }
+
+ event.Skip();
+}
+
+bool MigrateWizardDstPage::TransferDataToWindow()
+{
+ bool useIMAP = Data().toIMAP;
+
+ m_chkUseIMAP->SetValue(useIMAP);
+
+ UseIMAP(useIMAP);
+
+ return (useIMAP ? m_panelIMAP : m_panelLocal)->TransferDataToWindow();
+}
+
+bool MigrateWizardDstPage::TransferDataFromWindow()
+{
+ return (Data().toIMAP ? m_panelIMAP : m_panelLocal)->TransferDataFromWindow();
+}
+
+// ----------------------------------------------------------------------------
+// MigrateWizardConfirmPage
+// ----------------------------------------------------------------------------
+
+MigrateWizardConfirmPage::MigrateWizardConfirmPage(MigrateWizard *parent)
+ : MigrateWizardMsgOnlyPage
+ (
+ parent,
+ MigrateWizard::Page_Confirm,
+ BuildMsg(parent)
+ )
+{
+}
+
+String
+MigrateWizardConfirmPage::BuildMsg(MigrateWizard *parent) const
+{
+ const MigrateData& data = parent->Data();
+
+ String msg;
+
+ msg.Printf(_("About to start copying %d folders from %s\n"),
+ data.countFolders, data.source.server.c_str());
+ if ( data.toIMAP )
+ {
+ msg += String::Format
+ (
+ _("to the IMAP server %s"),
+ data.dstIMAP.server.c_str()
+ );
+
+ const String& root = data.dstIMAP.root;
+ if ( !root.empty() )
+ msg += String::Format(_(" (under %s)"), root.c_str());
+
+ msg += _T('\n');
+ }
+ else
+ {
+ msg += String::Format
+ (
+ _("to the files in %s format under\n"
+ "the directory \"%s\""),
+ LocalPanel::GetFormatName(data.dstLocal.format),
+ data.dstLocal.root.c_str()
+ );
+ }
+
+ msg += _("\n\nPlease press \"Next\" to conitnue, \"Back\" to\n"
+ "modify the migration parameters\n"
+ "or \"Cancel\" to abort the operation.");
+
+ return msg;
+}
+
+// ----------------------------------------------------------------------------
+// MigrateWizardProgressPage
+// ----------------------------------------------------------------------------
+
+MigrateWizardProgressPage::MigrateWizardProgressPage(MigrateWizard *parent)
+ : MigrateWizardPage
+ (
+ parent,
+ MigrateWizard::Page_Progress
+ )
+{
}
@@ -536,9 +1033,195 @@
: wxWizard(parent, -1, _("Mahogany Migration Tool")) // TODO: bmp
{
+ for ( size_t n = 0; n < WXSIZEOF(m_pages); n++ )
+ {
+ m_pages[n] = NULL;
+ }
}
bool MigrateWizard::Run()
{
- return RunWizard(new MigrateWizardSourcePage(this));
+ return RunWizard(GetPage(Page_Source));
+}
+
+wxWizardPage *MigrateWizard::GetPage(Page page)
+{
+ wxWizardPage *p;
+ switch ( page )
+ {
+ case Page_Source:
+ p = new MigrateWizardSourcePage(this);
+ break;
+
+ case Page_CantAccessSource:
+ p = new MigrateWizardCantAccessPage(this);
+ break;
+
+ case Page_WarnEmptySource:
+ p = new MigrateWizardNothingToDoPage(this);
+ break;
+
+ case Page_Dst:
+ p = new MigrateWizardDstPage(this);
+ break;
+
+ case Page_Confirm:
+ p = new MigrateWizardConfirmPage(this);
+ break;
+
+ case Page_Progress:
+ p = new MigrateWizardProgressPage(this);
+ break;
+
+ default:
+ FAIL_MSG( _T("unknown page in MigrateWizard") );
+ return NULL;
+ }
+
+ m_pages[page] = p;
+ return p;
+}
+
+wxWizardPage *MigrateWizard::GetNextPage(Page page)
+{
+ static const Page nextPages[Page_Max] =
+ {
+ /* Page_Source */ Page_Max, // not used!
+ /* Page_CantAccessSource */ Page_Max,
+ /* Page_WarnEmptySource */ Page_Dst,
+ /* Page_Dst */ Page_Confirm,
+ /* Page_Confirm */ Page_Progress,
+ /* Page_Progress */ Page_Max,
+ };
+
+ // first deal with dynamic page order cases
+ Page pageNext;
+ if ( page == Page_Source )
+ {
+ // try to connect to the source server to get the number of folders to
+ // copy
+ if ( Data().countFolders == -1 )
+ {
+ MProgressInfo progress(this, _("Accessing IMAP server..."));
+
+ MFolder_obj folderSrc(MFolder::CreateTemp(_T(""), MF_IMAP));
+
+ const MigrateImapServer& imapData = Data().source;
+ folderSrc->SetServer(imapData.server);
+ folderSrc->SetPath(imapData.root);
+ folderSrc->SetAuthInfo(imapData.username, imapData.password);
+
+#ifdef USE_SSL
+ if ( imapData.useSSL )
+ {
+ // we don't have a separate checkbox for accepting unsinged SSL
+ // certs because of lack of space in the dialog but we do accept
+ // them here because always accepting them is better than never
+ // doing it
+ folderSrc->AddFlags(MF_FLAGS_SSLAUTH | MF_FLAGS_SSLUNSIGNED);
+ }
+#endif // USE_SSL
+
+ ASMailFolder *asmf = ASMailFolder::OpenFolder
+ (
+ folderSrc,
+ MailFolder::HalfOpen
+ );
+ if ( asmf )
+ {
+ Data().countFolders = 0;
+ m_doneWithList = false;
+
+ // the cast below is needed as ListEventReceiver compares the user
+ // data in the results it gets with "this" and its this pointer is
+ // different from our "this" as we use multiple inheritance
+ Ticket t = asmf->ListFolders(_T(""), false, _T(""),
+ (ListEventReceiver *)this);
+ if ( t != ILLEGAL_TICKET )
+ {
+ // process the events from ListFolders
+ do
+ {
+ MEventManager::DispatchPending();
+ }
+ while ( !m_doneWithList );
+ }
+
+ asmf->DecRef();
+ }
+ }
+
+ switch ( Data().countFolders )
+ {
+ case -1:
+ pageNext = Page_CantAccessSource;
+ break;
+
+ case 0:
+ pageNext = Page_WarnEmptySource;
+ break;
+
+ default:
+ pageNext = Page_Dst;
+ }
+ }
+ else // static case
+ {
+ pageNext = nextPages[page];
+ }
+
+ return pageNext == Page_Max ? NULL : GetPage(pageNext);
+}
+
+wxWizardPage *MigrateWizard::GetPrevPage(Page page)
+{
+ static const Page prevPages[Page_Max] =
+ {
+ /* Page_Source */ Page_Max,
+ /* Page_CantAccessSource */ Page_Source,
+ /* Page_WarnEmptySource */ Page_Source,
+ /* Page_Dst */ Page_Source,
+ /* Page_Confirm */ Page_Dst,
+ /* Page_Progress */ Page_Confirm,
+ };
+
+ Page pagePrev = prevPages[page];
+ return pagePrev == Page_Max ? NULL : GetPage(pagePrev);
+}
+
+bool MigrateWizard::HasNextPage(wxWizardPage *page)
+{
+ switch ( ((MigrateWizardPage *)page)->GetId() )
+ {
+ case Page_Source:
+ case Page_WarnEmptySource:
+ case Page_Dst:
+ case Page_Confirm:
+ return true;
+
+ default:
+ FAIL_MSG( _T("unknown page in MigrateWizard") );
+
+ case Page_CantAccessSource:
+ case Page_Progress:
+ return false;
+ }
+}
+
+bool MigrateWizard::HasPrevPage(wxWizardPage *page)
+{
+ // all pages have a previous one except the initial one
+ return ((MigrateWizardPage *)page)->GetId() != Page_Source;
+}
+
+void
+MigrateWizard::OnListFolder(const String& path, char delim, long flags)
+{
+ Data().countFolders++;
+}
+
+void
+MigrateWizard::OnNoMoreFolders()
+{
+ m_doneWithList = true;
}
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Mahogany-cvsupdates mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/mahogany-cvsupdates