//--------------------------------------------------------------------------- /// Meotoda odpowiada za w³aœciwe wyszukiwanie danych opini, metoda przyjmuje znaczniki pocz¹tkowe oraz koñcowe, /// pomiêdzy którymi znajduj¹ siê po¿¹dane teksty. AnsiString __fastcall ParsujDane::ZnajdzTekstOpini(AnsiString &ATextOpini, AnsiString AZnacznikPocz, AnsiString AZnacznikKoniec, bool ATnij) { AnsiString txt; int pozycjaZnacznik, start, koniec; pozycjaZnacznik = ATextOpini.Pos(AZnacznikPocz); if (pozycjaZnacznik == 0) return ""; while (true) { txt += ATextOpini[pozycjaZnacznik]; if (ATnij) { if (txt.Pos(AZnacznikPocz) > 0) { txt = txt.Delete(1, AZnacznikPocz.Length()); } } if (txt.Pos(AZnacznikKoniec) > 0) break; pozycjaZnacznik++; } if (!ATnij) { start = AZnacznikPocz.Length() + 1; koniec = txt.Length() - AZnacznikPocz.Length() - AZnacznikKoniec.Length(); } else { start = 1; koniec = txt.Length() - AZnacznikKoniec.Length(); } txt = txt.SubString(start, koniec); txt.TrimLeft(); txt.TrimRight(); return txt; }
//--------------------------------------------------------------------------- /// Metoda odpowiedzialna za usunieciê przekazanych znaczników z przekazanego tekstu, /// metoda umo¿liwia umieszczenie znacznika konca lini w zamian za przyjmowany znacznik void __fastcall ParsujDane::UsunZnacznik(AnsiString &AText, AnsiString AZnacznik, bool AWstawENDL) { int pozycjaZnacznik, i; i = 0; while (true) { pozycjaZnacznik = AText.Pos(AZnacznik); if (AZnacznik == ' ') { if (AText.Pos(' ') > 1) break; } if (pozycjaZnacznik > 0) AText.Delete(pozycjaZnacznik, AZnacznik.Length()); if (pozycjaZnacznik > 0 && AWstawENDL) AText.Insert("<ENDL>",pozycjaZnacznik); if (pozycjaZnacznik == 0) break; } AText.TrimLeft(); AText.TrimRight(); }
// get the value of a parameter bool MimeField::GetParameter(const char* pszAttr, AnsiString& strValue) const { strValue = ""; bool encodedParameter = false; vector<AnsiString> parameters = StringParser::SplitString(AnsiString(m_strValue), ";"); for (unsigned int i = 1; i < parameters.size(); i++) { AnsiString value = parameters[i]; value.TrimLeft(); // Locate end of parameter name. int nameEndPos = 0; for (nameEndPos = 0; nameEndPos < value.GetLength(); nameEndPos++) { char c = value[nameEndPos]; if (c == ' ' || c == '*' || c == '=') break; } // If we haven't found any value for this parameter, bail out. if (nameEndPos == 0 && strValue.IsEmpty()) return false; AnsiString parameterName = value.Mid(0, nameEndPos); if (parameterName.CompareNoCase(pszAttr) != 0) continue; // Locate start of parameter value. int valuePos = 0; for (valuePos = nameEndPos; valuePos < value.GetLength(); valuePos++) { char c = value[valuePos]; if (c == '=') break; } // We want the char before = NOT char after param name // to detect encoding per RFC 2231 4.1 // http://www.hmailserver.com/forum/viewtopic.php?f=10&t=21417 char characterBeforeEquals = value[valuePos - 1]; if (characterBeforeEquals == '*') encodedParameter = true; // Skip past the equal sign. valuePos++; // Locate the start of the actual value. May be enclosed with quotes. // // For instance, this is perfectly valid // Content-Type: text/plain; charset = "iso-8859-1" // for (; valuePos < value.GetLength(); valuePos++) { char c = value[valuePos]; if (c == ' ' || c == '"') continue; else break; } // Locate the end of the value. The value may contain // pretty much any character, including space. int valueEndPos = valuePos; for (; valueEndPos < value.GetLength(); valueEndPos++) { char c = value[valueEndPos]; if (c == ';' || c == '"') break; else continue; } int valueLength = valueEndPos - valuePos; value = value.Mid(valuePos, valueLength); // If the value is // Content-Type: text/plain; charset = "iso-8859-1" // it needs to be trimmed. value.TrimRight(); strValue.append(value); } if (strValue.IsEmpty()) return false; /* (2) MIME headers, like the RFC 822 headers they often appear in, are limited to 7bit US-ASCII, and the encoded-word mechanisms of RFC 2047 are not available to parameter values. This makes it impossible to have parameter values in character sets other than US-ASCII without specifying some sort of private per-parameter encoding. http://tools.ietf.org/html/draft-freed-pvcsc-03 Examples: Input: ISO-8859-1''%E9%2E%70%6E%67 Output: =?ISO-8859-1?Q?=E9=2Epng?= */ if (encodedParameter) { MimeParameterRFC2184Decoder decoder; strValue.assign(decoder.Decode(strValue)); } strValue.TrimLeft(); return true; }
//--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- TMYIniFile::TMYIniFile(char * File, bool enableExceptions, bool bCreateNewFile) : TFile(enableExceptions), FileName(File) { list = NULL; BYTE * p = NULL; try { IniError = 0; bAnyError = false; bChange = false; CurSectionIndex = -1; CurParamIndex = -1; list = new TStringList(); if( ! bCreateNewFile ) { // Откроем файл для чтения if( ! Open(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN) ) { // Файла нет - ошибку не даем, может мы будем его потом записывать... //IniError = 1; bAnyError = true; return; } // Считаем содержимое файла DWORD l = GetSize(); if( l > 0 ) { p = new BYTE[l]; AnsiString s; if( ! Read(p, l) ) { IniError = 1; bAnyError = true; } else for(DWORD i=0; i<l; i++) { if( p[i]=='\r' || p[i]=='\n' || !p[i] ) { s = s.TrimLeft(); if( s.Length()>0 ) { list->Add(s); s = ""; } } else s += (char)p[i]; } delete [] p; p = NULL; } } } catch(...) { IniError = 1; bAnyError = true; delete [] p; } // Закрываем считанный файл Close(); }