зеркало из https://github.com/mozilla/pjs.git
add new files
This commit is contained in:
Родитель
10664be5d3
Коммит
8b7556346e
|
@ -0,0 +1,31 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsCDETAdaptorCID_h__
|
||||||
|
#define nsCDETAdaptorCID_h__
|
||||||
|
|
||||||
|
#include "nscore.h"
|
||||||
|
|
||||||
|
#define NS_CHARSET_DETECTION_ADAPTOR_PROGID "component://netscape/intl/charsetdetectionadaptor"
|
||||||
|
|
||||||
|
// {12BB8F17-2389-11d3-B3BF-00805F8A6670}
|
||||||
|
#define NS_CHARSET_DETECTION_ADAPTOR_CID \
|
||||||
|
{ 0x12bb8f17, 0x2389, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } }
|
||||||
|
|
||||||
|
|
||||||
|
#endif // nsCDETAdaptorCID_h__
|
|
@ -0,0 +1,55 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
#ifndef nsDetetctionConfident_h__
|
||||||
|
#define nsDetetctionConfident_h__
|
||||||
|
|
||||||
|
/*
|
||||||
|
This type is used to indidcate how confident the detection module about
|
||||||
|
the return result.
|
||||||
|
|
||||||
|
eNoAnswerYet is used to indidcate that the detector have not find out a
|
||||||
|
answer yet based on the data it received.
|
||||||
|
eBestAnswer is used to indidcate that the answer the detector returned
|
||||||
|
is the best one within the knowledge of the detector.
|
||||||
|
In other words, the test to all other candidcates fail.
|
||||||
|
|
||||||
|
For example, the (Shift_JIS/EUC-JP/ISO-2022-JP) detection
|
||||||
|
module may return this with answer "Shift_JIS "if it receive
|
||||||
|
bytes > 0x80 (which make ISO-2022-JP test failed) and byte
|
||||||
|
0x82 (which may EUC-JP test failed)
|
||||||
|
|
||||||
|
eSureAnswer is used to indidcate that the detector are 100% sure about the
|
||||||
|
answer.
|
||||||
|
Exmaple 1; the Shift_JIS/ISO-2022-JP/EUC-JP detector return
|
||||||
|
this w/ ISO-2022-JP when it hit one of the following ESC seq
|
||||||
|
ESC ( J
|
||||||
|
ESC $ @
|
||||||
|
ESC $ B
|
||||||
|
Example 2: the detector which can detect UCS2 return w/ UCS2
|
||||||
|
when the first 2 byte are BOM mark.
|
||||||
|
Example 3: the Korean detector return ISO-2022-KR when it
|
||||||
|
hit ESC $ ) C
|
||||||
|
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
eNoAnswerYet = 0,
|
||||||
|
eBestAnswer,
|
||||||
|
eSureAnswer
|
||||||
|
} nsDetectionConfident;
|
||||||
|
|
||||||
|
#endif /* nsDetetctionConfident_h__ */
|
|
@ -0,0 +1,46 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
#ifndef nsICDETAdaptor_h__
|
||||||
|
#define nsICDETAdaptor_h__
|
||||||
|
#include "nsISupports.h"
|
||||||
|
|
||||||
|
class nsICharsetDetector;
|
||||||
|
class nsIWebShellServices;
|
||||||
|
|
||||||
|
// {12BB8F13-2389-11d3-B3BF-00805F8A6670}
|
||||||
|
#define NS_ICHARSETDETECTIONADAPTOR_IID \
|
||||||
|
{ 0x12bb8f13, 0x2389, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } }
|
||||||
|
|
||||||
|
/*
|
||||||
|
This interface is defined to be serverd as an Adaptor between
|
||||||
|
nsIWebShell, nsICharsetDetector and nsIParserFilter
|
||||||
|
|
||||||
|
It make the nsICharsetDetector implementation independent from the
|
||||||
|
nsIParserFilter and nsIWebShell
|
||||||
|
*/
|
||||||
|
|
||||||
|
class nsICharsetDetectionAdaptor : public nsISupports {
|
||||||
|
public:
|
||||||
|
NS_DEFINE_STATIC_IID_ACCESSOR(NS_ICHARSETDETECTIONADAPTOR_IID)
|
||||||
|
/*
|
||||||
|
Initialize it by setup the nsICharsetDetector and the
|
||||||
|
nsIWebShell
|
||||||
|
*/
|
||||||
|
NS_IMETHOD Init(nsIWebShellServices* aWebShell, nsICharsetDetector *aDetector) = 0;
|
||||||
|
};
|
||||||
|
#endif /* nsICDETAdaptor_h__ */
|
|
@ -0,0 +1,38 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsICDETObserver_h__
|
||||||
|
#define nsICDDETObserver_h__
|
||||||
|
|
||||||
|
#include "nsISupports.h"
|
||||||
|
#include "nsDetectionConfident.h"
|
||||||
|
|
||||||
|
// {12BB8F12-2389-11d3-B3BF-00805F8A6670}
|
||||||
|
#define NS_ICHARSETDETECTIONOBSERVER_IID \
|
||||||
|
{ 0x12bb8f12, 0x2389, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } }
|
||||||
|
|
||||||
|
/*
|
||||||
|
Used to inform answer by nsICharsetDetector
|
||||||
|
*/
|
||||||
|
class nsICharsetDetectionObserver : public nsISupports {
|
||||||
|
public:
|
||||||
|
NS_DEFINE_STATIC_IID_ACCESSOR(NS_ICHARSETDETECTIONOBSERVER_IID)
|
||||||
|
NS_IMETHOD Notify(const char* aCharset, nsDetectionConfident aConf) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* nsICDETObserver_h__ */
|
|
@ -0,0 +1,64 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsICharsetDetector_h__
|
||||||
|
#define nsICharsetDetector_h__
|
||||||
|
|
||||||
|
#include "nsISupports.h"
|
||||||
|
|
||||||
|
class nsICharsetDetectionObserver;
|
||||||
|
|
||||||
|
// {12BB8F14-2389-11d3-B3BF-00805F8A6670}
|
||||||
|
#define NS_ICHARSETDETECTOR_IID \
|
||||||
|
{ 0x12bb8f14, 0x2389, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } }
|
||||||
|
|
||||||
|
#define NS_CHARSET_DETECTOR_PROGID_BASE "component://netscape/intl/charsetdetect?type="
|
||||||
|
|
||||||
|
class nsICharsetDetector : public nsISupports {
|
||||||
|
public:
|
||||||
|
NS_DEFINE_STATIC_IID_ACCESSOR(NS_ICHARSETDETECTOR_IID)
|
||||||
|
|
||||||
|
/*
|
||||||
|
Setup the observer so it know how to notify the answer
|
||||||
|
*/
|
||||||
|
NS_IMETHOD Init(nsICharsetDetectionObserver* observer) = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Return the charset the detector know about
|
||||||
|
*/
|
||||||
|
NS_IMETHOD GetCandidates(PRInt32 aNum, const char* aCharsetArray[]) = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Feed a block of bytes to the detector.
|
||||||
|
It will call the Notify function of the nsICharsetObserver if it find out
|
||||||
|
the answer.
|
||||||
|
aBytesArray - array of bytes
|
||||||
|
aLen - length of aBytesArray
|
||||||
|
oDontFeedMe - return PR_TRUE if the detector do not need the following block
|
||||||
|
PR_FALSE it need more bytes.
|
||||||
|
This is used to enhance performance
|
||||||
|
*/
|
||||||
|
NS_IMETHOD DoIt(const char* aBytesArray, PRUint32 aLen, PRBool* oDontFeedMe) = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
It also tell the detector the last chance the make a decision
|
||||||
|
*/
|
||||||
|
NS_IMETHOD Done() = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
#endif /* nsICharsetDetector_h__ */
|
|
@ -0,0 +1,54 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
#ifndef nsIStringCharsetDetector_h__
|
||||||
|
#define nsIStringCharsetDetector_h__
|
||||||
|
|
||||||
|
#include "nsISupports.h"
|
||||||
|
#include "nsString.h"
|
||||||
|
#include "nsDetectionConfident.h"
|
||||||
|
|
||||||
|
// {12BB8F15-2389-11d3-B3BF-00805F8A6670}
|
||||||
|
#define NS_ISTRINGCHARSETDETECTOR_IID \
|
||||||
|
{ 0x12bb8f15, 0x2389, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } }
|
||||||
|
/*
|
||||||
|
This interface is similar to nsICharsetDetector
|
||||||
|
The difference is it is for line base detection instead of block based
|
||||||
|
detectection.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class nsIStringCharsetDetector : public nsISupports {
|
||||||
|
public:
|
||||||
|
|
||||||
|
NS_DEFINE_STATIC_IID_ACCESSOR(NS_ISTRINGCHARSETDETECTOR_IID)
|
||||||
|
/*
|
||||||
|
Return the Charset the detector know about
|
||||||
|
*/
|
||||||
|
NS_IMETHOD GetCandidates(PRInt32 aNum, const char* aCharsetArray[]) = 0;
|
||||||
|
/*
|
||||||
|
Perform the charset detection
|
||||||
|
|
||||||
|
aBytesArray- the bytes
|
||||||
|
aLen- the length of the bytes
|
||||||
|
oCharset- the charset answer
|
||||||
|
oConfident - the confidence of the answer
|
||||||
|
*/
|
||||||
|
NS_IMETHOD DoIt(const char* aBytesArray, PRUint32 aLen,
|
||||||
|
const char** oCharset, nsDetectionConfident &oConfident) = 0;
|
||||||
|
};
|
||||||
|
#endif /* nsIStringCharsetDetector_h__ */
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsIXMLEncodingService_h__
|
||||||
|
#define nsIXMLEncodingService_h__
|
||||||
|
#include "nsISupports.h"
|
||||||
|
|
||||||
|
|
||||||
|
// {12BB8F11-2389-11d3-B3BF-00805F8A6670}
|
||||||
|
#define NS_IXML_ENCODING_SERVICE_IID \
|
||||||
|
{ 0x12bb8f11, 0x2389, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } }
|
||||||
|
|
||||||
|
|
||||||
|
class nsIXMLEncodingService : public nsISupports {
|
||||||
|
public:
|
||||||
|
NS_DEFINE_STATIC_IID_ACCESSOR( NS_IXML_ENCODING_SERVICE_IID )
|
||||||
|
|
||||||
|
NS_IMETHOD Start() = 0;
|
||||||
|
NS_IMETHOD End() = 0;
|
||||||
|
};
|
||||||
|
#endif // nsIXMLEncodingService_h__
|
|
@ -0,0 +1,31 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef nsXMLEncodingCID_h__
|
||||||
|
#define nsXMLEncodingCID_h__
|
||||||
|
|
||||||
|
#include "nscore.h"
|
||||||
|
|
||||||
|
#define NS_XML_ENCODING_PROGID "component://netscape/intl/xmlencoding"
|
||||||
|
|
||||||
|
// {12BB8F16-2389-11d3-B3BF-00805F8A6670}
|
||||||
|
#define NS_XML_ENCODING_CID \
|
||||||
|
{ 0x12bb8f16, 0x2389, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } }
|
||||||
|
|
||||||
|
|
||||||
|
#endif // nsXMLEncodingCID_h__
|
|
@ -0,0 +1,244 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define IMPL_NS_IPARSERFILTER
|
||||||
|
|
||||||
|
#include "nsICharsetDetectionObserver.h"
|
||||||
|
#include "nsICharsetDetectionAdaptor.h"
|
||||||
|
#include "nsDetectionAdaptor.h"
|
||||||
|
#include "nsICharsetDetector.h"
|
||||||
|
#include "nsIWebShellServices.h"
|
||||||
|
#include "pratom.h"
|
||||||
|
#include "nsCharDetDll.h"
|
||||||
|
#ifdef IMPL_NS_IPARSERFILTER
|
||||||
|
#include "nsIParserFilter.h"
|
||||||
|
static NS_DEFINE_IID(kIParserFilterIID, NS_IPARSERFILTER_IID);
|
||||||
|
|
||||||
|
#endif /* IMPL_NS_IPARSERFILTER */
|
||||||
|
|
||||||
|
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||||
|
|
||||||
|
class CToken;
|
||||||
|
|
||||||
|
class nsDetectionAdaptor : public nsICharsetDetectionObserver,
|
||||||
|
#ifdef IMPL_NS_IPARSERFILTER
|
||||||
|
public nsIParserFilter,
|
||||||
|
#endif /* IMPL_NS_IPARSERFILTER */
|
||||||
|
public nsICharsetDetectionAdaptor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
public:
|
||||||
|
nsDetectionAdaptor( void );
|
||||||
|
virtual ~nsDetectionAdaptor( void );
|
||||||
|
|
||||||
|
|
||||||
|
// Methods to support nsICharsetDetectionObserver
|
||||||
|
NS_IMETHOD Notify(const char* aCharset, nsDetectionConfident aConf);
|
||||||
|
|
||||||
|
// Methods to support nsICharsetDetectionAdaptor
|
||||||
|
NS_IMETHOD Init(nsIWebShellServices* aWebShellSvc, nsICharsetDetector *aDetector);
|
||||||
|
|
||||||
|
// Methode to suppor nsIParserFilter
|
||||||
|
NS_IMETHOD RawBuffer(char * buffer, PRUint32 * buffer_length) ;
|
||||||
|
NS_IMETHOD Finish();
|
||||||
|
|
||||||
|
// really don't care the following two, only because they are defined
|
||||||
|
// in nsIParserFilter.h
|
||||||
|
NS_IMETHOD WillAddToken(CToken & token) { return NS_OK; };
|
||||||
|
NS_IMETHOD ProcessTokens( void ) {return NS_OK;};
|
||||||
|
|
||||||
|
private:
|
||||||
|
nsICharsetDetector* mDetector;
|
||||||
|
nsIWebShellServices* mWebShellSvc;
|
||||||
|
PRBool mDontFeedToDetector;
|
||||||
|
};
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
nsDetectionAdaptor::nsDetectionAdaptor( void )
|
||||||
|
{
|
||||||
|
NS_INIT_REFCNT();
|
||||||
|
PR_AtomicIncrement(& g_InstanceCount);
|
||||||
|
mDetector = nsnull;
|
||||||
|
mWebShellSvc = nsnull;
|
||||||
|
mDontFeedToDetector = PR_TRUE;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
nsDetectionAdaptor::~nsDetectionAdaptor()
|
||||||
|
{
|
||||||
|
NS_IF_RELEASE(mDetector);
|
||||||
|
NS_IF_RELEASE(mWebShellSvc);
|
||||||
|
PR_AtomicDecrement(& g_InstanceCount);
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
NS_IMPL_ADDREF ( nsDetectionAdaptor );
|
||||||
|
NS_IMPL_RELEASE ( nsDetectionAdaptor );
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsDetectionAdaptor::QueryInterface(REFNSIID aIID, void**aInstancePtr)
|
||||||
|
{
|
||||||
|
|
||||||
|
if( NULL == aInstancePtr) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
*aInstancePtr = NULL;
|
||||||
|
|
||||||
|
if( aIID.Equals ( nsICharsetDetectionObserver::GetIID() )) {
|
||||||
|
*aInstancePtr = (void*) ((nsICharsetDetectionObserver*) this);
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if( aIID.Equals ( nsICharsetDetectionAdaptor::GetIID() )) {
|
||||||
|
*aInstancePtr = (void*) ((nsICharsetDetectionAdaptor*) this);
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
#ifdef IMPL_NS_IPARSERFILTER
|
||||||
|
if( aIID.Equals ( kIParserFilterIID)) {
|
||||||
|
*aInstancePtr = (void*) ((nsIParserFilter*) this);
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
#endif /* IMPL_NS_IPARSERFILTER */
|
||||||
|
|
||||||
|
if( aIID.Equals ( kISupportsIID )) {
|
||||||
|
*aInstancePtr = (void*) ( this );
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsDetectionAdaptor::Notify(
|
||||||
|
const char* aCharset, nsDetectionConfident aConf)
|
||||||
|
{
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
rv = mWebShellSvc->ReloadDocument( aCharset, kCharsetFromAutoDetection);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsDetectionAdaptor::Init(
|
||||||
|
nsIWebShellServices* aWebShellSvc, nsICharsetDetector *aDetector)
|
||||||
|
{
|
||||||
|
if((nsnull != aWebShellSvc) && (nsnull != aDetector))
|
||||||
|
{
|
||||||
|
nsICharsetDetectionObserver* aObserver = nsnull;
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
rv = this->QueryInterface(nsICharsetDetectionObserver::GetIID(),
|
||||||
|
(void**) &aObserver);
|
||||||
|
|
||||||
|
if(NS_SUCCEEDED(rv)) {
|
||||||
|
aDetector->Init(aObserver);
|
||||||
|
|
||||||
|
NS_ADDREF(aWebShellSvc);
|
||||||
|
mWebShellSvc = aWebShellSvc;
|
||||||
|
|
||||||
|
NS_ADDREF(aDetector);
|
||||||
|
mDetector = aDetector;
|
||||||
|
|
||||||
|
mDontFeedToDetector = PR_FALSE;
|
||||||
|
NS_IF_RELEASE(aObserver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NS_ERROR_ILLEGAL_VALUE;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsDetectionAdaptor::RawBuffer
|
||||||
|
(char * buffer, PRUint32 * buffer_length)
|
||||||
|
{
|
||||||
|
if((mDontFeedToDetector) || (nsnull == mWebShellSvc) || (nsnull == mDetector))
|
||||||
|
return NS_OK;
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
rv = mDetector->DoIt((const char*)buffer, *buffer_length, &mDontFeedToDetector);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsDetectionAdaptor::Finish()
|
||||||
|
{
|
||||||
|
if((mDontFeedToDetector) || (nsnull == mWebShellSvc) || (nsnull == mDetector))
|
||||||
|
return NS_OK;
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
rv = mDetector->Done();
|
||||||
|
|
||||||
|
NS_IF_RELEASE(mWebShellSvc);
|
||||||
|
NS_IF_RELEASE(mDetector); // need this line so no cycle reference
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
class nsDetectionAdaptorFactory : public nsIFactory {
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
public:
|
||||||
|
nsDetectionAdaptorFactory() {
|
||||||
|
NS_INIT_REFCNT();
|
||||||
|
PR_AtomicIncrement(&g_InstanceCount);
|
||||||
|
}
|
||||||
|
virtual ~nsDetectionAdaptorFactory() {
|
||||||
|
PR_AtomicDecrement(&g_InstanceCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHOD CreateInstance(nsISupports* aDelegate, const nsIID& aIID, void** aResult);
|
||||||
|
NS_IMETHOD LockFactory(PRBool aLock);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
NS_DEFINE_IID( kIFactoryIID, NS_IFACTORY_IID);
|
||||||
|
NS_IMPL_ISUPPORTS( nsDetectionAdaptorFactory , kIFactoryIID);
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsDetectionAdaptorFactory::CreateInstance(
|
||||||
|
nsISupports* aDelegate, const nsIID &aIID, void** aResult)
|
||||||
|
{
|
||||||
|
if(NULL == aResult)
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
if(NULL != aDelegate)
|
||||||
|
return NS_ERROR_NO_AGGREGATION;
|
||||||
|
|
||||||
|
*aResult = NULL;
|
||||||
|
|
||||||
|
nsDetectionAdaptor *inst = new nsDetectionAdaptor();
|
||||||
|
|
||||||
|
|
||||||
|
if(NULL == inst) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
nsresult res =inst->QueryInterface(aIID, aResult);
|
||||||
|
if(NS_FAILED(res)) {
|
||||||
|
delete inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsDetectionAdaptorFactory::LockFactory(PRBool aLock)
|
||||||
|
{
|
||||||
|
if(aLock)
|
||||||
|
PR_AtomicIncrement( &g_LockCount );
|
||||||
|
else
|
||||||
|
PR_AtomicDecrement( &g_LockCount );
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==============================================================
|
||||||
|
nsIFactory* NEW_DETECTION_ADAPTOR_FACTORY()
|
||||||
|
{
|
||||||
|
return new nsDetectionAdaptorFactory();
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
#ifndef nsDetectionAdaptor_h__
|
||||||
|
#define nsDetectionAdaptor_h__
|
||||||
|
|
||||||
|
#include "nsIFactory.h"
|
||||||
|
|
||||||
|
|
||||||
|
nsIFactory* NEW_DETECTION_ADAPTOR_FACTORY();
|
||||||
|
|
||||||
|
#endif /* nsDetectionAdaptor_h__ */
|
|
@ -0,0 +1,77 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//#define DONT_INFORM_WEBSHELL
|
||||||
|
|
||||||
|
#include "nsIServiceManager.h"
|
||||||
|
#include "nsIDocumentLoader.h"
|
||||||
|
#include "nsIWebShellServices.h"
|
||||||
|
#include "nsIContentViewerContainer.h"
|
||||||
|
#include "nsObserverBase.h"
|
||||||
|
|
||||||
|
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||||
|
|
||||||
|
static NS_DEFINE_IID(kDocLoaderServiceCID, NS_DOCUMENTLOADER_SERVICE_CID);
|
||||||
|
static NS_DEFINE_IID(kIDocumentLoaderIID, NS_IDOCUMENTLOADER_IID);
|
||||||
|
static NS_DEFINE_IID(kIWebShellServicesIID, NS_IWEB_SHELL_SERVICES_IID);
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsObserverBase::NotifyWebShell(
|
||||||
|
PRUint32 aDocumentID, const char* charset, nsCharsetSource source)
|
||||||
|
{
|
||||||
|
nsresult res = NS_OK;
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
// shoudl docLoader a memeber to increase performance ???
|
||||||
|
nsIDocumentLoader * docLoader = nsnull;
|
||||||
|
nsIContentViewerContainer * cvc = nsnull;
|
||||||
|
nsIWebShellServices* wss = nsnull;
|
||||||
|
|
||||||
|
if(NS_FAILED(rv =nsServiceManager::GetService(kDocLoaderServiceCID,
|
||||||
|
kIDocumentLoaderIID,
|
||||||
|
(nsISupports**)&docLoader)))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
if(NS_FAILED(rv =docLoader->GetContentViewerContainer(aDocumentID, &cvc)))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
if(NS_FAILED( rv = cvc->QueryInterface(kIWebShellServicesIID, (void**)&wss)))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
#ifndef DONT_INFORM_WEBSHELL
|
||||||
|
// ask the webshellservice to load the URL
|
||||||
|
if(NS_FAILED( rv = wss->SetRendering(PR_FALSE) ))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
// XXX nisheeth, uncomment the following two line to see the reent problem
|
||||||
|
|
||||||
|
// if(NS_FAILED(rv = wss->StopDocumentLoad()))
|
||||||
|
// goto done;
|
||||||
|
|
||||||
|
if(NS_FAILED(rv = wss->ReloadDocument(charset, source)))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
res = NS_ERROR_HTMLPARSER_STOPPARSING;
|
||||||
|
#endif
|
||||||
|
done:
|
||||||
|
if(docLoader) {
|
||||||
|
nsServiceManager::ReleaseService(kDocLoaderServiceCID,docLoader);
|
||||||
|
}
|
||||||
|
NS_IF_RELEASE(cvc);
|
||||||
|
NS_IF_RELEASE(wss);
|
||||||
|
return res;
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef nsObserverBase_h__
|
||||||
|
#define nsObserverBase_h__
|
||||||
|
|
||||||
|
|
||||||
|
#include "nsIParser.h"
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// Class declaration for the class
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
class nsObserverBase {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
nsObserverBase() {};
|
||||||
|
virtual ~nsObserverBase() {};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Subject call observer when the parser hit the tag
|
||||||
|
* @param aDocumentID- ID of the document
|
||||||
|
* @param aTag- the tag
|
||||||
|
* @param valueArray - array of value
|
||||||
|
*/
|
||||||
|
protected:
|
||||||
|
|
||||||
|
NS_IMETHOD NotifyWebShell(PRUint32 aDocumentID, const char* charset, nsCharsetSource source);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* nsObserverBase_h__ */
|
|
@ -0,0 +1,362 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
#include "nsICharsetAlias.h"
|
||||||
|
#include "nsXMLEncodingObserver.h"
|
||||||
|
#include "nsIXMLEncodingService.h"
|
||||||
|
#include "nsIElementObserver.h"
|
||||||
|
#include "nsIObserver.h"
|
||||||
|
#include "nsIObserverService.h"
|
||||||
|
#include "nsISupports.h"
|
||||||
|
#include "nsCRT.h"
|
||||||
|
#include "nsIParser.h"
|
||||||
|
#include "pratom.h"
|
||||||
|
#include "nsCharDetDll.h"
|
||||||
|
#include "nsIServiceManager.h"
|
||||||
|
#include "nsObserverBase.h"
|
||||||
|
|
||||||
|
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
// Class declaration for the class
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
class nsXMLEncodingObserver: public nsIElementObserver,
|
||||||
|
public nsIObserver,
|
||||||
|
public nsObserverBase,
|
||||||
|
public nsIXMLEncodingService {
|
||||||
|
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
nsXMLEncodingObserver();
|
||||||
|
virtual ~nsXMLEncodingObserver();
|
||||||
|
|
||||||
|
/* methode for nsIElementObserver */
|
||||||
|
/*
|
||||||
|
* This method return the tag which the observer care about
|
||||||
|
*/
|
||||||
|
NS_IMETHOD_(const char*)GetTagNameAt(PRUint32 aTagIndex);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Subject call observer when the parser hit the tag
|
||||||
|
* @param aDocumentID- ID of the document
|
||||||
|
* @param aTag- the tag
|
||||||
|
* @param numOfAttributes - number of attributes
|
||||||
|
* @param nameArray - array of name.
|
||||||
|
* @param valueArray - array of value
|
||||||
|
*/
|
||||||
|
NS_IMETHOD Notify(PRUint32 aDocumentID, eHTMLTags aTag, PRUint32 numOfAttributes,
|
||||||
|
const PRUnichar* nameArray[], const PRUnichar* valueArray[]);
|
||||||
|
NS_IMETHOD Notify(PRUint32 aDocumentID, const PRUnichar* aTag, PRUint32 numOfAttributes,
|
||||||
|
const PRUnichar* nameArray[], const PRUnichar* valueArray[]);
|
||||||
|
|
||||||
|
/* methode for nsIObserver */
|
||||||
|
NS_DECL_IOBSERVER
|
||||||
|
|
||||||
|
/* methode for nsIXMLEncodingService */
|
||||||
|
NS_IMETHOD Start();
|
||||||
|
NS_IMETHOD End();
|
||||||
|
private:
|
||||||
|
|
||||||
|
NS_IMETHOD Notify(PRUint32 aDocumentID, PRUint32 numOfAttributes,
|
||||||
|
const PRUnichar* nameArray[], const PRUnichar* valueArray[]);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
nsXMLEncodingObserver::nsXMLEncodingObserver()
|
||||||
|
{
|
||||||
|
NS_INIT_REFCNT();
|
||||||
|
PR_AtomicIncrement(& g_InstanceCount);
|
||||||
|
}
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
nsXMLEncodingObserver::~nsXMLEncodingObserver()
|
||||||
|
{
|
||||||
|
PR_AtomicDecrement(& g_InstanceCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
NS_IMPL_ADDREF ( nsXMLEncodingObserver );
|
||||||
|
NS_IMPL_RELEASE ( nsXMLEncodingObserver );
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsXMLEncodingObserver::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||||
|
{
|
||||||
|
|
||||||
|
if( NULL == aInstancePtr) {
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
}
|
||||||
|
*aInstancePtr = NULL;
|
||||||
|
|
||||||
|
if( aIID.Equals ( nsIElementObserver::GetIID() )) {
|
||||||
|
*aInstancePtr = (void*) ((nsIElementObserver*) this);
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
if( aIID.Equals ( nsIObserver::GetIID() )) {
|
||||||
|
*aInstancePtr = (void*) ((nsIObserver*) this);
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( aIID.Equals ( nsIXMLEncodingService::GetIID() )) {
|
||||||
|
*aInstancePtr = (void*) ((nsIXMLEncodingService*) this);
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( aIID.Equals ( kISupportsIID )) {
|
||||||
|
*aInstancePtr = (void*) ( this );
|
||||||
|
NS_ADDREF_THIS();
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
return NS_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP_(const char*) nsXMLEncodingObserver::GetTagNameAt(PRUint32 aTagIndex)
|
||||||
|
{
|
||||||
|
if (aTagIndex == 0) {
|
||||||
|
return "?XML";
|
||||||
|
}else {
|
||||||
|
return nsnull;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsXMLEncodingObserver::Notify(
|
||||||
|
PRUint32 aDocumentID,
|
||||||
|
const PRUnichar* aTag,
|
||||||
|
PRUint32 numOfAttributes,
|
||||||
|
const PRUnichar* nameArray[],
|
||||||
|
const PRUnichar* valueArray[])
|
||||||
|
{
|
||||||
|
if(0 != nsCRT::strcasecmp(aTag, "?XML"))
|
||||||
|
return NS_ERROR_ILLEGAL_VALUE;
|
||||||
|
else
|
||||||
|
return Notify(aDocumentID, numOfAttributes, nameArray, valueArray);
|
||||||
|
}
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsXMLEncodingObserver::Notify(
|
||||||
|
PRUint32 aDocumentID,
|
||||||
|
eHTMLTags aTag,
|
||||||
|
PRUint32 numOfAttributes,
|
||||||
|
const PRUnichar* nameArray[],
|
||||||
|
const PRUnichar* valueArray[])
|
||||||
|
{
|
||||||
|
if(eHTMLTag_meta != aTag)
|
||||||
|
return NS_ERROR_ILLEGAL_VALUE;
|
||||||
|
else
|
||||||
|
return Notify(aDocumentID, numOfAttributes, nameArray, valueArray);
|
||||||
|
}
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsXMLEncodingObserver::Notify(
|
||||||
|
PRUint32 aDocumentID,
|
||||||
|
PRUint32 numOfAttributes,
|
||||||
|
const PRUnichar* nameArray[],
|
||||||
|
const PRUnichar* valueArray[])
|
||||||
|
{
|
||||||
|
|
||||||
|
nsresult res = NS_OK;
|
||||||
|
PRUint32 i;
|
||||||
|
|
||||||
|
if(numOfAttributes >= 3)
|
||||||
|
{
|
||||||
|
PRBool bGotCurrentCharset=PR_FALSE;
|
||||||
|
PRBool bGotCurrentCharsetSource = PR_FALSE;
|
||||||
|
PRBool bGotEncoding = PR_FALSE;
|
||||||
|
|
||||||
|
nsAutoString currentCharset("unknown");
|
||||||
|
nsAutoString charsetSourceStr("unknown");
|
||||||
|
nsAutoString encoding("unknown");
|
||||||
|
|
||||||
|
for(i=0; i < numOfAttributes; i++)
|
||||||
|
{
|
||||||
|
if(0==nsCRT::strcmp(nameArray[i], "charset"))
|
||||||
|
{
|
||||||
|
bGotCurrentCharset = PR_TRUE;
|
||||||
|
currentCharset = valueArray[i];
|
||||||
|
} else if(0==nsCRT::strcmp(nameArray[i], "charsetSource")) {
|
||||||
|
bGotCurrentCharsetSource = PR_TRUE;
|
||||||
|
charsetSourceStr = valueArray[i];
|
||||||
|
} else if(0==nsCRT::strcasecmp(nameArray[i], "encoding")) {
|
||||||
|
bGotEncoding = PR_TRUE;
|
||||||
|
encoding = valueArray[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we cannot find currentCharset or currentCharsetSource
|
||||||
|
// return error.
|
||||||
|
if( ! (bGotCurrentCharset && bGotCurrentCharsetSource))
|
||||||
|
{
|
||||||
|
return NS_ERROR_ILLEGAL_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRInt32 err;
|
||||||
|
PRInt32 charsetSourceInt = charsetSourceStr.ToInteger(&err);
|
||||||
|
|
||||||
|
// if we cannot convert the string into nsCharsetSource, return error
|
||||||
|
if(NS_FAILED(err))
|
||||||
|
return NS_ERROR_ILLEGAL_VALUE;
|
||||||
|
|
||||||
|
nsCharsetSource currentCharsetSource = (nsCharsetSource)charsetSourceInt;
|
||||||
|
|
||||||
|
if(kCharsetFromMetaTag > currentCharsetSource)
|
||||||
|
{
|
||||||
|
if(! encoding.Equals(currentCharset))
|
||||||
|
{
|
||||||
|
nsICharsetAlias* calias = nsnull;
|
||||||
|
res = nsServiceManager::GetService(
|
||||||
|
kCharsetAliasCID,
|
||||||
|
nsICharsetAlias::GetIID(),
|
||||||
|
(nsISupports**) &calias);
|
||||||
|
if(NS_SUCCEEDED(res) && (nsnull != calias) )
|
||||||
|
{
|
||||||
|
PRBool same = PR_FALSE;
|
||||||
|
res = calias->Equals( encoding, currentCharset, &same);
|
||||||
|
if(NS_SUCCEEDED(res) && (! same))
|
||||||
|
{
|
||||||
|
nsAutoString preferred;
|
||||||
|
res = calias->GetPreferred(encoding, preferred);
|
||||||
|
if(NS_SUCCEEDED(res))
|
||||||
|
{
|
||||||
|
const char* charsetInCStr = preferred.ToNewCString();
|
||||||
|
if(nsnull != charsetInCStr) {
|
||||||
|
res = NotifyWebShell(aDocumentID, charsetInCStr, kCharsetFromMetaTag );
|
||||||
|
delete [] (char*)charsetInCStr;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
} // if check for GetPreferred
|
||||||
|
} // if check res for Equals
|
||||||
|
nsServiceManager::ReleaseService(kCharsetAliasCID, calias);
|
||||||
|
} // if check res for GetService
|
||||||
|
} // if Equals
|
||||||
|
} // if
|
||||||
|
} // if
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsXMLEncodingObserver::Observe(nsISupports*, const PRUnichar*, const PRUnichar*)
|
||||||
|
{
|
||||||
|
return NS_ERROR_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsXMLEncodingObserver::Start()
|
||||||
|
{
|
||||||
|
nsresult res = NS_OK;
|
||||||
|
nsAutoString xmlTopic("xmlparser");
|
||||||
|
nsIObserverService* anObserverService = nsnull;
|
||||||
|
|
||||||
|
res = nsServiceManager::GetService(NS_OBSERVERSERVICE_PROGID,
|
||||||
|
nsIObserverService::GetIID(),
|
||||||
|
(nsISupports**) &anObserverService);
|
||||||
|
if(NS_FAILED(res))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
res = anObserverService->AddObserver(this, xmlTopic.GetUnicode());
|
||||||
|
|
||||||
|
nsServiceManager::ReleaseService(NS_OBSERVERSERVICE_PROGID,
|
||||||
|
anObserverService);
|
||||||
|
done:
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsXMLEncodingObserver::End()
|
||||||
|
{
|
||||||
|
nsresult res = NS_OK;
|
||||||
|
nsAutoString xmlTopic("xmlparser");
|
||||||
|
nsIObserverService* anObserverService = nsnull;
|
||||||
|
|
||||||
|
res = nsServiceManager::GetService(NS_OBSERVERSERVICE_PROGID,
|
||||||
|
nsIObserverService::GetIID(),
|
||||||
|
(nsISupports**) &anObserverService);
|
||||||
|
if(NS_FAILED(res))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
res = anObserverService->RemoveObserver(this, xmlTopic.GetUnicode());
|
||||||
|
|
||||||
|
nsServiceManager::ReleaseService(NS_OBSERVERSERVICE_PROGID,
|
||||||
|
anObserverService);
|
||||||
|
done:
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
class nsXMLEncodingObserverFactory : public nsIFactory {
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
|
public:
|
||||||
|
nsXMLEncodingObserverFactory() {
|
||||||
|
NS_INIT_REFCNT();
|
||||||
|
PR_AtomicIncrement(&g_InstanceCount);
|
||||||
|
}
|
||||||
|
virtual ~nsXMLEncodingObserverFactory() {
|
||||||
|
PR_AtomicDecrement(&g_InstanceCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHOD CreateInstance(nsISupports* aDelegate, const nsIID& aIID, void** aResult);
|
||||||
|
NS_IMETHOD LockFactory(PRBool aLock);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
NS_DEFINE_IID( kIFactoryIID, NS_IFACTORY_IID);
|
||||||
|
NS_IMPL_ISUPPORTS( nsXMLEncodingObserverFactory , kIFactoryIID);
|
||||||
|
|
||||||
|
NS_IMETHODIMP nsXMLEncodingObserverFactory::CreateInstance(
|
||||||
|
nsISupports* aDelegate, const nsIID &aIID, void** aResult)
|
||||||
|
{
|
||||||
|
if(NULL == aResult)
|
||||||
|
return NS_ERROR_NULL_POINTER;
|
||||||
|
if(NULL != aDelegate)
|
||||||
|
return NS_ERROR_NO_AGGREGATION;
|
||||||
|
|
||||||
|
*aResult = NULL;
|
||||||
|
|
||||||
|
nsXMLEncodingObserver *inst = new nsXMLEncodingObserver();
|
||||||
|
|
||||||
|
|
||||||
|
if(NULL == inst) {
|
||||||
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
nsresult res =inst->QueryInterface(aIID, aResult);
|
||||||
|
if(NS_FAILED(res)) {
|
||||||
|
delete inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
NS_IMETHODIMP nsXMLEncodingObserverFactory::LockFactory(PRBool aLock)
|
||||||
|
{
|
||||||
|
if(aLock)
|
||||||
|
PR_AtomicIncrement( &g_LockCount );
|
||||||
|
else
|
||||||
|
PR_AtomicDecrement( &g_LockCount );
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==============================================================
|
||||||
|
nsIFactory* NEW_XML_ENCODING_OBSERVER_FACTORY()
|
||||||
|
{
|
||||||
|
return new nsXMLEncodingObserverFactory();
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Netscape Public License
|
||||||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||||
|
* http://www.mozilla.org/NPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* NPL.
|
||||||
|
*
|
||||||
|
* The Initial Developer of this code under the NPL is Netscape
|
||||||
|
* Communications Corporation. Portions created by Netscape are
|
||||||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||||
|
* Reserved.
|
||||||
|
*/
|
||||||
|
#ifndef nsXMLEncodingObserverFactory_h__
|
||||||
|
#define nsXMLEncodingObserverFactory_h__
|
||||||
|
|
||||||
|
#include "nsIFactory.h"
|
||||||
|
nsIFactory* NEW_XML_ENCODING_OBSERVER_FACTORY();
|
||||||
|
|
||||||
|
#endif // nsXMLEncodingObserverFactory_h__
|
Загрузка…
Ссылка в новой задаче