This is my patch to store the encoding of a document between
opening and saving so you don't have to use the encoding dialog
every save.
This fixes bug 1466.
Andrew Dunbar.
--
http://linguaphile.sourceforge.net
Index: src/af/xap/xp/xad_Document.cpp
===================================================================
RCS file: /cvsroot/abi/src/af/xap/xp/xad_Document.cpp,v
retrieving revision 1.17
diff -u -r1.17 xad_Document.cpp
--- src/af/xap/xp/xad_Document.cpp 2001/05/25 18:02:26 1.17
+++ src/af/xap/xp/xad_Document.cpp 2001/06/08 23:31:56
@@ -28,6 +28,7 @@
{
m_iRefCount = 1;
m_szFilename = NULL;
+ *m_szEncodingName = '\0';
// TODO do we need to auto-increase the bucket count,
// TODO if the ignore list gets long?
@@ -188,4 +189,22 @@
UT_ASSERT(m_pIgnoreList);
return true;
+}
+
+// Document-wide Encoding name used for some file formats (Text, RTF, HTML)
+
+void AD_Document::setEncodingName(const char *szEncodingName)
+{
+ if (szEncodingName == NULL)
+ szEncodingName = "";
+
+ UT_ASSERT(strlen(szEncodingName) < 16);
+
+ strncpy(m_szEncodingName,szEncodingName,16);
+ m_szEncodingName[15] = 0;
+}
+
+const char * AD_Document::getEncodingName(void) const
+{
+ return *m_szEncodingName ? m_szEncodingName : 0;
}
Index: src/af/xap/xp/xad_Document.h
===================================================================
RCS file: /cvsroot/abi/src/af/xap/xp/xad_Document.h,v
retrieving revision 1.17
diff -u -r1.17 xad_Document.h
--- src/af/xap/xp/xad_Document.h 2001/05/25 05:52:12 1.17
+++ src/af/xap/xp/xad_Document.h 2001/06/08 23:31:56
@@ -60,11 +60,15 @@
bool enumIgnores(UT_uint32 k, const UT_UCSChar **
pszWord) const;
bool clearIgnores(void);
+ void setEncodingName(const char * szEncodingName);
+ const char * getEncodingName(void) const;
+
protected:
virtual ~AD_Document(); // Use unref() instead.
int m_iRefCount;
const char * m_szFilename;
+ char m_szEncodingName[16];
UT_HashTable * m_pIgnoreList;
};
Index: src/wp/impexp/xp/ie_exp_Text.cpp
===================================================================
RCS file: /cvsroot/abi/src/wp/impexp/xp/ie_exp_Text.cpp,v
retrieving revision 1.25
diff -u -r1.25 ie_exp_Text.cpp
--- src/wp/impexp/xp/ie_exp_Text.cpp 2001/06/07 15:52:42 1.25
+++ src/wp/impexp/xp/ie_exp_Text.cpp 2001/06/08 23:33:15
@@ -104,11 +104,18 @@
IE_Exp_Text::IE_Exp_Text(PD_Document * pDocument, bool bEncoded)
: IE_Exp(pDocument)
{
+ UT_ASSERT(pDocument);
+
+ const char *szEncodingName = pDocument->getEncodingName();
+ if (!szEncodingName || !*szEncodingName)
+ szEncodingName =
+XAP_EncodingManager::get_instance()->getNativeEncodingName();
+
m_error = 0;
m_pListener = NULL;
m_bIsEncoded = bEncoded;
+
// TODO Use persistent document encoding when it exists
- _setEncoding(XAP_EncodingManager::get_instance()->getNativeEncodingName());
+ _setEncoding(szEncodingName);
}
/*!
@@ -255,6 +262,7 @@
strcpy(szEnc,s);
_setEncoding((const char *)szEnc);
+ m_pDocument->setEncodingName(szEnc);
}
pDialogFactory->releaseDialog(pDialog);
Index: src/wp/impexp/xp/ie_imp_Text.cpp
===================================================================
RCS file: /cvsroot/abi/src/wp/impexp/xp/ie_imp_Text.cpp,v
retrieving revision 1.26
diff -u -r1.26 ie_imp_Text.cpp
--- src/wp/impexp/xp/ie_imp_Text.cpp 2001/06/07 15:52:42 1.26
+++ src/wp/impexp/xp/ie_imp_Text.cpp 2001/06/08 23:33:38
@@ -292,8 +292,9 @@
UT_Error error;
- // First we need to determine the encoding.
- X_CleanupIfError(error,_recognizeEncoding(fp));
+ // First we try to determine the encoding.
+ if (_recognizeEncoding(fp) == UT_OK)
+ m_pDocument->setEncodingName(m_szEncoding);
X_CleanupIfError(error,_writeHeader(fp));
X_CleanupIfError(error,_parseFile(fp));
@@ -319,9 +320,16 @@
IE_Imp_Text::IE_Imp_Text(PD_Document * pDocument, bool bEncoded)
: IE_Imp(pDocument)
{
+ UT_ASSERT(pDocument);
+
+ const char *szEncodingName = pDocument->getEncodingName();
+ if (!szEncodingName || !*szEncodingName)
+ szEncodingName =
+XAP_EncodingManager::get_instance()->getNativeEncodingName();
+
m_bIsEncoded = bEncoded;
+
// TODO Use persistent document encoding when it exists
- _setEncoding(XAP_EncodingManager::get_instance()->getNativeEncodingName());
+ _setEncoding(szEncodingName);
}
/*****************************************************************/
@@ -491,6 +499,7 @@
strcpy(szEnc,s);
_setEncoding((const char *)szEnc);
+ m_pDocument->setEncodingName(szEnc);
}
pDialogFactory->releaseDialog(pDialog);