editor: Change FileSelect abstraction to use StdStrBuf

Of course, windows still uses a buffer on the stack, but at least the other
versions don't.
Günther Brammer 2011-04-08 23:52:40 +02:00
parent 05608a3edd
commit e537296829
9 changed files with 61 additions and 100 deletions

View File

@ -232,20 +232,20 @@ bool C4Console::FileSave(bool fSaveGame)
bool C4Console::FileSaveAs(bool fSaveGame)
{
// Do save-as dialog
char filename[512+1];
SCopy(Game.ScenarioFile.GetName(),filename);
if (!FileSelect(filename,512,
StdStrBuf filename;
filename.Copy(Game.ScenarioFile.GetName());
if (!FileSelect(&filename,
"Clonk 4 Scenario\0*.ocs\0\0",
OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY,
true)) return false;
DefaultExtension(filename,"ocs");
DefaultExtension(&filename,"ocs");
bool fOkay=true;
// Close current scenario file
if (!Game.ScenarioFile.Close()) fOkay=false;
// Copy current scenario file to target
if (!C4Group_CopyItem(Game.ScenarioFilename,filename)) fOkay=false;
if (!C4Group_CopyItem(Game.ScenarioFilename,filename.getData())) fOkay=false;
// Open new scenario file
SCopy(filename,Game.ScenarioFilename);
SCopy(filename.getData(),Game.ScenarioFilename);
SetCaption(GetFilename(Game.ScenarioFilename));
if (!Game.ScenarioFile.Open(Game.ScenarioFilename)) fOkay=false;
@ -267,40 +267,40 @@ bool C4Console::Message(const char *szMessage, bool fQuery)
bool C4Console::FileOpen()
{
// Get scenario file name
char c4sfile[512+1]="";
if (!FileSelect(c4sfile,512,
StdStrBuf c4sfile ("");
if (!FileSelect(&c4sfile,
FILE_SELECT_FILTER_FOR_C4S,
OFN_HIDEREADONLY | OFN_FILEMUSTEXIST))
return false;
Application.ClearCommandLine();
// Open game
Application.OpenGame(c4sfile);
Application.OpenGame(c4sfile.getData());
return true;
}
bool C4Console::FileOpenWPlrs()
{
// Get scenario file name
char c4sfile[512+1]="";
if (!FileSelect(c4sfile,512,
StdStrBuf c4sfile ("");
if (!FileSelect(&c4sfile,
FILE_SELECT_FILTER_FOR_C4S,
OFN_HIDEREADONLY | OFN_FILEMUSTEXIST))
return false;
// Get player file name(s)
char c4pfile[4096+1]="";
if (!FileSelect(c4pfile,4096,
StdStrBuf c4pfile ("");
if (!FileSelect(&c4pfile,
"Clonk 4 Player\0*.ocp\0\0",
OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_EXPLORER
)) return false;
// Compose command line
Application.ClearCommandLine();
if (DirectoryExists(c4pfile)) // Multiplayer
if (DirectoryExists(c4pfile.getData())) // Multiplayer
{
const char *cptr = c4pfile + SLen(c4pfile) + 1;
const char *cptr = c4pfile.getData() + SLen(c4pfile.getData()) + 1;
while (*cptr)
{
char c4pfile2[512 + 1] = "";
SAppend(c4pfile, c4pfile2, 512);
SAppend(c4pfile.getData(), c4pfile2, 512);
SAppend(DirSep, c4pfile2, 512);
SAppend(cptr, c4pfile2, 512);
SAddModule(Game.PlayerFilenames, c4pfile2);
@ -309,10 +309,10 @@ bool C4Console::FileOpenWPlrs()
}
else // Single player
{
SAddModule(Game.PlayerFilenames, c4pfile);
SAddModule(Game.PlayerFilenames, c4pfile.getData());
}
// Open game
Application.OpenGame(c4sfile);
Application.OpenGame(c4sfile.getData());
return true;
}
@ -323,9 +323,9 @@ bool C4Console::FileClose()
return true;
}
bool C4Console::FileSelect(char *sFilename, int iSize, const char * szFilter, DWORD dwFlags, bool fSave)
bool C4Console::FileSelect(StdStrBuf * sFilename, const char * szFilter, DWORD dwFlags, bool fSave)
{
return C4ConsoleGUI::FileSelect(sFilename, iSize, szFilter, dwFlags, fSave);
return C4ConsoleGUI::FileSelect(sFilename, szFilter, dwFlags, fSave);
}
bool C4Console::FileRecord()
@ -444,44 +444,31 @@ void C4Console::UpdateMenus()
void C4Console::PlayerJoin()
{
// Get player file name(s)
char c4pfile[4096+1]="";
if (!FileSelect(c4pfile,4096,
StdStrBuf c4pfile ("");
if (!FileSelect(&c4pfile,
"Clonk 4 Player\0*.ocp\0\0",
OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_EXPLORER
)) return;
// Compose player file list
char c4plist[6000]="";
// Multiple players
if (DirectoryExists(c4pfile))
if (DirectoryExists(c4pfile.getData()))
{
const char *cptr = c4pfile+SLen(c4pfile)+1;
const char *cptr = c4pfile.getData() + SLen(c4pfile.getData()) + 1;
while (*cptr)
{
SNewSegment(c4plist);
SAppend(c4pfile,c4plist); SAppend(DirSep ,c4plist); SAppend(cptr,c4plist);
StdStrBuf f;
f.Copy(c4pfile.getData());
f.AppendBackslash(); f.Append(cptr);
cptr += SLen(cptr)+1;
::Players.JoinNew(f.getData());
}
}
// Single player
else
{
SAppend(c4pfile,c4plist);
::Players.JoinNew(c4pfile.getData());
}
// Join players (via network/ctrl queue)
char szPlayerFilename[_MAX_PATH+1];
for (int iPar=0; SCopySegment(c4plist,iPar,szPlayerFilename,';',_MAX_PATH); iPar++)
if (szPlayerFilename[0])
{
if (::Network.isEnabled())
::Network.Players.JoinLocalPlayer(szPlayerFilename, true);
else
::Players.CtrlJoinLocalNoNetwork(szPlayerFilename, Game.Clients.getLocalID(), Game.Clients.getLocalName());
}
}
void C4Console::UpdateNetMenu()
@ -583,7 +570,7 @@ CStdWindow * C4ConsoleGUI::CreateConsoleWindow(CStdApp*) {return 0;}
void C4ConsoleGUI::DisplayInfoText(C4ConsoleGUI::InfoTextType, StdStrBuf&) {}
void C4ConsoleGUI::DoEnableControls(bool) {}
bool C4ConsoleGUI::DoUpdateHaltCtrls(bool) {return 0;}
bool C4ConsoleGUI::FileSelect(char*, int, char const*, unsigned int, bool) {return 0;}
bool C4ConsoleGUI::FileSelect(StdStrBuf *, char const*, unsigned int, bool) {return 0;}
bool C4ConsoleGUI::Message(char const*, bool) {return 0;}
void C4ConsoleGUI::Out(char const*) {}
bool C4ConsoleGUI::PropertyDlgOpen() {return 0;}

View File

@ -82,7 +82,7 @@ public:
void PlayerJoin();
void ViewportNew();
void HelpAbout();
bool FileSelect(char *sFilename, int iSize, const char *szFilter, DWORD dwFlags, bool fSave=false);
bool FileSelect(StdStrBuf *sFilename, const char *szFilter, DWORD dwFlags, bool fSave=false);
bool SaveGame(bool fSaveGame);
bool FileSaveAs(bool fSaveGame);
bool FileSave(bool fSaveGame);

View File

@ -118,7 +118,7 @@ void C4ConsoleGUI::SetCaptionToFileName(const char* file_name)
[ctrler(this).window setRepresentedFilename:[NSString stringWithUTF8String:file_name]];
}
bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter, DWORD dwFlags, bool fSave)
bool C4ConsoleGUI::FileSelect(StdStrBuf *sFilename, const char * szFilter, DWORD dwFlags, bool fSave)
{
NSSavePanel* savePanel = fSave ? [NSSavePanel savePanel] : [NSOpenPanel openPanel];
if (!fSave)
@ -128,7 +128,7 @@ bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter,
}
if ([savePanel runModal] == NSFileHandlingPanelOKButton && [[savePanel URL] isFileURL])
{
strncpy(sFilename, [[savePanel URL].path cStringUsingEncoding:NSUTF8StringEncoding], iSize);
sFilename->Copy([[savePanel URL].path cStringUsingEncoding:NSUTF8StringEncoding]);
return true;
}
else

View File

@ -665,16 +665,16 @@ bool C4ConsoleGUI::UpdateModeCtrls(int iMode)
return true;
}
bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter, DWORD dwFlags, bool fSave)
bool C4ConsoleGUI::FileSelect(StdStrBuf *sFilename, const char * szFilter, DWORD dwFlags, bool fSave)
{
GtkWidget* dialog = gtk_file_chooser_dialog_new(fSave ? "Save file..." : "Load file...", GTK_WINDOW(window), fSave ? GTK_FILE_CHOOSER_ACTION_SAVE : GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, fSave ? GTK_STOCK_SAVE : GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
// TODO: Set dialog modal?
if (g_path_is_absolute(sFilename) )
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), sFilename);
if (g_path_is_absolute(sFilename->getData()) )
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), sFilename->getData());
else if (fSave)
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), sFilename);
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), sFilename->getData());
// Install file filter
while (*szFilter)
@ -749,7 +749,7 @@ bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter,
{
// Just the file name without multiselect
char* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
SCopy(filename, sFilename, iSize);
sFilename->Copy(filename);
g_free(filename);
}
else
@ -757,10 +757,8 @@ bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter,
// Otherwise its the folder followed by the file names,
// separated by '\0'-bytes
char* folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog));
int len = SLen(folder);
if (iSize > 0) SCopy(folder, sFilename, Min(len + 1, iSize));
iSize -= (len + 1); sFilename += (len + 1);
sFilename->Copy(folder);
g_free(folder);
GSList* files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog));
@ -769,16 +767,14 @@ bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter,
const char* file = static_cast<const char*>(item->data);
char* basefile = g_path_get_basename(file);
int len = SLen(basefile);
if (iSize > 0) SCopy(basefile, sFilename, Min(len + 1, iSize));
iSize -= (len + 1); sFilename += (len + 1);
sFilename->AppendChar('\0');
sFilename->Append(basefile);
g_free(basefile);
g_free(item->data);
}
// End of list
*sFilename = '\0';
g_slist_free(files);
}

View File

@ -105,7 +105,7 @@ public:
void DisplayInfoText(InfoTextType type, StdStrBuf& text);
void SetCaptionToFileName(const char* file_name);
void SetCaption(const char *caption);
bool FileSelect(char *sFilename, int iSize, const char * szFilter, DWORD dwFlags, bool fSave);
bool FileSelect(StdStrBuf *sFilename, const char * szFilter, DWORD dwFlags, bool fSave);
void AddMenuItemForPlayer(C4Player *player, StdStrBuf& player_text);
void AddKickPlayerMenuItem(C4Player *player, StdStrBuf& player_text, bool enabled);
void ClearViewportMenu();

View File

@ -772,17 +772,18 @@ void C4ConsoleGUI::ShowAboutWithCopyright(StdStrBuf &copyright)
MessageBoxW(NULL, strMessage.GetWideChar(), ADDL(C4ENGINECAPTION), MB_ICONINFORMATION | MB_TASKMODAL);
}
bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter, DWORD dwFlags, bool fSave)
bool C4ConsoleGUI::FileSelect(StdStrBuf *sFilename, const char * szFilter, DWORD dwFlags, bool fSave)
{
enum { ArbitraryMaximumLength = 4096 };
char buffer[ArbitraryMaximumLength];
SCopy(sFilename->getData(), buffer, ArbitraryMaximumLength);
OPENFILENAME ofn;
ZeroMem(&ofn,sizeof(ofn));
ofn.lStructSize=sizeof(ofn);
ofn.hwndOwner=hWindow;
ofn.lpstrFilter=szFilter;
ofn.lpstrFile=sFilename;
ofn.nMaxFile=iSize;
ofn.nFileOffset= GetFilename(sFilename) - sFilename;
ofn.nFileExtension= GetExtension(sFilename) - sFilename;
ofn.lpstrFile=buffer;
ofn.nMaxFile=ArbitraryMaximumLength;
ofn.Flags=dwFlags;
bool fResult;
@ -794,6 +795,7 @@ bool C4ConsoleGUI::FileSelect(char *sFilename, int iSize, const char * szFilter,
// Reset working directory to exe path as Windows file dialog might have changed it
SetCurrentDirectory(wd);
sFilename->Copy(buffer);
return fResult;
}

View File

@ -319,39 +319,18 @@ C4Player* C4PlayerList::Join(const char *szFilename, bool fScenarioInit, int iAt
return pPlr;
}
bool C4PlayerList::CtrlJoinLocalNoNetwork(const char *szFilename, int iAtClient, const char *szAtClientName)
// Join players (via network/ctrl queue)
void C4PlayerList::JoinNew(const char *szFilename)
{
assert(!::Network.isEnabled());
// Create temp copy of player file without portraits
// Why? This is local join!
/*
char szTempFilename[_MAX_PATH + 1] = "";
const char *szOriginalFilename = szFilename;
if (!Config.Network.SendPortraits)
{
SCopy(Config.AtTempPath(GetFilename(szFilename)), szTempFilename, _MAX_PATH);
if (!CopyItem(szFilename, szTempFilename)) return false;
C4Group hGroup;
if (hGroup.Open(szTempFilename))
{
hGroup.Delete(C4CFN_Portraits, true);
hGroup.Close();
}
szFilename = szTempFilename;
} */
// pack - not needed for new res system
/*if(DirectoryExists(szFilename))
if(!C4Group_PackDirectory(szFilename))
return false;*/
if (::Network.isEnabled())
{
::Network.Players.JoinLocalPlayer(szFilename, true);
return;
}
// security
if (!ItemExists(szFilename)) return false;
if (!ItemExists(szFilename)) return;
// join via player info
bool fSuccess = Game.PlayerInfos.DoLocalNonNetworkPlayerJoin(szFilename);
// Delete temp player file
/*if(*szTempFilename) EraseItem(szTempFilename);*/
// Done
return fSuccess;
Game.PlayerInfos.DoLocalNonNetworkPlayerJoin(szFilename);
}
void SetClientPrefix(char *szFilename, const char *szClient)

View File

@ -58,7 +58,7 @@ public:
C4Player *GetAtRemoteClient(int iIndex=0) const;
C4Player *GetByInfoID(int iInfoID) const;
C4Player *Join(const char *szFilename, bool fScenarioInit, int iAtClient, const char *szAtClientName, class C4PlayerInfo *pInfo, C4ValueNumbers *);
bool CtrlJoinLocalNoNetwork(const char *szFilename, int iAtClient, const char *szAtClientName);
void JoinNew(const char *szFilename);
bool CtrlJoin(const class C4Network2ResCore &ResCore, int iClientID, int idPlayerInfo);
bool FileInUse(const char *szFilename) const;
bool Retire(C4Player *pPlr);

View File

@ -709,11 +709,8 @@ bool C4MainMenu::MenuCommand(const char *szCommand, bool fIsCloseCommand)
// not in league or replay mode
if (Game.Parameters.isLeague() || Game.C4S.Head.Replay) return false;
// join player
if (::Network.isEnabled())
// 2do: not for observers and such?
::Network.Players.JoinLocalPlayer(szCommand+11, true);
else
::Players.CtrlJoinLocalNoNetwork(szCommand+11, Game.Clients.getLocalID(), Game.Clients.getLocalName());
// 2do: not for observers and such?
Players.JoinNew(szCommand+11);
return true;
}
// SetHostility