void ResourceData::ReadRC(RCFile &rcFile) { if (rcFile.IsKeyword()) { int maxLen = 1024; data = new unsigned char [maxLen]; rcFile.NeedBegin(); while (rcFile.IsNumber()) { if (len == maxLen) { maxLen += 1024; unsigned char *hold = data; data = new unsigned char [maxLen]; memcpy(data, hold, maxLen - 1024); delete [] hold; } data[len++] = rcFile.GetNumber() & 0xff; rcFile.SkipComma(); } rcFile.NeedEnd(); } else { std::string name = rcFile.GetFileName(); std::fstream in(name.c_str(), std::ios::in | std::ios::binary); if (!in.fail()) { in.seekg(0, std::ios::end); len = in.tellg(); in.seekg(0, std::ios::beg); data = new unsigned char[len]; in.read((char *)data, len); } else throw new std::runtime_error(std::string("Could not open file '") + name + "'"); } }
void Accelerators::Key::ReadRC(RCFile &rcFile) { if (rcFile.IsString()) { std::wstring str = rcFile.GetString(); if (str[0] == '^') { if (str.size() != 2) throw new std::runtime_error("Invalid key sequence"); if (str[1] == '^') key = '^'; else key = str[1] & 0x1f; } else { if (str.size() != 1) throw new std::runtime_error("Invalid key sequence"); key = str[0]; } } else { key = rcFile.GetNumber(); } rcFile.SkipComma(); id = rcFile.GetNumber(); rcFile.SkipComma(); bool done = false; while (rcFile.IsKeyword() && !done) { switch (rcFile.GetToken()->GetKeyword()) { case Lexer::ASCII: flags &= ~Virtkey; break; case Lexer::VIRTKEY: flags |= Virtkey; break; case Lexer::NOINVERT: flags |= NoInvert; break; case Lexer::SHIFT: flags |= Shift; break; case Lexer::CONTROL: flags |= Control; break; case Lexer::ALT: flags |= Alt; break; default: done = true; break; } if (!done) { rcFile.NextToken(); rcFile.SkipComma(); } } rcFile.NeedEol(); }
void Dialog::ReadSettings(RCFile &rcFile) { bool hascaption = false, hasstyle = false, hasfont = false; resInfo.SetLanguage(rcFile.GetLanguage()); bool done = FALSE; while (!done && rcFile.IsKeyword()) { switch (rcFile.GetToken()->GetKeyword()) { case Lexer::LANGUAGE: { rcFile.NextToken(); int n = rcFile.GetNumber() ; rcFile.SkipComma(); n += rcFile.GetNumber() * 1024; resInfo.SetLanguage(n); } break; case Lexer::VERSION: rcFile.NextToken(); resInfo.SetVersion(rcFile.GetNumber()); break; case Lexer::CHARACTERISTICS: rcFile.NextToken(); resInfo.SetCharacteristics(rcFile.GetNumber()); break; case Lexer::STYLE: hasstyle = true; rcFile.NextToken(); style = rcFile.GetNumber(); break; case Lexer::EXSTYLE: rcFile.NextToken(); exStyle |= rcFile.GetNumber(); break; case Lexer::MENU: rcFile.NextToken(); menu.ReadRC(rcFile); break; case Lexer::FONT: hasfont = true; rcFile.NextToken(); pointSize = rcFile.GetNumber(); rcFile.SkipComma(); font = rcFile.GetString(); break; case Lexer::CAPTION: hascaption = true; rcFile.NextToken(); caption = rcFile.GetString(); break; case Lexer::CLASS: rcFile.NextToken(); cls.ReadRC(rcFile, true); break; case Lexer::HELP: rcFile.NextToken(); if (!extended) throw new std::runtime_error("Need DialogEx"); helpIndex = rcFile.GetNumber(); break; case Lexer::WEIGHT: rcFile.NextToken(); if (!extended) throw new std::runtime_error("Need DialogEx"); weight = rcFile.GetNumber(); break; case Lexer::ITALIC: rcFile.NextToken(); if (!extended) throw new std::runtime_error("Need DialogEx"); italics = rcFile.GetNumber(); break; default: done = TRUE; break; } if (!done) { rcFile.NeedEol(); } } if (hascaption) style |= WS_CAPTION; if (!hasstyle) style |= WS_POPUPWINDOW; if (hasfont) style |= DS_SETFONT; }