зеркало из https://github.com/mozilla/pjs.git
Adding the ical directory to mozilla/calendar/modules/parser.
This is the first batch of files I need to add to get the iCal parser going. This shouldn't be built with trex.mak yet. It won't build until I get things stable enough.
This commit is contained in:
Родитель
14a7388228
Коммит
c8f88eb42b
|
@ -0,0 +1,78 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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 NS_CALICALENDARCONTENTSINK
|
||||
#define NS_CALICALENDARCONTENTSINK
|
||||
|
||||
#include "nsIParserNode.h"
|
||||
#include "nsIContentSink.h"
|
||||
#include "nsString.h"
|
||||
#include "nsxpfcCIID.h"
|
||||
#include "nsIVector.h"
|
||||
#include "nsIIterator.h"
|
||||
#include "nsIStack.h"
|
||||
#include "nsCalICalendarDTD.h"
|
||||
#include "nsICalICalendarParserObject.h"
|
||||
#include "nsICalICalendarContentSink.h"
|
||||
//#include "nsCalICalendarParserCIID.h"
|
||||
|
||||
class nsCalICalendarContentSink : public nsICalICalendarContentSink,
|
||||
public nsIContentSink
|
||||
{
|
||||
public:
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
nsCalICalendarContentSink();
|
||||
virtual ~nsCalICalendarContentSink();
|
||||
|
||||
//nsICalICalendarContentSink
|
||||
NS_IMETHOD Init();
|
||||
NS_IMETHOD SetViewerContainer(nsIWebViewerContainer * aViewerContainer);
|
||||
|
||||
//nsIContentSink
|
||||
NS_IMETHOD OpenContainer(const nsIParserNode& aNode);
|
||||
NS_IMETHOD CloseContainer(const nsIParserNode& aNode);
|
||||
NS_IMETHOD AddLeaf(const nsIParserNode& aNode);
|
||||
NS_IMETHOD WillBuildModel(void);
|
||||
NS_IMETHOD DidBuildModel(PRInt32 aQualityLevel);
|
||||
NS_IMETHOD WillInterrupt(void);
|
||||
NS_IMETHOD WillResume(void);
|
||||
|
||||
private:
|
||||
NS_IMETHOD CIDFromTag(eCalICalendarTags tag, nsCID &aClass);
|
||||
NS_IMETHOD ConsumeAttributes(const nsIParserNode& aNode, nsICalICalendarParserObject& aObject);
|
||||
NS_IMETHOD AddToHierarchy(nsICalICalendarParserObject& aObject, PRBool aPush);
|
||||
|
||||
public:
|
||||
NS_IMETHOD_(PRBool) IsContainer(const nsIParserNode& aNode);
|
||||
|
||||
|
||||
private:
|
||||
nsIWebViewerContainer * mViewerContainer ;
|
||||
nsIStack * mXPFCStack;
|
||||
nsIVector * mOrphanMenuList;
|
||||
nsIVector * mContainerList ;
|
||||
PRUint32 mState;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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 NS_CALICALENDARDTD__
|
||||
#define NS_CALICALENDARDTD__
|
||||
|
||||
#include "nscalexport.h"
|
||||
#include "CNavDTD.h"
|
||||
#include "nscalstrings.h"
|
||||
#include "nsxpfc.h"
|
||||
#include "nsIDTD.h"
|
||||
#include "nsISupports.h"
|
||||
#include "nsIParser.h"
|
||||
#include "nsCalICalendarTags.h"
|
||||
#include "nsCalICalendarTokens.h"
|
||||
#include "nscalicalendarpars.h"
|
||||
#include "nsVoidArray.h"
|
||||
#include "nsDeque.h"
|
||||
//#include "nsCalICalendarParserCIID.h"
|
||||
//#include "nsCalICalendarStrings.h" // todo:
|
||||
|
||||
class nsIHTMLContentSink;
|
||||
class nsIDTDDebug;
|
||||
class nsIParserNode;
|
||||
class nsCParserNode;
|
||||
class CITokenHandler;
|
||||
class nsParser;
|
||||
class nsDTDContext;
|
||||
class nsTagStack;
|
||||
class CScanner;
|
||||
/*
|
||||
enum eCalICalendarComponents
|
||||
{
|
||||
eCalICalendarComponents_vcalendar = 0,
|
||||
eCalICalendarComponents_vevent,
|
||||
eCalICalendarComponents_vtodo,
|
||||
eCalICalendarComponents_vjournal,
|
||||
eCalICalendarComponents_vfreebusy,
|
||||
eCalICalendarComponents_valarm,
|
||||
eCalICalendarComponents_vtimezone
|
||||
};
|
||||
|
||||
enum eCalICalendarProperties
|
||||
{
|
||||
eCalICalendarProperties_attach = 0,
|
||||
// todo: finish
|
||||
};
|
||||
*/
|
||||
|
||||
class nsCalICalendarDTD : public nsIDTD {
|
||||
|
||||
public:
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
nsCalICalendarDTD();
|
||||
virtual ~nsCalICalendarDTD();
|
||||
|
||||
//nsIDID
|
||||
virtual PRBool CanParse(nsString& aContentType, PRInt32 aVersion);
|
||||
virtual eAutoDetectResult AutoDetectContentType(nsString& aBuffer,nsString& aType);
|
||||
NS_IMETHOD HandleToken(CToken* aToken);
|
||||
virtual nsresult CreateNewInstance(nsIDTD** aInstancePtrResult);
|
||||
|
||||
nsresult HandleBeginToken(CToken* aToken);
|
||||
nsresult HandleEndToken(CToken* aToken);
|
||||
nsresult HandleAttributeToken(CToken* aToken);
|
||||
nsresult HandlePropertyValueToken(CToken* aToken);
|
||||
|
||||
|
||||
//more nsIDID
|
||||
virtual void SetParser(nsIParser* aParser);
|
||||
virtual nsIContentSink* SetContentSink(nsIContentSink* aSink);
|
||||
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink);
|
||||
NS_IMETHOD DidBuildModel(PRInt32 anErrorCode,PRBool aNotifySink);
|
||||
NS_IMETHOD ConsumeToken(CToken*& aToken);
|
||||
NS_IMETHOD WillResumeParse(void);
|
||||
NS_IMETHOD WillInterruptParse(void);
|
||||
virtual PRBool CanContain(PRInt32 aParent,PRInt32 aChild) const;
|
||||
virtual PRBool IsContainer(PRInt32 aTag) const;
|
||||
virtual PRBool Verify(nsString& aURLRef);
|
||||
virtual nsITokenRecycler* GetTokenRecycler(void);
|
||||
|
||||
/*nsresult ConsumeBeginTag(PRUnichar aChar,CScanner& aScanner,CToken*& aToken);
|
||||
nsresult ConsumeEndTag(PRUnichar aChar,CScanner& aScanner,CToken*& aToken);
|
||||
*/
|
||||
nsresult ConsumeNewline(PRUnichar aChar,CScanner& aScanner,CToken*& aToken);
|
||||
nsresult ConsumeWhitespace(PRUnichar aChar,CScanner& aScanner,CToken*& aToken);
|
||||
nsresult ConsumePropertyLine(PRUnichar aChar,CScanner& aScanner,CToken*& aToken);
|
||||
nsresult ConsumePropertyNameAndAttributes(PRUnichar aChar,CScanner& aScanner,CToken*& aToken);
|
||||
nsresult ConsumePropertyValue(PRUnichar aChar,CScanner& aScanner,CToken*& aToken);
|
||||
|
||||
nsresult ConsumeAttributes(PRUnichar aChar, CScanner& aScanner,
|
||||
CCalICalendarBeginToken* aToken);
|
||||
private:
|
||||
//NS_IMETHOD_(eCalICalendarTags) ComponentTypeFromObject(const nsIParserNode& aNode);
|
||||
|
||||
protected:
|
||||
PRInt32 CollectPropertyValue(nsCParserNode& aNode, PRInt32 aCount);
|
||||
PRInt32 CollectAttributes(nsCParserNode& aNode, PRInt32 aCount);
|
||||
|
||||
nsParser* mParser;
|
||||
nsIContentSink* mSink;
|
||||
//CITokenHandler* mTokenHandlers[eToken_last];
|
||||
//nsDTDContext* mContext;
|
||||
nsDeque mTokenDeque;
|
||||
nsString mFilename;
|
||||
nsIDTDDebug* mDTDDebug;
|
||||
PRInt32 mLineNumber;
|
||||
eParseMode mParseMode;
|
||||
};
|
||||
|
||||
extern NS_CALICALENDARPARS nsresult NS_NewICAL_DTD(nsIDTD** aInstancePtrResult);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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 nsCalParserCIID_h__
|
||||
#define nsCalParserCIID_h__
|
||||
|
||||
#include "nsISupports.h"
|
||||
#include "nsIFactory.h"
|
||||
#include "nsRepository.h"
|
||||
|
||||
// 4d17a720-5a4d-11d2-9432-006008268c31
|
||||
/*
|
||||
#define NS_ICALICALENDAR_DTD_IID \
|
||||
{ 0x4d17a720, 0x5a4d, 0x11d2, \
|
||||
{0x94, 0x32, 0x00, 0x60, 0x08, 0x26, 0x8c, 0x31} }
|
||||
|
||||
// 7b944f60-5a4d-11d2-9432-006008268c31
|
||||
#define NS_CALICALENDARCONTENTSINK_IID \
|
||||
{ 0x7b944f60, 0x5a4d, 0x11d2, \
|
||||
{0x94, 0x32, 0x00, 0x60, 0x08, 0x26, 0x8c, 0x31} }
|
||||
*/
|
||||
//6758a720-6522-11d2-943c-006008268c31
|
||||
#define NS_CALICALENDARPARSER_NODE_IID \
|
||||
{ 0x6758a720, 0x6522, 0x11d2 \
|
||||
{0x94, 0x3c, 0x00, 0x60, 0x08, 0x26, 0x8c, 0x31} }
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,165 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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 NS_CALICALENDARPARSERNODE__
|
||||
#define NS_CALICALENDARPARSERNODE__
|
||||
|
||||
#include "nsIParserNode.h"
|
||||
#include "nsCalICalendarTokens.h"
|
||||
#include "nsString.h"
|
||||
#include "nsParserCIID.h"
|
||||
#include "nsCalParserCIID.h"
|
||||
|
||||
|
||||
class nsCalICalendarCParserNode : public nsIParserNode {
|
||||
enum {eMaxAttr=20};
|
||||
|
||||
public:
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
* @update gess5/11/98
|
||||
* @param aToken is the token this node "refers" to
|
||||
*/
|
||||
nsCalICalendarCParserNode(CCalICalendarToken* aToken=nsnull,PRInt32 aLineNumber=1);
|
||||
|
||||
/**
|
||||
* Destructor
|
||||
* @update gess5/11/98
|
||||
*/
|
||||
virtual ~nsCalICalendarCParserNode();
|
||||
|
||||
/**
|
||||
* Init
|
||||
* @update gess5/11/98
|
||||
*/
|
||||
virtual nsresult Init(CCalICalendarToken* aToken=nsnull,PRInt32 aLineNumber=1);
|
||||
|
||||
/**
|
||||
* Retrieve the name of the node
|
||||
* @update gess5/11/98
|
||||
* @return string containing node name
|
||||
*/
|
||||
virtual const nsString& GetName() const;
|
||||
|
||||
/**
|
||||
* Retrieve the text from the given node
|
||||
* @update gess5/11/98
|
||||
* @return string containing node text
|
||||
*/
|
||||
virtual const nsString& GetText() const;
|
||||
|
||||
/**
|
||||
* Retrieve skipped context from node
|
||||
* @update gess5/11/98
|
||||
* @return string containing skipped content
|
||||
*/
|
||||
virtual const nsString& GetSkippedContent() const;
|
||||
|
||||
/**
|
||||
* Retrieve the type of the parser node.
|
||||
* @update gess5/11/98
|
||||
* @return node type.
|
||||
*/
|
||||
virtual PRInt32 GetNodeType() const;
|
||||
|
||||
/**
|
||||
* Retrieve token type of parser node
|
||||
* @update gess5/11/98
|
||||
* @return token type
|
||||
*/
|
||||
virtual PRInt32 GetTokenType() const;
|
||||
|
||||
//***************************************
|
||||
//methods for accessing key/value pairs
|
||||
//***************************************
|
||||
|
||||
/**
|
||||
* Retrieve the number of attributes in this node.
|
||||
* @update gess5/11/98
|
||||
* @return count of attributes (may be 0)
|
||||
*/
|
||||
virtual PRInt32 GetAttributeCount(PRBool askToken=PR_FALSE) const;
|
||||
|
||||
/**
|
||||
* Retrieve the key (of key/value pair) at given index
|
||||
* @update gess5/11/98
|
||||
* @param anIndex is the index of the key you want
|
||||
* @return string containing key.
|
||||
*/
|
||||
virtual const nsString& GetKeyAt(PRInt32 anIndex) const;
|
||||
|
||||
/**
|
||||
* Retrieve the value (of key/value pair) at given index
|
||||
* @update gess5/11/98
|
||||
* @param anIndex is the index of the value you want
|
||||
* @return string containing value.
|
||||
*/
|
||||
virtual const nsString& GetValueAt(PRInt32 anIndex) const;
|
||||
|
||||
/**
|
||||
* NOTE: When the node is an entity, this will translate the entity
|
||||
* to it's unicode value, and store it in aString.
|
||||
* @update gess5/11/98
|
||||
* @param aString will contain the resulting unicode string value
|
||||
* @return int (unicode char or unicode index from table)
|
||||
*/
|
||||
|
||||
virtual PRInt32 TranslateToUnicodeStr(nsString& aString) const;
|
||||
|
||||
/**
|
||||
*
|
||||
* @update gess5/11/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
virtual void AddAttribute(CCalICalendarToken* aToken);
|
||||
|
||||
/**
|
||||
*
|
||||
* @update gess5/11/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
virtual void SetSkippedContent(CCalICalendarToken* aToken);
|
||||
|
||||
/**
|
||||
* This getter retrieves the line number from the input source where
|
||||
* the token occured. Lines are interpreted as occuring between \n characters.
|
||||
* @update gess7/24/98
|
||||
* @return int containing the line number the token was found on
|
||||
*/
|
||||
virtual PRInt32 GetSourceLineNumber(void) const;
|
||||
|
||||
protected:
|
||||
PRInt32 mAttributeCount;
|
||||
PRInt32 mLineNumber;
|
||||
CCalICalendarToken* mToken;
|
||||
CCalICalendarToken* mAttributes[eMaxAttr]; // XXX Ack! This needs to be dynamic!
|
||||
CCalICalendarToken* mSkippedContent;
|
||||
// nsAutoString mName;
|
||||
|
||||
static const nsAutoString mEmptyString;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS"
|
||||
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
* the License for the specific language governing rights and limitations
|
||||
* under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
||||
* Netscape Communications Corporation. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/* Do not edit - generated by gentags.pl */
|
||||
#ifndef nsCalICalendarTags_h___
|
||||
#define nsCalICalendarTags_h___
|
||||
#include "nscalicalendarpars.h"
|
||||
enum nsCalICalendarTag {
|
||||
/* this enum must be first and must be zero */
|
||||
eCalICalendarTag_unknown=0,
|
||||
|
||||
/* begin tag enums */
|
||||
eCalICalendarTag_action=1, eCalICalendarTag_attach=2,
|
||||
eCalICalendarTag_attendee=3, eCalICalendarTag_begin=4,
|
||||
eCalICalendarTag_calscale=5, eCalICalendarTag_categories=6,
|
||||
eCalICalendarTag_class=7, eCalICalendarTag_comment=8,
|
||||
eCalICalendarTag_completed=9, eCalICalendarTag_contact=10,
|
||||
eCalICalendarTag_created=11, eCalICalendarTag_daylight=12,
|
||||
eCalICalendarTag_description=13, eCalICalendarTag_dtend=14,
|
||||
eCalICalendarTag_dtstart=15, eCalICalendarTag_due=16,
|
||||
eCalICalendarTag_duration=17, eCalICalendarTag_end=18,
|
||||
eCalICalendarTag_exdate=19, eCalICalendarTag_exrule=20,
|
||||
eCalICalendarTag_freebusy=21, eCalICalendarTag_geo=22,
|
||||
eCalICalendarTag_last_modified=23, eCalICalendarTag_location=24,
|
||||
eCalICalendarTag_method=25, eCalICalendarTag_organizer=26,
|
||||
eCalICalendarTag_percent_complete=27, eCalICalendarTag_priority=28,
|
||||
eCalICalendarTag_prodid=29, eCalICalendarTag_rdate=30,
|
||||
eCalICalendarTag_recurrence_id=31, eCalICalendarTag_related_to=32,
|
||||
eCalICalendarTag_repeat=33, eCalICalendarTag_request_status=34,
|
||||
eCalICalendarTag_resources=35, eCalICalendarTag_rrule=36,
|
||||
eCalICalendarTag_sequence=37, eCalICalendarTag_standard=38,
|
||||
eCalICalendarTag_status=39, eCalICalendarTag_summary=40,
|
||||
eCalICalendarTag_transp=41, eCalICalendarTag_trigger=42,
|
||||
eCalICalendarTag_tzid=43, eCalICalendarTag_tzname=44,
|
||||
eCalICalendarTag_tzoffsetfrom=45, eCalICalendarTag_tzoffsetto=46,
|
||||
eCalICalendarTag_tzurl=47, eCalICalendarTag_uid=48,
|
||||
eCalICalendarTag_url=49, eCalICalendarTag_valarm=50,
|
||||
eCalICalendarTag_vcalendar=51, eCalICalendarTag_version=52,
|
||||
eCalICalendarTag_vevent=53, eCalICalendarTag_vfreebusy=54,
|
||||
eCalICalendarTag_vjournal=55, eCalICalendarTag_vtimezone=56,
|
||||
eCalICalendarTag_vtodo=57,
|
||||
|
||||
/* The remaining enums are not for tags */
|
||||
eCalICalendarTag_text=58, eCalICalendarTag_whitespace=59,
|
||||
eCalICalendarTag_newline=60, eCalICalendarTag_entity=61,
|
||||
eCalICalendarTag_userdefined=62
|
||||
};
|
||||
#define NS_CALICALENDAR_TAG_MAX 57
|
||||
|
||||
extern NS_CALICALENDARPARS nsCalICalendarTag NS_CalICalendarTagToEnum(const char* aTag);
|
||||
extern NS_CALICALENDARPARS const char* NS_CalICalendarEnumToTag(nsCalICalendarTag aEnum);
|
||||
|
||||
#endif /* nsCalICalendarTags_h___ */
|
|
@ -0,0 +1,174 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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 CALICALENDARTOKENS_H_
|
||||
#define CALICALENDARTOKENS_H_
|
||||
|
||||
#include "nsToken.h"
|
||||
#include "nsCalICalendarTags.h"
|
||||
#include <iostream.h>
|
||||
|
||||
const PRUint32 kSemiColon = ';';
|
||||
const PRUint32 kColon = ':';
|
||||
const PRUint32 kNewline = '\n';
|
||||
const PRUint32 kCarriageReturn = '\r';
|
||||
class CScanner;
|
||||
class CToken;
|
||||
|
||||
enum eCalICalendarTokenTypes {
|
||||
eCalICalendarToken_unknown = 0,
|
||||
eCalICalendarToken_begin=1,
|
||||
eCalICalendarToken_end,
|
||||
eCalICalendarToken_whitespace,
|
||||
eCalICalendarToken_newline,
|
||||
eCalICalendarToken_text,
|
||||
eCalICalendarToken_attribute,
|
||||
eCalICalendarToken_propertyvalue,
|
||||
eCalICalendarToken_propertyname,
|
||||
eCalICalendarToken_identifier,
|
||||
eCalICalendarToken_last // make sure this stays the last token...
|
||||
};
|
||||
|
||||
#define eCalICalendarTags nsCalICalendarTag
|
||||
|
||||
PRInt32 CalICalendarConsumeQuotedString(PRUnichar aChar,nsString& aString,CScanner& aScanner);
|
||||
PRInt32 CalICalendarConsumeAttributeText(PRUnichar aChar,nsString& aString,CScanner& aScanner);
|
||||
const char * CalICalendarGetTagName(PRInt32 aTag);
|
||||
|
||||
class CCalICalendarToken: public CToken {
|
||||
public:
|
||||
|
||||
CCalICalendarToken(eCalICalendarTags aTag);
|
||||
CCalICalendarToken(const nsString& aString,eCalICalendarTags aTag=eCalICalendarTag_unknown);
|
||||
virtual void SetStringValue(const char* name);
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
class CCalICalendarIdentifierToken: public CCalICalendarToken {
|
||||
public:
|
||||
CCalICalendarIdentifierToken(eCalICalendarTags aTag);
|
||||
CCalICalendarIdentifierToken(const nsString& aString,eCalICalendarTags aTag=eCalICalendarTag_unknown);
|
||||
|
||||
virtual nsresult Consume(PRUnichar aChar,CScanner& aScanner);
|
||||
virtual PRInt32 GetTypeID(void);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual void DebugDumpSource(ostream& out);
|
||||
};
|
||||
|
||||
class CCalICalendarPropertyValueToken: public CCalICalendarToken {
|
||||
public:
|
||||
CCalICalendarPropertyValueToken();
|
||||
CCalICalendarPropertyValueToken(eCalICalendarTags aTag);
|
||||
CCalICalendarPropertyValueToken(const nsString& aString,eCalICalendarTags aTag=eCalICalendarTag_unknown);
|
||||
|
||||
virtual nsresult Consume(PRUnichar aChar,CScanner& aScanner);
|
||||
virtual PRInt32 GetTypeID(void);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual void DebugDumpSource(ostream& out);
|
||||
};
|
||||
|
||||
class CCalICalendarBeginToken: public CCalICalendarToken {
|
||||
public:
|
||||
|
||||
CCalICalendarBeginToken(eCalICalendarTags aTag);
|
||||
CCalICalendarBeginToken(nsString& aName, eCalICalendarTags aTag=eCalICalendarTag_unknown);
|
||||
virtual nsresult Consume(PRUnichar aChar,CScanner& aScanner);
|
||||
virtual PRInt32 GetTypeID(void);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
|
||||
PRBool IsAttributed(void);
|
||||
void SetAttributed(PRBool aValue);
|
||||
PRBool IsEmpty(void);
|
||||
void SetEmpty(PRBool aValue);
|
||||
virtual void DebugDumpSource(ostream& out);
|
||||
virtual void Reinitialize(PRInt32 aTag, const nsString& aString);
|
||||
|
||||
protected:
|
||||
PRBool mAttributed;
|
||||
PRBool mEmpty;
|
||||
};
|
||||
|
||||
class CCalICalendarEndToken: public CCalICalendarToken {
|
||||
public:
|
||||
CCalICalendarEndToken(eCalICalendarTags aTag);
|
||||
CCalICalendarEndToken(const nsString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,CScanner& aScanner);
|
||||
virtual PRInt32 GetTypeID(void);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual void DebugDumpSource(ostream& out);
|
||||
};
|
||||
|
||||
class CCalICalendarWhitespaceToken: public CCalICalendarToken {
|
||||
public:
|
||||
CCalICalendarWhitespaceToken();
|
||||
CCalICalendarWhitespaceToken(const nsString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,CScanner& aScanner);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
};
|
||||
|
||||
class CCalICalendarTextToken: public CCalICalendarToken {
|
||||
public:
|
||||
CCalICalendarTextToken();
|
||||
CCalICalendarTextToken(const nsString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,CScanner& aScanner);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
};
|
||||
|
||||
class CCalICalendarAttributeToken: public CCalICalendarToken {
|
||||
public:
|
||||
CCalICalendarAttributeToken();
|
||||
CCalICalendarAttributeToken(const nsString& aString);
|
||||
CCalICalendarAttributeToken(const nsString& aKey, const nsString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,CScanner& aScanner);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual nsString& GetKey(void) {return mTextKey;}
|
||||
virtual void DebugDumpToken(ostream& out);
|
||||
virtual void DebugDumpSource(ostream& out);
|
||||
PRBool mLastAttribute;
|
||||
virtual void Reinitialize(PRInt32 aTag, const nsString& aString);
|
||||
|
||||
protected:
|
||||
nsString mTextKey;
|
||||
};
|
||||
|
||||
class CCalICalendarNewlineToken: public CCalICalendarToken {
|
||||
public:
|
||||
CCalICalendarNewlineToken();
|
||||
CCalICalendarNewlineToken(const nsString& aString);
|
||||
virtual nsresult Consume(PRUnichar aChar,CScanner& aScanner);
|
||||
virtual const char* GetClassName(void);
|
||||
virtual PRInt32 GetTokenType(void);
|
||||
virtual nsString& GetStringValueXXX(void);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* MODULE NOTES:
|
||||
* @update gess 4/1/98
|
||||
*/
|
||||
|
||||
#ifndef nscalicalendarpars_h___
|
||||
#define nscalicalendarpars_h___
|
||||
|
||||
#include "nscore.h"
|
||||
|
||||
#ifdef _IMPL_NS_CALICALENDARPARS
|
||||
#define NS_CALICALENDARPARS NS_EXPORT
|
||||
#else
|
||||
#define NS_CALICALENDARPARS NS_IMPORT
|
||||
#endif
|
||||
|
||||
#if defined(XP_MAC)
|
||||
#define CLASS_EXPORT_CALICALENDARPARS NS_CALICALENDARPARS class
|
||||
#else
|
||||
#define CLASS_EXPORT_CALICALENDARPARS class NS_CALICALENDARPARS
|
||||
#endif
|
||||
|
||||
#endif /* nscalicalendarpars_h___ */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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 nsICalICalendarContentSink_h___
|
||||
#define nsICalICalendarContentSink_h___
|
||||
|
||||
#include "nsISupports.h"
|
||||
#include "nsIWebViewerContainer.h"
|
||||
|
||||
// e2549d00-5a4d-11d2-9432-006008268c31
|
||||
#define NS_ICALICALENDAR_CONTENT_SINK_IID \
|
||||
{ 0xe2549d00, 0x5a4d, 0x11d2, \
|
||||
{ 0x94, 0x32, 0x00, 0x60, 0x08, 0x26, 0x8c, 0x31 } }
|
||||
|
||||
class nsICalICalendarContentSink : public nsISupports
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
NS_IMETHOD Init() = 0 ;
|
||||
NS_IMETHOD SetViewerContainer(nsIWebViewerContainer * aViewerContainer) = 0;
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsICalICalendarContentSink_h___ */
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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 nsICalICalendarParserObject_h___
|
||||
#define nsICalICalendarParserObject_h___
|
||||
|
||||
#include "nsISupports.h"
|
||||
#include "nsString.h"
|
||||
|
||||
// 316a1830-5a4e-11d2-9432-006008268c31
|
||||
#define NS_ICALICALENDAR_PARSER_OBJECT_IID \
|
||||
{ 0x316a1830, 0x5a43, 0x11d2, \
|
||||
{ 0x94, 0x32, 0x00, 0x60, 0x08, 0x26, 0x8c, 0x31 } }
|
||||
|
||||
class nsICalICalendarParserObject : public nsISupports
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
NS_IMETHOD Init() = 0;
|
||||
NS_IMETHOD SetParameter(nsString& aKey, nsString& aValue) = 0;
|
||||
|
||||
};
|
||||
|
||||
#endif /* nsICalICalendarParserObject_h___ */
|
|
@ -0,0 +1,294 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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.
|
||||
*/
|
||||
|
||||
#include "nsCalICalendarContentSink.h"
|
||||
#include "nscalcoreicalCIID.h"
|
||||
//#include "nsCalICalendarTokens.h"
|
||||
//#include "nsCalICalendarDTD.h"
|
||||
//#include "nsCalICalendarParserCIID.h"
|
||||
//#include "nsICalICalendarParserObject.h"
|
||||
//#include "nsICalendarShell.h"
|
||||
//#include "nsCalParserCIID.h"
|
||||
//#include "nsxpfcCIID.h"
|
||||
|
||||
//
|
||||
//#include "vevent.h"
|
||||
//#include "nscal.h"
|
||||
//#include "vtodo.h"
|
||||
//#include "vfrbsy.h"
|
||||
//#include "vtimezne.h"
|
||||
//#include "valarm.h"
|
||||
//
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIContentSinkIID, NS_ICONTENT_SINK_IID);
|
||||
static NS_DEFINE_IID(kICalICalendarContentSinkIID, NS_ICALICALENDAR_CONTENT_SINK_IID);
|
||||
static NS_DEFINE_IID(kICalICalendarParserObjectIID, NS_ICALICALENDAR_PARSER_OBJECT_IID);
|
||||
|
||||
static NS_DEFINE_IID(kCCalICalendarVCalendarCID, NS_CALICALENDARVCALENDAR_CID);
|
||||
static NS_DEFINE_IID(kCCalICalendarVEventCID, NS_CALICALENDARVEVENT_CID);
|
||||
static NS_DEFINE_IID(kCCalICalendarVTodoCID, NS_CALICALENDARVTODO_CID);
|
||||
static NS_DEFINE_IID(kCCalICalendarVJournalCID, NS_CALICALENDARVJOURNAL_CID);
|
||||
static NS_DEFINE_IID(kCCalICalendarVFreebusyCID, NS_CALICALENDARVFREEBUSY_CID);
|
||||
static NS_DEFINE_IID(kCCalICalendarVTimeZoneCID, NS_CALICALENDARVTIMEZONE_CID);
|
||||
static NS_DEFINE_IID(kCCalICalendarVAlarmCID, NS_CALICALENDARVALARM_CID);
|
||||
|
||||
nsCalICalendarContentSink::nsCalICalendarContentSink() {
|
||||
}
|
||||
|
||||
nsCalICalendarContentSink::~nsCalICalendarContentSink() {
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::Init() {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult nsCalICalendarContentSink::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
||||
{
|
||||
if (NULL == aInstancePtr) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
*aInstancePtr = (nsIContentSink*)(this);
|
||||
}
|
||||
else if (aIID.Equals(kIContentSinkIID)) {
|
||||
*aInstancePtr = (nsIContentSink*)(this);
|
||||
}
|
||||
else if (aIID.Equals(kICalICalendarContentSinkIID)) {
|
||||
*aInstancePtr = (nsICalICalendarContentSink*)(this);
|
||||
}
|
||||
else {
|
||||
*aInstancePtr=0;
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF(nsCalICalendarContentSink);
|
||||
NS_IMPL_RELEASE(nsCalICalendarContentSink);
|
||||
|
||||
nsresult nsCalICalendarContentSink::SetViewerContainer(nsIWebViewerContainer * aViewerContainer)
|
||||
{
|
||||
mViewerContainer = aViewerContainer;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::OpenContainer(const nsIParserNode& aNode)
|
||||
{
|
||||
nsICalICalendarParserObject * object = nsnull;
|
||||
eCalICalendarTags tag = (eCalICalendarTags) aNode.GetNodeType();
|
||||
nsresult res;
|
||||
nsCID aclass;
|
||||
|
||||
nsString tex = aNode.GetText();
|
||||
res = CIDFromTag(tag, aclass);
|
||||
|
||||
if (NS_OK != res)
|
||||
return res;
|
||||
|
||||
res = nsRepository::CreateInstance(aclass, nsnull, kICalICalendarParserObjectIID,
|
||||
(void **) &object);
|
||||
|
||||
if (NS_OK != res)
|
||||
return res;
|
||||
|
||||
AddToHierarchy(*object, PR_TRUE);
|
||||
object->Init();
|
||||
ConsumeAttributes(aNode,*object);
|
||||
// todo: finish
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::CloseContainer(const nsIParserNode& aNode)
|
||||
{
|
||||
nsISupports * container = (nsISupports *)mXPFCStack->Pop();
|
||||
|
||||
// todo: finish
|
||||
|
||||
NS_IF_RELEASE(container);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::AddLeaf(const nsIParserNode& aNode)
|
||||
{
|
||||
nsICalICalendarParserObject * object = nsnull;
|
||||
eCalICalendarTags tag = (eCalICalendarTags) aNode.GetNodeType();
|
||||
nsresult res;
|
||||
nsCID aclass;
|
||||
|
||||
nsString text = aNode.GetText();
|
||||
res = CIDFromTag(tag, aclass);
|
||||
res = nsRepository::CreateInstance(aclass,
|
||||
nsnull,
|
||||
kICalICalendarParserObjectIID,
|
||||
(void **)&object);
|
||||
if (NS_OK != res)
|
||||
return res;
|
||||
|
||||
AddToHierarchy(*object, PR_FALSE);
|
||||
|
||||
object->Init();
|
||||
|
||||
ConsumeAttributes(aNode, *object);
|
||||
|
||||
//ConsumePropertyValues(aNode, *object);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::WillBuildModel(void)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::DidBuildModel(PRInt32 aQualityLevel)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::WillInterrupt(void)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::WillResume(void)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Find the CID from the XML Tag Object
|
||||
*/
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::CIDFromTag(eCalICalendarTags tag, nsCID &aClass)
|
||||
{
|
||||
switch(tag)
|
||||
{
|
||||
case eCalICalendarTag_vcalendar:
|
||||
aClass = kCCalICalendarVCalendarCID;
|
||||
break;
|
||||
|
||||
case eCalICalendarTag_vevent:
|
||||
aClass = kCCalICalendarVEventCID;
|
||||
break;
|
||||
|
||||
case eCalICalendarTag_vtodo:
|
||||
aClass = kCCalICalendarVTodoCID;
|
||||
break;
|
||||
|
||||
case eCalICalendarTag_vjournal:
|
||||
aClass = kCCalICalendarVJournalCID;
|
||||
break;
|
||||
|
||||
case eCalICalendarTag_vfreebusy:
|
||||
aClass = kCCalICalendarVFreebusyCID;
|
||||
break;
|
||||
|
||||
case eCalICalendarTag_vtimezone:
|
||||
aClass = kCCalICalendarVTimeZoneCID;
|
||||
break;
|
||||
|
||||
case eCalICalendarTag_valarm:
|
||||
aClass = kCCalICalendarVAlarmCID;
|
||||
break;
|
||||
|
||||
default:
|
||||
return (NS_ERROR_UNEXPECTED);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::ConsumeAttributes(const nsIParserNode& aNode,
|
||||
nsICalICalendarParserObject& aObject)
|
||||
{
|
||||
PRInt32 i = 0;
|
||||
nsString key,value;
|
||||
nsString scontainer;
|
||||
//PRBool container;
|
||||
|
||||
for (i = 0; i < aNode.GetAttributeCount(); i++) {
|
||||
key = aNode.GetKeyAt(i);
|
||||
value = aNode.GetValueAt(i);
|
||||
|
||||
key.StripChars("\"");
|
||||
value.StripChars("\"");
|
||||
|
||||
aObject.SetParameter(key,value);
|
||||
}
|
||||
|
||||
eCalICalendarTags tag = (eCalICalendarTags) aNode.GetNodeType();
|
||||
|
||||
// todo: finish
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::ConsumePropertyValues(const nsIParserNode& aNode,
|
||||
nsICalICalendarParserObject& aObject)
|
||||
{
|
||||
PRInt32 i = 0;
|
||||
nsString key,value;
|
||||
nsString scontainer;
|
||||
//PRBool container;
|
||||
|
||||
for (i = 0; i < aNode.GetAttributeCount(); i++) {
|
||||
key = aNode.GetKeyAt(i);
|
||||
value = aNode.GetValueAt(i);
|
||||
|
||||
key.StripChars("\"");
|
||||
value.StripChars("\"");
|
||||
|
||||
aObject.SetParameter(key,value);
|
||||
}
|
||||
|
||||
eCalICalendarTags tag = (eCalICalendarTags) aNode.GetNodeType();
|
||||
|
||||
// todo: finish
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
*/
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarContentSink::AddToHierarchy(nsICalICalendarParserObject& aObject,
|
||||
PRBool aPush)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
PRBool nsCalICalendarContentSink::IsContainer(const nsIParserNode& aNode)
|
||||
{
|
||||
PRInt32 i = 0;
|
||||
nsString key;
|
||||
PRBool container = PR_FALSE;
|
||||
|
||||
for (i = 0; i < aNode.GetAttributeCount(); i++) {
|
||||
|
||||
key = aNode.GetKeyAt(i);
|
||||
key.StripChars("\"");
|
||||
|
||||
// todo: finish
|
||||
}
|
||||
|
||||
return container;
|
||||
}
|
|
@ -0,0 +1,854 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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.
|
||||
*/
|
||||
|
||||
#include "nscalexport.h"
|
||||
#include "nsCalXMLDTD.h"
|
||||
#include "nsCalParserCIID.h"
|
||||
#include "nsxpfcCIID.h"
|
||||
#include "nsCalICalendarDTD.h"
|
||||
#include "nsToken.h"
|
||||
#include "nsScanner.h"
|
||||
#include "nsParser.h" // ?
|
||||
#include "nsParserNode.h" // ?
|
||||
#include "nsIParserNode.h" // ?
|
||||
#include "nsCalICalendarContentSink.h"
|
||||
#include "nsCalICalendarTokens.h" // todo:
|
||||
#include "nsCalICalendarParserCIID.h"
|
||||
#include "nsParserCIID.h"
|
||||
#include "nsCRT.h" // ?
|
||||
|
||||
//#include "nsCalICalendarStrings.h"
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIDTDIID, NS_IDTD_IID);
|
||||
static NS_DEFINE_IID(kClassIID, NS_ICALICALENDAR_DTD_IID);
|
||||
static NS_DEFINE_IID(kBaseClassIID, NS_ICALICALENDAR_DTD_IID);
|
||||
|
||||
static NS_DEFINE_IID(kCParserNodeCID, NS_PARSER_NODE_IID);
|
||||
static NS_DEFINE_IID(kCParserNodeIID, NS_IPARSER_NODE_IID);
|
||||
|
||||
static const char* kNullToken = "Error: Null token given";
|
||||
static const char* kCalICalendarTextHeader = "BEGIN:VCALENDAR";
|
||||
static const char* kCalICalendarTextContentType = "text/calendar";
|
||||
static nsAutoString gCalEmpty;
|
||||
|
||||
static eCalICalendarTags gCalNonContainers[]={
|
||||
eCalICalendarTag_action, eCalICalendarTag_attach,
|
||||
eCalICalendarTag_attendee, eCalICalendarTag_calscale,
|
||||
eCalICalendarTag_categories, eCalICalendarTag_class,
|
||||
eCalICalendarTag_comment, eCalICalendarTag_completed,
|
||||
eCalICalendarTag_contact, eCalICalendarTag_created,
|
||||
eCalICalendarTag_description,
|
||||
eCalICalendarTag_dtend, eCalICalendarTag_dtstart,
|
||||
eCalICalendarTag_due, eCalICalendarTag_duration,
|
||||
eCalICalendarTag_exdate, eCalICalendarTag_exrule,
|
||||
eCalICalendarTag_freebusy, eCalICalendarTag_geo,
|
||||
eCalICalendarTag_last_modified, eCalICalendarTag_location,
|
||||
eCalICalendarTag_method, eCalICalendarTag_organizer,
|
||||
eCalICalendarTag_percent_complete, eCalICalendarTag_priority,
|
||||
eCalICalendarTag_prodid, eCalICalendarTag_rdate,
|
||||
eCalICalendarTag_recurrence_id, eCalICalendarTag_related_to,
|
||||
eCalICalendarTag_repeat, eCalICalendarTag_request_status,
|
||||
eCalICalendarTag_resources, eCalICalendarTag_rrule,
|
||||
eCalICalendarTag_sequence,
|
||||
eCalICalendarTag_status, eCalICalendarTag_summary,
|
||||
eCalICalendarTag_transp, eCalICalendarTag_trigger,
|
||||
eCalICalendarTag_tzid, eCalICalendarTag_tzname,
|
||||
eCalICalendarTag_tzoffsetfrom, eCalICalendarTag_tzoffsetto,
|
||||
eCalICalendarTag_tzurl, eCalICalendarTag_uid,
|
||||
eCalICalendarTag_url,
|
||||
eCalICalendarTag_version,
|
||||
};
|
||||
|
||||
struct nsCalICalendarTagEntry {
|
||||
char mName[32];
|
||||
eCalICalendarTags fTagID;
|
||||
};
|
||||
|
||||
nsCalICalendarTagEntry gCalICalendarTagTable[] =
|
||||
{
|
||||
{"vcalendar", eCalICalendarTag_vcalendar},
|
||||
{"vevent", eCalICalendarTag_vevent},
|
||||
{"vtodo", eCalICalendarTag_vtodo},
|
||||
{"vjournal", eCalICalendarTag_vjournal},
|
||||
{"vfreebusy", eCalICalendarTag_vfreebusy},
|
||||
{"valarm", eCalICalendarTag_valarm},
|
||||
{"vtimezone", eCalICalendarTag_vtimezone}
|
||||
};
|
||||
|
||||
eCalICalendarTags DetermineCalICalendarComponentType(const nsString& aString)
|
||||
{
|
||||
PRInt32 result=-1;
|
||||
PRInt32 cnt=sizeof(gCalICalendarTagTable)/sizeof(nsCalICalendarTagEntry);
|
||||
PRInt32 low=0;
|
||||
PRInt32 high=cnt-1;
|
||||
PRInt32 middle=0;
|
||||
|
||||
while(low<=high){
|
||||
middle=(PRInt32)(low+high)/2;
|
||||
//result=aString.Compare(gCalICalendarTagTable[middle].mName, nsCRT::strlen(gXPFCXMLTagTable[middle].mName), PR_TRUE);
|
||||
result=aString.Compare(gCalICalendarTagTable[middle].mName, PR_TRUE);
|
||||
if (result==0)
|
||||
return gCalICalendarTagTable[middle].fTagID;
|
||||
if (result<0)
|
||||
high=middle-1;
|
||||
else low=middle+1;
|
||||
}
|
||||
return eCalICalendarTag_userdefined;
|
||||
}
|
||||
|
||||
PRInt32 CalICalendarDispatchTokenHandler(CToken* aToken,nsIDTD* aDTD) {
|
||||
PRInt32 result=0;
|
||||
eCalICalendarTokenTypes theType = (eCalICalendarTokenTypes)aToken->GetTokenType();
|
||||
nsCalICalendarDTD* theDTD=(nsCalICalendarDTD*)aDTD;
|
||||
|
||||
nsString& name = aToken->GetStringValueXXX();
|
||||
eCalICalendarTags type = DetermineCalICalendarComponentType(name);
|
||||
|
||||
if (type != eCalICalendarTag_userdefined)
|
||||
aToken->SetTypeID(type);
|
||||
|
||||
if (aDTD) {
|
||||
switch(theType) {
|
||||
case eCalICalendarToken_begin:
|
||||
result=theDTD->HandleBeginToken(aToken); break;
|
||||
case eCalICalendarToken_end:
|
||||
result=theDTD->HandleEndToken(aToken); break;
|
||||
case eCalICalendarToken_attribute:
|
||||
result=theDTD->HandleAttributeToken(aToken); break;
|
||||
case eCalICalendarToken_propertyvalue:
|
||||
result=theDTD->HandlePropertyValueToken(aToken); break;
|
||||
default:
|
||||
result=0;
|
||||
}//switch
|
||||
}//if
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* token deallocator */
|
||||
class nsCalTokenDeallocator: public nsDequeFunctor {
|
||||
public:
|
||||
virtual void* operator()(void* anObject) {
|
||||
CToken* aToken = (CToken*)anObject;
|
||||
delete aToken;
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
static nsCalTokenDeallocator gCalTokenKiller;
|
||||
|
||||
/* token recycler, cuts down number of tokens that get created during the run of system */
|
||||
class nsCalTokenRecycler: public nsITokenRecycler {
|
||||
public:
|
||||
nsCalTokenRecycler();
|
||||
virtual ~nsCalTokenRecycler();
|
||||
virtual void RecycleToken(CToken* aToken);
|
||||
virtual CToken* CreateTokenOfType(eCalICalendarTokenTypes aType,eCalICalendarTags aTag,
|
||||
const nsString& aString);
|
||||
|
||||
protected:
|
||||
nsDeque* mTokenCache[eCalICalendarToken_last-1];
|
||||
};
|
||||
|
||||
nsCalTokenRecycler::nsCalTokenRecycler() : nsITokenRecycler() {
|
||||
int i=0;
|
||||
for (i=0;i<eCalICalendarToken_last-1;i++) {
|
||||
mTokenCache[i]=new nsDeque(gCalTokenKiller);
|
||||
//mTotals[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
nsCalTokenRecycler::~nsCalTokenRecycler() {
|
||||
int i;
|
||||
for(i=0;i<eCalICalendarToken_last-1;i++){
|
||||
delete mTokenCache[i];
|
||||
}
|
||||
}
|
||||
|
||||
void nsCalTokenRecycler::RecycleToken(CToken* aToken) {
|
||||
if(aToken) {
|
||||
PRInt32 theType=aToken->GetTokenType();
|
||||
mTokenCache[theType-1]->Push(aToken);
|
||||
}
|
||||
}
|
||||
|
||||
CToken * nsCalTokenRecycler::CreateTokenOfType(eCalICalendarTokenTypes aType,
|
||||
eCalICalendarTags aTag,
|
||||
const nsString& aString)
|
||||
{
|
||||
CToken* result=(CToken*)mTokenCache[aType-1]->Pop();
|
||||
|
||||
if(result) {
|
||||
result->Reinitialize(aTag,aString);
|
||||
}
|
||||
else {
|
||||
switch(aType) {
|
||||
//todo: finish
|
||||
case eCalICalendarToken_begin: result=new CCalICalendarBeginToken(aTag); break;
|
||||
case eCalICalendarToken_end: result=new CCalICalendarEndToken(aTag); break;
|
||||
case eCalICalendarToken_propertyname: result=new CCalICalendarIdentifierToken(aTag); break;
|
||||
case eCalICalendarToken_attribute: result=new CCalICalendarAttributeToken(); break;
|
||||
case eCalICalendarToken_propertyvalue: result=new CCalICalendarPropertyValueToken(); break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
nsCalTokenRecycler gCalTokenRecycler;
|
||||
|
||||
struct nsCalICalendarComponentEntry {
|
||||
char mName[32];
|
||||
eCalICalendarTags fTagID;
|
||||
};
|
||||
|
||||
|
||||
nsresult nsCalICalendarDTD::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
||||
{
|
||||
if (NULL == aInstancePtr) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
if (aIID.Equals(kISupportsIID)) { //do IUnknown...
|
||||
*aInstancePtr = (nsIDTD*)(this);
|
||||
}
|
||||
else if (aIID.Equals(kIDTDIID)) { //do IParser base class...
|
||||
*aInstancePtr = (nsIDTD*)(this);
|
||||
}
|
||||
else if (aIID.Equals(kClassIID)) { //do this class...
|
||||
*aInstancePtr = (nsCalICalendarDTD*)(this);
|
||||
}
|
||||
else {
|
||||
*aInstancePtr=0;
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
((nsISupports*) *aInstancePtr)->AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_CALICALENDARPARS nsresult NS_NewICAL_DTD(nsIDTD** aInstancePtrResult)
|
||||
{
|
||||
nsCalICalendarDTD * it = new nsCalICalendarDTD();
|
||||
|
||||
if (it == 0) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
return it->QueryInterface(kClassIID, (void **) aInstancePtrResult);
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF(nsCalICalendarDTD)
|
||||
NS_IMPL_RELEASE(nsCalICalendarDTD)
|
||||
|
||||
nsCalICalendarDTD::nsCalICalendarDTD() : nsIDTD() , mTokenDeque(gCalTokenKiller)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
mParser=0;
|
||||
}
|
||||
|
||||
nsCalICalendarDTD::~nsCalICalendarDTD(){
|
||||
}
|
||||
|
||||
PRBool nsCalICalendarDTD::CanParse(nsString& aContentType, PRInt32 aVersion)
|
||||
{
|
||||
if (aContentType == kCalICalendarTextContentType)
|
||||
return PR_TRUE;
|
||||
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
eAutoDetectResult nsCalICalendarDTD::AutoDetectContentType(nsString& aBuffer,nsString& aType)
|
||||
{
|
||||
if (aType == kCalICalendarTextContentType || aBuffer.Find(kCalICalendarTextHeader) != -1)
|
||||
{
|
||||
aType = kCalICalendarTextContentType;
|
||||
return eValidDetect;
|
||||
}
|
||||
return eUnknownDetect;
|
||||
}
|
||||
|
||||
nsresult nsCalICalendarDTD::HandleToken(CToken* aToken)
|
||||
{
|
||||
nsresult result=NS_OK;
|
||||
|
||||
if(aToken) {
|
||||
|
||||
CCalICalendarToken* theToken= (CCalICalendarToken*)(aToken);
|
||||
eCalICalendarTokenTypes theType=eCalICalendarTokenTypes(theToken->GetTokenType());
|
||||
|
||||
result=CalICalendarDispatchTokenHandler(theToken,this);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult nsCalICalendarDTD::CreateNewInstance(nsIDTD** aInstancePtrResult)
|
||||
{
|
||||
/*
|
||||
static NS_DEFINE_IID(kCCalCalICalendarDTD, NS_ICALICALENDAR_DTD_IID);
|
||||
|
||||
nsresult result = nsRepository::CreateInstance(kCCalCalICalendarDTD,
|
||||
nsnull,
|
||||
kIDTDIID,
|
||||
(void**) aInstancePtrResult);
|
||||
|
||||
return (result);
|
||||
*/
|
||||
return NS_NewICAL_DTD(aInstancePtrResult);
|
||||
}
|
||||
|
||||
nsresult nsCalICalendarDTD::HandleAttributeToken(CToken* aToken) {
|
||||
NS_PRECONDITION(0 != aToken,kNullToken);
|
||||
NS_ERROR("attribute encountered -- this shouldn't happen!");
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult nsCalICalendarDTD::HandlePropertyValueToken(CToken* aToken) {
|
||||
|
||||
/*
|
||||
todo: handle "Content-type" stuff here
|
||||
*/
|
||||
/*
|
||||
XXX: this is bad hack. I really shouldn't be handling MIME.
|
||||
Someone else should parse all the MIME.
|
||||
This DTD should really know how to parse iCal.
|
||||
I should really NS_ERROR if this is called.
|
||||
*/
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult nsCalICalendarDTD::HandleBeginToken(CToken* aToken)
|
||||
{
|
||||
CCalICalendarBeginToken * st = (CCalICalendarBeginToken*)aToken;
|
||||
eCalICalendarTags tokenTagType = (eCalICalendarTags) st->GetTypeID();
|
||||
nsCParserNode * attrNode = nsnull;
|
||||
|
||||
//Begin by gathering up attributes...
|
||||
static NS_DEFINE_IID(kCParserNodeCID, NS_PARSER_NODE_IID);
|
||||
static NS_DEFINE_IID(kCParserNodeIID, NS_IPARSER_NODE_IID);
|
||||
|
||||
nsresult result = nsRepository::CreateInstance(kCParserNodeCID, nsnull, kCParserNodeIID,(void**) &attrNode);
|
||||
|
||||
if (NS_OK != result)
|
||||
return result;
|
||||
|
||||
attrNode->Init((CCalICalendarToken*)aToken,mLineNumber);
|
||||
|
||||
PRInt16 attrCount=aToken->GetAttributeCount();
|
||||
result=(0==attrCount) ? NS_OK : CollectAttributes(*attrNode,attrCount);
|
||||
|
||||
// now set skipped content to property value token
|
||||
/* todo: finish
|
||||
if (tokenTagType == eCalICalendarTag_begin) {
|
||||
tokenTagType = ComponentTypeFromObject(*attrNode);
|
||||
st->SetTypeID(tokenTagType);
|
||||
}
|
||||
*/
|
||||
if(NS_OK==result) {
|
||||
|
||||
switch(tokenTagType) {
|
||||
case eCalICalendarTag_vcalendar:
|
||||
case eCalICalendarTag_vevent:
|
||||
case eCalICalendarTag_vtodo:
|
||||
case eCalICalendarTag_vjournal:
|
||||
case eCalICalendarTag_vfreebusy:
|
||||
case eCalICalendarTag_valarm:
|
||||
case eCalICalendarTag_vtimezone:
|
||||
{
|
||||
mSink->OpenContainer(*attrNode);
|
||||
}
|
||||
break;
|
||||
|
||||
case eCalICalendarTag_action:
|
||||
case eCalICalendarTag_attach:
|
||||
case eCalICalendarTag_attendee:
|
||||
case eCalICalendarTag_calscale:
|
||||
case eCalICalendarTag_categories:
|
||||
case eCalICalendarTag_class:
|
||||
case eCalICalendarTag_comment:
|
||||
case eCalICalendarTag_completed:
|
||||
case eCalICalendarTag_contact:
|
||||
case eCalICalendarTag_created:
|
||||
case eCalICalendarTag_description:
|
||||
case eCalICalendarTag_dtend:
|
||||
case eCalICalendarTag_dtstart:
|
||||
case eCalICalendarTag_due:
|
||||
case eCalICalendarTag_duration:
|
||||
case eCalICalendarTag_exdate:
|
||||
case eCalICalendarTag_exrule:
|
||||
case eCalICalendarTag_freebusy:
|
||||
case eCalICalendarTag_geo:
|
||||
case eCalICalendarTag_last_modified:
|
||||
case eCalICalendarTag_location:
|
||||
case eCalICalendarTag_method:
|
||||
case eCalICalendarTag_organizer:
|
||||
case eCalICalendarTag_percent_complete:
|
||||
case eCalICalendarTag_priority:
|
||||
case eCalICalendarTag_prodid:
|
||||
case eCalICalendarTag_rdate:
|
||||
case eCalICalendarTag_rrule:
|
||||
case eCalICalendarTag_recurrence_id:
|
||||
case eCalICalendarTag_related_to:
|
||||
case eCalICalendarTag_repeat:
|
||||
case eCalICalendarTag_request_status:
|
||||
case eCalICalendarTag_resources:
|
||||
case eCalICalendarTag_sequence:
|
||||
case eCalICalendarTag_status:
|
||||
case eCalICalendarTag_summary:
|
||||
case eCalICalendarTag_transp:
|
||||
case eCalICalendarTag_trigger:
|
||||
case eCalICalendarTag_tzid:
|
||||
case eCalICalendarTag_tzname:
|
||||
case eCalICalendarTag_tzoffsetfrom:
|
||||
case eCalICalendarTag_tzoffsetto:
|
||||
case eCalICalendarTag_tzurl:
|
||||
case eCalICalendarTag_uid:
|
||||
case eCalICalendarTag_url:
|
||||
case eCalICalendarTag_version:
|
||||
{
|
||||
// todo: finish
|
||||
/*
|
||||
if (((nsCalICalendarContentSink *)mSink)->IsContainer(*attrNode) == PR_TRUE)
|
||||
st->SetTypeID(eCalICalendarTag_property);
|
||||
*/
|
||||
result = CollectPropertyValue(*attrNode,attrCount);
|
||||
mSink->AddLeaf(*attrNode);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
NS_RELEASE(attrNode);
|
||||
|
||||
if(eCalICalendarTag_newline==tokenTagType)
|
||||
mLineNumber++;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
PRInt32 nsCalICalendarDTD::CollectPropertyValue(nsCParserNode& aNode,PRInt32 aCount) {
|
||||
|
||||
CToken* theToken=mParser->PeekToken();
|
||||
if(theToken) {
|
||||
eCalICalendarTokenTypes theType=eCalICalendarTokenTypes(theToken->GetTokenType());
|
||||
if(eCalICalendarToken_propertyvalue==theType){
|
||||
mParser->PopToken(); //pop it for real...
|
||||
aNode.SetSkippedContent(theToken);
|
||||
}
|
||||
else return kInterrupted;
|
||||
}
|
||||
return kNoError;
|
||||
}
|
||||
|
||||
PRInt32 nsCalICalendarDTD::CollectAttributes(nsCParserNode& aNode,PRInt32 aCount) {
|
||||
int attr=0;
|
||||
for(attr=0;attr<aCount;attr++){
|
||||
CToken* theToken=mParser->PeekToken();
|
||||
if(theToken) {
|
||||
eCalICalendarTokenTypes theType=eCalICalendarTokenTypes(theToken->GetTokenType());
|
||||
if(eCalICalendarToken_attribute==theType){
|
||||
mParser->PopToken(); //pop it for real...
|
||||
aNode.AddAttribute(theToken);
|
||||
}
|
||||
}
|
||||
else return kInterrupted;
|
||||
}
|
||||
return kNoError;
|
||||
}
|
||||
|
||||
nsresult nsCalICalendarDTD::HandleEndToken(CToken* aToken)
|
||||
{
|
||||
nsresult result=NS_OK;
|
||||
CCalICalendarEndToken* et = (CCalICalendarEndToken *)(aToken);
|
||||
eCalICalendarTags tokenTagType=(eCalICalendarTags)et->GetTypeID();
|
||||
nsCParserNode * attrNode = nsnull;
|
||||
|
||||
static NS_DEFINE_IID(kCParserNodeCID, NS_PARSER_NODE_IID);
|
||||
static NS_DEFINE_IID(kCParserNodeIID, NS_IPARSER_NODE_IID);
|
||||
|
||||
result = nsRepository::CreateInstance(kCParserNodeCID, nsnull, kCParserNodeIID, (void**)&attrNode);
|
||||
|
||||
if (NS_OK != result)
|
||||
return result;
|
||||
|
||||
attrNode->Init((CCalICalendarToken *)aToken, mLineNumber);
|
||||
|
||||
/* todo: finish
|
||||
if (tokenTagType == eCalICalendarTag_object) {
|
||||
tokenTagType = ComponentTypeFromObject(*attrNode);
|
||||
et->SetTypeID(tokenTagType);
|
||||
}
|
||||
*/
|
||||
switch(tokenTagType) {
|
||||
|
||||
case eCalICalendarTag_vcalendar:
|
||||
case eCalICalendarTag_vevent:
|
||||
case eCalICalendarTag_vtodo:
|
||||
case eCalICalendarTag_vjournal:
|
||||
case eCalICalendarTag_vfreebusy:
|
||||
case eCalICalendarTag_valarm:
|
||||
case eCalICalendarTag_vtimezone:
|
||||
{
|
||||
mSink->CloseContainer(*attrNode);
|
||||
}
|
||||
break;
|
||||
|
||||
case eCalICalendarTag_attach:
|
||||
case eCalICalendarTag_attendee:
|
||||
case eCalICalendarTag_calscale:
|
||||
case eCalICalendarTag_categories:
|
||||
case eCalICalendarTag_class:
|
||||
case eCalICalendarTag_comment:
|
||||
case eCalICalendarTag_completed:
|
||||
case eCalICalendarTag_contact:
|
||||
case eCalICalendarTag_created:
|
||||
case eCalICalendarTag_description:
|
||||
case eCalICalendarTag_dtend:
|
||||
case eCalICalendarTag_dtstart:
|
||||
case eCalICalendarTag_due:
|
||||
case eCalICalendarTag_duration:
|
||||
case eCalICalendarTag_exdate:
|
||||
case eCalICalendarTag_exrule:
|
||||
case eCalICalendarTag_freebusy:
|
||||
case eCalICalendarTag_geo:
|
||||
case eCalICalendarTag_last_modified:
|
||||
case eCalICalendarTag_location:
|
||||
case eCalICalendarTag_method:
|
||||
case eCalICalendarTag_organizer:
|
||||
case eCalICalendarTag_percent_complete:
|
||||
case eCalICalendarTag_priority:
|
||||
case eCalICalendarTag_prodid:
|
||||
case eCalICalendarTag_rdate:
|
||||
case eCalICalendarTag_rrule:
|
||||
case eCalICalendarTag_recurrence_id:
|
||||
case eCalICalendarTag_related_to:
|
||||
case eCalICalendarTag_repeat:
|
||||
case eCalICalendarTag_request_status:
|
||||
case eCalICalendarTag_resources:
|
||||
case eCalICalendarTag_sequence:
|
||||
case eCalICalendarTag_status:
|
||||
case eCalICalendarTag_summary:
|
||||
case eCalICalendarTag_transp:
|
||||
case eCalICalendarTag_trigger:
|
||||
case eCalICalendarTag_tzid:
|
||||
case eCalICalendarTag_tzname:
|
||||
case eCalICalendarTag_tzoffsetfrom:
|
||||
case eCalICalendarTag_tzoffsetto:
|
||||
case eCalICalendarTag_tzurl:
|
||||
case eCalICalendarTag_uid:
|
||||
case eCalICalendarTag_url:
|
||||
case eCalICalendarTag_version:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
NS_RELEASE(attrNode);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
eCalICalendarTags nsCalICalendarDTD::ComponentTypeFromObject(const nsIParserNode& aNode)
|
||||
{
|
||||
PRInt32 i = 0;
|
||||
|
||||
for (i = 0; i < aNode.GetAttributeCount(); i++) {
|
||||
|
||||
nsString key = aNode.GetKeyAt(i);
|
||||
key.StripChars("\"");
|
||||
if (key.EqualsIgnoreCase(XPFC_STRING_CLASS)) {
|
||||
nsString value = aNode.GetValueAt(i);
|
||||
|
||||
value.StripChars("\"");
|
||||
|
||||
if (value.EqualsIgnoreCase("attach"))
|
||||
return (eCalICalendarTag_attach);
|
||||
// todo: finish
|
||||
}
|
||||
}
|
||||
return (eCalICalendarTag_unknown);
|
||||
}
|
||||
*/
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarDTD::WillBuildModel(nsString& aFilename,PRInt32 aLevel) {
|
||||
nsresult result=NS_OK;
|
||||
/*
|
||||
mFilename=aFilename;
|
||||
|
||||
if((aNotifySink) && (mSink)) {
|
||||
mLineNumber=1;
|
||||
result = mSink->WillBuildModel();
|
||||
}
|
||||
*/
|
||||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsCalICalendarDTD::DidBuildModel(PRInt32 anErrorCode,PRInt32 aLevel){
|
||||
nsresult result=NS_OK;
|
||||
return result;
|
||||
}
|
||||
|
||||
void nsCalICalendarDTD::SetParser(nsIParser* aParser) {
|
||||
mParser=(nsParser*)aParser;
|
||||
if (mParser)
|
||||
mParseMode = aParser->GetParseMode();
|
||||
}
|
||||
|
||||
nsIContentSink* nsCalICalendarDTD::SetContentSink(nsIContentSink* aSink) {
|
||||
nsIContentSink* old=mSink;
|
||||
mSink= aSink;
|
||||
return old;
|
||||
}
|
||||
|
||||
// todo: consume token
|
||||
|
||||
nsresult nsCalICalendarDTD::WillResumeParse(void){
|
||||
nsresult result = NS_OK;
|
||||
if(mSink) {
|
||||
result = mSink->WillResume();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult nsCalICalendarDTD::WillInterruptParse(void){
|
||||
nsresult result = NS_OK;
|
||||
if(mSink) {
|
||||
result = mSink->WillResume();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
PRBool nsCalICalendarDTD::Verify(nsString& aURLRef){
|
||||
PRBool result=PR_TRUE;
|
||||
return result;
|
||||
}
|
||||
|
||||
PRBool nsCalICalendarDTD::IsContainer(PRInt32 aTag) const{
|
||||
PRBool result=PR_FALSE;
|
||||
return result;
|
||||
}
|
||||
|
||||
PRBool nsCalICalendarDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const{
|
||||
PRBool result=PR_FALSE;
|
||||
return result;
|
||||
}
|
||||
|
||||
nsITokenRecycler* nsCalICalendarDTD::GetTokenRecycler(void){
|
||||
return 0;
|
||||
}
|
||||
|
||||
nsresult nsCalICalendarDTD::ConsumeToken(CToken*& aToken){
|
||||
aToken = 0;
|
||||
if(mTokenDeque.GetSize()>0)
|
||||
{
|
||||
aToken=(CToken*)mTokenDeque.Pop();
|
||||
return NS_OK;
|
||||
}
|
||||
CScanner* theScanner=mParser->GetScanner();
|
||||
|
||||
PRUnichar aChar;
|
||||
nsresult result=theScanner->GetChar(aChar);
|
||||
switch(result) {
|
||||
case kEOF:
|
||||
break;
|
||||
|
||||
case kInterrupted:
|
||||
theScanner->RewindToMark();
|
||||
break;
|
||||
|
||||
case NS_OK:
|
||||
default:
|
||||
switch(aChar) {
|
||||
case kNotFound:
|
||||
break;
|
||||
|
||||
case kCR: case kLF:
|
||||
result=ConsumeNewline(aChar,*theScanner,aToken);
|
||||
break;
|
||||
default:
|
||||
if (!nsString::IsSpace(aChar)) {
|
||||
result=ConsumePropertyLine(aChar,*theScanner,aToken);
|
||||
break;
|
||||
}
|
||||
result=ConsumeWhitespace(aChar,*theScanner,aToken);
|
||||
break;
|
||||
} //switch
|
||||
}
|
||||
//if(NS_OK==result)
|
||||
// result=theScanner->Eof();
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsCalICalendarDTD::ConsumePropertyValue(PRUnichar aChar, CScanner& aScanner,
|
||||
CToken*&aToken)
|
||||
{
|
||||
PRInt32 theDequeSize=mTokenDeque.GetSize();
|
||||
nsresult result=NS_OK;
|
||||
|
||||
CCalICalendarPropertyValueToken* theToken= (CCalICalendarPropertyValueToken*)
|
||||
gCalTokenRecycler.CreateTokenOfType(eCalICalendarToken_propertyvalue,
|
||||
eCalICalendarTag_unknown, gCalEmpty);
|
||||
|
||||
//aToken=gCalTokenRecycler.CreateTokenOfType(eCalICalendarToken_propertyvalue,
|
||||
// eCalICalendarTag_unknown, gCalEmpty);
|
||||
if(theToken) {
|
||||
result=theToken->Consume(aChar,aScanner);// parse property value (need to handle multiline)
|
||||
//todo: also handle base64 and quoted-printable
|
||||
if (NS_OK!=result) {
|
||||
delete theToken;
|
||||
aToken=0;
|
||||
}
|
||||
else
|
||||
{
|
||||
mTokenDeque.Push(theToken);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsCalICalendarDTD::ConsumePropertyLine(PRUnichar aChar,CScanner& aScanner,CToken*& aToken)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
result = ConsumePropertyNameAndAttributes(aChar, aScanner, aToken);
|
||||
if ((0 != aToken) && (NS_OK == result))
|
||||
{
|
||||
if (eCalICalendarTag_begin != aToken->GetTypeID() && eCalICalendarTag_end != aToken->GetTypeID())
|
||||
{
|
||||
result = ConsumePropertyValue(aChar, aScanner, aToken);
|
||||
if(NS_OK!=result) {
|
||||
delete aToken;
|
||||
aToken=0;
|
||||
}
|
||||
}//if (eCalICalendarTag_begin ...)
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsCalICalendarDTD::ConsumePropertyNameAndAttributes(PRUnichar aChar, CScanner& aScanner,
|
||||
CToken*& aToken)
|
||||
{
|
||||
PRInt32 theDequeSize=mTokenDeque.GetSize();
|
||||
nsresult result=NS_OK;
|
||||
|
||||
aToken=gCalTokenRecycler.CreateTokenOfType(eCalICalendarToken_begin,
|
||||
eCalICalendarTag_unknown, gCalEmpty);
|
||||
|
||||
if(aToken) {
|
||||
// eats BEGIN, but not BEGIN: or BEGIN;
|
||||
result=aToken->Consume(aChar,aScanner); //tell new token to finish consuming text...
|
||||
|
||||
if (eCalICalendarTag_begin != aToken->GetTypeID() && eCalICalendarTag_end != aToken->GetTypeID())
|
||||
{
|
||||
|
||||
if (NS_OK==result) {
|
||||
if (((CCalICalendarBeginToken*)aToken)->IsAttributed()) {
|
||||
result=ConsumeAttributes(aChar,aScanner,(CCalICalendarBeginToken*)aToken);
|
||||
}
|
||||
if (NS_OK!=result) {
|
||||
while(mTokenDeque.GetSize()>theDequeSize) {
|
||||
delete mTokenDeque.PopBack();
|
||||
}
|
||||
}
|
||||
} //if
|
||||
} //if
|
||||
}// if (eCalICalendar_begin ...)
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsCalICalendarDTD::ConsumeWhitespace(PRUnichar aChar,
|
||||
CScanner& aScanner,
|
||||
CToken*& aToken) {
|
||||
aToken=gCalTokenRecycler.CreateTokenOfType(eCalICalendarToken_whitespace,
|
||||
eCalICalendarTag_whitespace,
|
||||
gCalEmpty);
|
||||
nsresult result=NS_OK;
|
||||
if (aToken) {
|
||||
result=aToken->Consume(aChar, aScanner);
|
||||
}
|
||||
return kNoError;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsCalICalendarDTD::ConsumeNewline(PRUnichar aChar,
|
||||
CScanner& aScanner,
|
||||
CToken*& aToken) {
|
||||
aToken=gCalTokenRecycler.CreateTokenOfType(eCalICalendarToken_newline,
|
||||
eCalICalendarTag_newline,
|
||||
gCalEmpty);
|
||||
nsresult result=NS_OK;
|
||||
if (aToken) {
|
||||
result=aToken->Consume(aChar, aScanner);
|
||||
}
|
||||
return kNoError;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsCalICalendarDTD::ConsumeAttributes(PRUnichar aChar,
|
||||
CScanner& aScanner,
|
||||
CCalICalendarBeginToken* aToken) {
|
||||
PRBool done=PR_FALSE;
|
||||
nsresult result=NS_OK;
|
||||
PRInt16 theAttrCount=0;
|
||||
|
||||
while((!done) && (result==NS_OK)) {
|
||||
CCalICalendarAttributeToken* theToken= (CCalICalendarAttributeToken*)
|
||||
gCalTokenRecycler.CreateTokenOfType(eCalICalendarToken_attribute,
|
||||
eCalICalendarTag_unknown,gCalEmpty);
|
||||
if(theToken){
|
||||
// first eat leading semicolon
|
||||
result=aScanner.Peek(aChar);
|
||||
if(aChar=kSemiColon)
|
||||
aScanner.GetChar(aChar);
|
||||
|
||||
result=theToken->Consume(aChar,aScanner); //tell new token to finish consuming text...
|
||||
|
||||
if (NS_OK==result){
|
||||
theAttrCount++;
|
||||
mTokenDeque.Push(theToken);
|
||||
}//if
|
||||
else delete theToken; //we can't keep it..
|
||||
}//if
|
||||
if (NS_OK==result){
|
||||
result=aScanner.Peek(aChar);
|
||||
if(aChar==kColon) {
|
||||
aScanner.GetChar(aChar);
|
||||
done=PR_TRUE;
|
||||
}//if
|
||||
}//if
|
||||
}//while
|
||||
aToken->SetAttributeCount(theAttrCount);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,277 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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.
|
||||
*/
|
||||
|
||||
|
||||
#include "nsCalICalendarParserNode.h"
|
||||
#include "string.h"
|
||||
#include "nsCalICalendarTokens.h"
|
||||
#include "nscalicalendarpars.h"
|
||||
|
||||
const nsAutoString nsCalICalendarCParserNode::mEmptyString("");
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kClassIID, NS_CALICALENDARPARSER_NODE_IID);
|
||||
static NS_DEFINE_IID(kIParserNodeIID, NS_IPARSER_NODE_IID);
|
||||
|
||||
/**
|
||||
* Default constructor
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param aToken -- token to init internal token
|
||||
* @return
|
||||
*/
|
||||
nsCalICalendarCParserNode::nsCalICalendarCParserNode(CCalICalendarToken* aToken,PRInt32 aLineNumber): nsIParserNode() {
|
||||
NS_INIT_REFCNT();
|
||||
mAttributeCount=0;
|
||||
mLineNumber=aLineNumber;
|
||||
mToken=aToken;
|
||||
memset(mAttributes,0,sizeof(mAttributes));
|
||||
mSkippedContent=nsnull;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* default destructor
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
nsCalICalendarCParserNode::~nsCalICalendarCParserNode() {
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF(nsCalICalendarCParserNode)
|
||||
NS_IMPL_RELEASE(nsCalICalendarCParserNode)
|
||||
|
||||
/**
|
||||
* Init
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
|
||||
nsresult nsCalICalendarCParserNode::Init(CCalICalendarToken* aToken,PRInt32 aLineNumber)
|
||||
{
|
||||
mLineNumber=aLineNumber;
|
||||
mToken=aToken;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method gets called as part of our COM-like interfaces.
|
||||
* Its purpose is to create an interface to parser object
|
||||
* of some type.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param nsIID id of object to discover
|
||||
* @param aInstancePtr ptr to newly discovered interface
|
||||
* @return NS_xxx result code
|
||||
*/
|
||||
nsresult nsCalICalendarCParserNode::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
||||
{
|
||||
if (NULL == aInstancePtr) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
if(aIID.Equals(kISupportsIID)) { //do IUnknown...
|
||||
*aInstancePtr = (nsIParserNode*)(this);
|
||||
}
|
||||
else if(aIID.Equals(kIParserNodeIID)) { //do IParser base class...
|
||||
*aInstancePtr = (nsIParserNode*)(this);
|
||||
}
|
||||
else if(aIID.Equals(kClassIID)) { //do this class...
|
||||
*aInstancePtr = (nsCalICalendarCParserNode*)(this);
|
||||
}
|
||||
else {
|
||||
*aInstancePtr=0;
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Causes the given attribute to be added to internal
|
||||
* mAttributes list, and mAttributeCount to be incremented.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param aToken -- token to be added to attr list
|
||||
* @return
|
||||
*/
|
||||
void nsCalICalendarCParserNode::AddAttribute(CCalICalendarToken* aToken) {
|
||||
NS_PRECONDITION(mAttributeCount<PRInt32(sizeof(mAttributes)), "Buffer overrun!");
|
||||
NS_PRECONDITION(0!=aToken, "Error: Token shouldn't be null!");
|
||||
|
||||
if(mAttributeCount<eMaxAttr) {
|
||||
if(aToken) {
|
||||
mAttributes[mAttributeCount++]=aToken;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This method gets called when the parser encounters
|
||||
* skipped content after a start token.
|
||||
*
|
||||
* @update gess 3/26/98
|
||||
* @param aToken -- really a SkippedContent token
|
||||
* @return nada
|
||||
*/
|
||||
void nsCalICalendarCParserNode::SetSkippedContent(CCalICalendarToken* aToken){
|
||||
if(aToken) {
|
||||
NS_ASSERTION(eCalICalendarToken_propertyvalue == aToken->GetTokenType(), "not a skipped content token");
|
||||
mSkippedContent = aToken;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the name of this node. Currently unused.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return string ref containing node name
|
||||
*/
|
||||
const nsString& nsCalICalendarCParserNode::GetName() const {
|
||||
return mEmptyString;
|
||||
// return mName;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get text value of this node, which translates into
|
||||
* getting the text value of the underlying token
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return string ref of text from internal token
|
||||
*/
|
||||
const nsString& nsCalICalendarCParserNode::GetText() const {
|
||||
return mToken->GetStringValueXXX();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get text value of this node, which translates into
|
||||
* getting the text value of the underlying token
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return string ref of text from internal token
|
||||
*/
|
||||
const nsString& nsCalICalendarCParserNode::GetSkippedContent() const {
|
||||
if (nsnull != mSkippedContent) {
|
||||
return ((CCalICalendarPropertyValueToken*)mSkippedContent)->GetStringValueXXX();
|
||||
}
|
||||
return mEmptyString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get node type, meaning, get the tag type of the
|
||||
* underlying token
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return int value that represents tag type
|
||||
*/
|
||||
PRInt32 nsCalICalendarCParserNode::GetNodeType(void) const{
|
||||
return mToken->GetTypeID();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the token type, which corresponds to a value from
|
||||
* eHTMLTokens_xxx.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
PRInt32 nsCalICalendarCParserNode::GetTokenType(void) const{
|
||||
return mToken->GetTokenType();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve the number of attributes on this node
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return int -- representing attribute count
|
||||
*/
|
||||
PRInt32 nsCalICalendarCParserNode::GetAttributeCount(PRBool askToken) const{
|
||||
if(PR_TRUE==askToken)
|
||||
return mToken->GetAttributeCount();
|
||||
return mAttributeCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the string rep of the attribute key at the
|
||||
* given index.
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param anIndex-- offset of attribute to retrieve
|
||||
* @return string rep of given attribute text key
|
||||
*/
|
||||
const nsString& nsCalICalendarCParserNode::GetKeyAt(PRInt32 anIndex) const {
|
||||
if(anIndex<mAttributeCount) {
|
||||
CCalICalendarAttributeToken* tkn=(CCalICalendarAttributeToken*)(mAttributes[anIndex]);
|
||||
return tkn->GetKey();
|
||||
}
|
||||
return mEmptyString;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Retrieve the string rep of the attribute at given offset
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param anIndex-- offset of attribute to retrieve
|
||||
* @return string rep of given attribute text value
|
||||
*/
|
||||
const nsString& nsCalICalendarCParserNode::GetValueAt(PRInt32 anIndex) const {
|
||||
NS_PRECONDITION(anIndex<mAttributeCount, "Bad attr index");
|
||||
if(anIndex<mAttributeCount){
|
||||
return (mAttributes[anIndex])->GetStringValueXXX();
|
||||
}
|
||||
return mEmptyString;
|
||||
}
|
||||
|
||||
PRInt32 nsCalICalendarCParserNode::TranslateToUnicodeStr(nsString& aString) const
|
||||
{
|
||||
/*
|
||||
if (eCalICalendarToken_entity == mToken->GetTokenType()) {
|
||||
return ((CEntityToken*)mToken)->TranslateToUnicodeStr(aString);
|
||||
}
|
||||
*/
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This getter retrieves the line number from the input source where
|
||||
* the token occured. Lines are interpreted as occuring between \n characters.
|
||||
* @update gess7/24/98
|
||||
* @return int containing the line number the token was found on
|
||||
*/
|
||||
PRInt32 nsCalICalendarCParserNode::GetSourceLineNumber(void) const {
|
||||
return mLineNumber;
|
||||
}
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS"
|
||||
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
* the License for the specific language governing rights and limitations
|
||||
* under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
||||
* Netscape Communications Corporation. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/* Do not edit - generated by gentags.pl */
|
||||
#include "nsCRT.h"
|
||||
#include "nsCalICalendarTags.h"
|
||||
|
||||
static char* tagTable[] = {
|
||||
"ACTION", "ATTACH", "ATTENDEE", "BEGIN", "CALSCALE", "CATEGORIES", "CLASS",
|
||||
"COMMENT", "COMPLETED", "CONTACT", "CREATED", "DAYLIGHT", "DESCRIPTION",
|
||||
"DTEND", "DTSTART", "DUE", "DURATION", "END", "EXDATE", "EXRULE",
|
||||
"FREEBUSY", "GEO", "LAST-MODIFIED", "LOCATION", "METHOD", "ORGANIZER",
|
||||
"PERCENT-COMPLETE", "PRIORITY", "PRODID", "RDATE", "RECURRENCE-ID",
|
||||
"RELATED-TO", "REPEAT", "REQUEST-STATUS", "RESOURCES", "RRULE", "SEQUENCE",
|
||||
"STANDARD", "STATUS", "SUMMARY", "TRANSP", "TRIGGER", "TZID", "TZNAME",
|
||||
"TZOFFSETFROM", "TZOFFSETTO", "TZURL", "UID", "URL", "VALARM", "VCALENDAR",
|
||||
"VERSION", "VEVENT", "VFREEBUSY", "VJOURNAL", "VTIMEZONE", "VTODO"
|
||||
};
|
||||
|
||||
nsCalICalendarTag NS_CalICalendarTagToEnum(const char* aTag) {
|
||||
int low = 0;
|
||||
int high = NS_CALICALENDAR_TAG_MAX - 1;
|
||||
while (low <= high) {
|
||||
int middle = (low + high) >> 1;
|
||||
int result = nsCRT::strcasecmp(aTag, tagTable[middle]);
|
||||
if (result == 0)
|
||||
return (nsCalICalendarTag) (middle + 1);
|
||||
if (result < 0)
|
||||
high = middle - 1;
|
||||
else
|
||||
low = middle + 1;
|
||||
}
|
||||
return eCalICalendarTag_userdefined;
|
||||
}
|
||||
|
||||
const char* NS_CalICalendarEnumToTag(nsCalICalendarTag aTagID) {
|
||||
if ((int(aTagID) <= 0) || (int(aTagID) > NS_CALICALENDAR_TAG_MAX)) {
|
||||
return 0;
|
||||
}
|
||||
return tagTable[int(aTagID) - 1];
|
||||
}
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
#include <stdio.h>
|
||||
|
||||
class nsCalICalendarTestTagTable {
|
||||
public:
|
||||
nsCalICalendarTestTagTable() {
|
||||
const char *tag;
|
||||
nsCalICalendarTag id;
|
||||
|
||||
// Make sure we can find everything we are supposed to
|
||||
for (int i = 0; i < NS_CALICALENDAR_TAG_MAX; i++) {
|
||||
tag = tagTable[i];
|
||||
id = NS_CalICalendarTagToEnum(tag);
|
||||
NS_ASSERTION(id != eCalICalendarTag_userdefined, "can't find tag id");
|
||||
const char* check = NS_CalICalendarEnumToTag(id);
|
||||
NS_ASSERTION(check == tag, "can't map id back to tag");
|
||||
}
|
||||
|
||||
// Make sure we don't find things that aren't there
|
||||
id = NS_CalICalendarTagToEnum("@");
|
||||
NS_ASSERTION(id == eCalICalendarTag_userdefined, "found @");
|
||||
id = NS_CalICalendarTagToEnum("zzzzz");
|
||||
NS_ASSERTION(id == eCalICalendarTag_userdefined, "found zzzzz");
|
||||
|
||||
tag = NS_CalICalendarEnumToTag((nsCalICalendarTag) 0);
|
||||
NS_ASSERTION(0 == tag, "found enum 0");
|
||||
tag = NS_CalICalendarEnumToTag((nsCalICalendarTag) -1);
|
||||
NS_ASSERTION(0 == tag, "found enum -1");
|
||||
tag = NS_CalICalendarEnumToTag((nsCalICalendarTag) (NS_CALICALENDAR_TAG_MAX + 1));
|
||||
NS_ASSERTION(0 == tag, "found past max enum");
|
||||
}
|
||||
};
|
||||
nsCalICalendarTestTagTable validateTagTable;
|
||||
#endif
|
||||
|
|
@ -0,0 +1,621 @@
|
|||
/* -*- Mode: C++; tab-width: 2; 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 theg
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <time.h>
|
||||
#include <stdio.h>
|
||||
#include "nsScanner.h"
|
||||
#include "nsToken.h"
|
||||
#include "nsCalICalendarTokens.h"
|
||||
#include "nsParserTypes.h"
|
||||
#include "prtypes.h"
|
||||
#include "nsDebug.h"
|
||||
#include "nsCalICalendarTags.h"
|
||||
//#include "nsCalICalendarEntities.h" // todo: if necessary
|
||||
#include "nsCRT.h"
|
||||
|
||||
static nsString gIdentChars("-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz");
|
||||
static nsString gNewLine("\n\r");
|
||||
static nsAutoString gDigits("0123456789");
|
||||
static nsAutoString gWhitespace("\b\t ");
|
||||
static nsAutoString gDelimeters("\n\r:;");
|
||||
static const char* gUserdefined = "userdefined";
|
||||
static const char* gEmpty = "";
|
||||
|
||||
const PRInt32 kMAXNAMELEN=10;
|
||||
|
||||
CCalICalendarToken::CCalICalendarToken(const nsString& aName, eCalICalendarTags aTag) : CToken(aName) {
|
||||
mTypeID=aTag;
|
||||
}
|
||||
|
||||
CCalICalendarToken::CCalICalendarToken(eCalICalendarTags aTag) : CToken(aTag) {
|
||||
}
|
||||
|
||||
void CCalICalendarToken::SetStringValue(const char* name){
|
||||
if(name) {
|
||||
mTextValue=name;
|
||||
mTypeID = NS_CalICalendarTagToEnum(name);
|
||||
}
|
||||
}
|
||||
|
||||
CCalICalendarIdentifierToken::CCalICalendarIdentifierToken(eCalICalendarTags aTag)
|
||||
: CCalICalendarToken(aTag) {
|
||||
}
|
||||
|
||||
CCalICalendarIdentifierToken::CCalICalendarIdentifierToken(const nsString& aString,
|
||||
eCalICalendarTags aTag)
|
||||
: CCalICalendarToken(aString, aTag) {
|
||||
}
|
||||
|
||||
|
||||
nsresult CCalICalendarIdentifierToken::Consume(PRUnichar aChar, CScanner& aScanner)
|
||||
{
|
||||
mTextValue=aChar;
|
||||
|
||||
nsresult result=aScanner.ReadUntil(mTextValue,gIdentChars,PR_FALSE,PR_FALSE);
|
||||
if (NS_OK==result) {
|
||||
mTextValue.StripChars("\r");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
PRInt32 CCalICalendarIdentifierToken::GetTypeID(){
|
||||
if(eCalICalendarTag_unknown==mTypeID) {
|
||||
nsAutoString tmp(mTextValue);
|
||||
tmp.ToUpperCase();
|
||||
char cbuf[20];
|
||||
tmp.ToCString(cbuf, sizeof(cbuf));
|
||||
mTypeID = NS_CalICalendarTagToEnum(cbuf);
|
||||
}
|
||||
return mTypeID;
|
||||
}
|
||||
|
||||
const char* CCalICalendarIdentifierToken::GetClassName(void) {
|
||||
return "identifier";
|
||||
}
|
||||
|
||||
PRInt32 CCalICalendarIdentifierToken::GetTokenType(void) {
|
||||
return eCalICalendarToken_identifier;
|
||||
}
|
||||
|
||||
void CCalICalendarIdentifierToken::DebugDumpSource(ostream& out) {
|
||||
char buffer[200];
|
||||
mTextValue.ToCString(buffer,sizeof(buffer)-1);
|
||||
out << "<" << buffer;
|
||||
}
|
||||
|
||||
CCalICalendarPropertyValueToken::CCalICalendarPropertyValueToken()
|
||||
: CCalICalendarToken(eCalICalendarTag_unknown) {
|
||||
}
|
||||
|
||||
CCalICalendarPropertyValueToken::CCalICalendarPropertyValueToken(eCalICalendarTags aTag)
|
||||
: CCalICalendarToken(aTag) {
|
||||
}
|
||||
|
||||
CCalICalendarPropertyValueToken::CCalICalendarPropertyValueToken(const nsString& aString,
|
||||
eCalICalendarTags aTag)
|
||||
: CCalICalendarToken(aString, aTag) {
|
||||
}
|
||||
|
||||
|
||||
nsresult CCalICalendarPropertyValueToken::Consume(PRUnichar aChar, CScanner& aScanner)
|
||||
{
|
||||
//mTextValue=aChar;
|
||||
PRUnichar nextChar;
|
||||
PRBool done = PR_FALSE;
|
||||
nsString cString;
|
||||
|
||||
nsresult result=aScanner.ReadUntil(mTextValue,gNewLine,PR_TRUE,PR_FALSE);
|
||||
|
||||
/* Consume the next line if starts with a space */
|
||||
while (!done)
|
||||
{
|
||||
|
||||
/* Consume the '\r\n'. Also handles UNIX where '\r' is line end */
|
||||
aScanner.GetChar(nextChar); // eat next '\r';
|
||||
|
||||
// if next char is '\n' eat it also
|
||||
result = aScanner.Peek(nextChar);
|
||||
if (kNewline == nextChar)
|
||||
aScanner.GetChar(nextChar);
|
||||
|
||||
// handle multi-line property values
|
||||
result = aScanner.Peek(nextChar);
|
||||
if (kSpace==nextChar)
|
||||
{
|
||||
aScanner.GetChar(nextChar); // eat space
|
||||
cString = "";
|
||||
result = aScanner.ReadUntil(cString,gNewLine,PR_TRUE,PR_FALSE);
|
||||
if (NS_OK == result)
|
||||
{
|
||||
mTextValue.Append(cString);
|
||||
}
|
||||
else {
|
||||
// XXX: todo: handle error here.
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
done = PR_TRUE;
|
||||
}
|
||||
}
|
||||
if (NS_OK==result) {
|
||||
mTextValue.StripChars("\r");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
PRInt32 CCalICalendarPropertyValueToken::GetTypeID(){
|
||||
if(eCalICalendarTag_unknown==mTypeID) {
|
||||
nsAutoString tmp(mTextValue);
|
||||
tmp.ToUpperCase();
|
||||
char cbuf[20];
|
||||
tmp.ToCString(cbuf, sizeof(cbuf));
|
||||
mTypeID = NS_CalICalendarTagToEnum(cbuf);
|
||||
}
|
||||
return mTypeID;
|
||||
}
|
||||
|
||||
const char* CCalICalendarPropertyValueToken::GetClassName(void) {
|
||||
return "propertyValue";
|
||||
}
|
||||
|
||||
PRInt32 CCalICalendarPropertyValueToken::GetTokenType(void) {
|
||||
return eCalICalendarToken_propertyvalue;
|
||||
}
|
||||
|
||||
void CCalICalendarPropertyValueToken::DebugDumpSource(ostream& out) {
|
||||
char buffer[200];
|
||||
mTextValue.ToCString(buffer,sizeof(buffer)-1);
|
||||
out << "<" << buffer;
|
||||
}
|
||||
|
||||
CCalICalendarBeginToken::CCalICalendarBeginToken(eCalICalendarTags aTag) :
|
||||
CCalICalendarToken(aTag) {
|
||||
mAttributed=PR_FALSE;
|
||||
mEmpty=PR_FALSE;
|
||||
}
|
||||
|
||||
CCalICalendarBeginToken::CCalICalendarBeginToken(nsString& aString,
|
||||
eCalICalendarTags aTag) :
|
||||
CCalICalendarToken(aString,aTag) {
|
||||
mAttributed=PR_FALSE;
|
||||
mEmpty=PR_FALSE;
|
||||
}
|
||||
|
||||
void CCalICalendarBeginToken::Reinitialize(PRInt32 aTag, const nsString& aString){
|
||||
CToken::Reinitialize(aTag,aString);
|
||||
mAttributed=PR_FALSE;
|
||||
mEmpty=PR_FALSE;
|
||||
}
|
||||
|
||||
|
||||
PRInt32 CCalICalendarBeginToken::GetTypeID(){
|
||||
if(eCalICalendarTag_unknown==mTypeID) {
|
||||
nsAutoString tmp(mTextValue);
|
||||
tmp.ToUpperCase();
|
||||
char cbuf[20];
|
||||
tmp.ToCString(cbuf, sizeof(cbuf));
|
||||
mTypeID = NS_CalICalendarTagToEnum(cbuf);
|
||||
}
|
||||
return mTypeID;
|
||||
}
|
||||
|
||||
const char* CCalICalendarBeginToken::GetClassName(void) {
|
||||
return "begin";
|
||||
}
|
||||
|
||||
PRInt32 CCalICalendarBeginToken::GetTokenType(void) {
|
||||
return eCalICalendarToken_begin;
|
||||
}
|
||||
|
||||
void CCalICalendarBeginToken::SetAttributed(PRBool aValue) {
|
||||
mAttributed=aValue;
|
||||
}
|
||||
|
||||
PRBool CCalICalendarBeginToken::IsAttributed(void) {
|
||||
return mAttributed;
|
||||
}
|
||||
|
||||
void CCalICalendarBeginToken::SetEmpty(PRBool aValue) {
|
||||
mEmpty=aValue;
|
||||
}
|
||||
|
||||
PRBool CCalICalendarBeginToken::IsEmpty(void) {
|
||||
return mEmpty;
|
||||
}
|
||||
|
||||
//todo: this needs to be modified more
|
||||
nsresult CCalICalendarBeginToken::Consume(PRUnichar aChar, CScanner& aScanner) {
|
||||
|
||||
//if you're here, we've need to consume the BEGIN: char, and are
|
||||
//ready to Consume the rest of the open tag identifier.
|
||||
//Stop consuming as soon as you see a space or a '\r\n'.
|
||||
//NOTE: We don't Consume the tag attributes here, nor do we eat the "\r\n"
|
||||
/*
|
||||
nsresult result=NS_OK;
|
||||
aScanner.GetChar(aChar);
|
||||
mTextValue="BEGIN:";
|
||||
if(kMinus==aChar) {
|
||||
mTextValue+="-";
|
||||
*/
|
||||
|
||||
mTextValue=aChar;
|
||||
nsresult result=aScanner.ReadWhile(mTextValue,gIdentChars,PR_TRUE,PR_FALSE);
|
||||
char buffer[300];
|
||||
mTextValue.ToCString(buffer,sizeof(buffer)-1);
|
||||
mTypeID = NS_CalICalendarTagToEnum(buffer);
|
||||
|
||||
//Good. Now, let's skip whitespace after the identifier,
|
||||
//and see if the next char is ">". If so, we have a complete
|
||||
//tag without attributes.
|
||||
if(NS_OK==result) {
|
||||
result=aScanner.SkipWhitespace();
|
||||
if(NS_OK==result) {
|
||||
result=aScanner.GetChar(aChar);
|
||||
if(NS_OK==result) {
|
||||
if(kSemiColon==aChar) { //look for ';'
|
||||
//push that char back, since we apparently have attributes...
|
||||
aScanner.PutBack(aChar);
|
||||
mAttributed=PR_TRUE;
|
||||
} //if
|
||||
} //if
|
||||
}//if
|
||||
}
|
||||
|
||||
// skip "BEGIN" or "END", reset mTextValue to VCALENDAR,VEVENT,etc..
|
||||
if (mTypeID == eCalICalendarTag_begin || mTypeID == eCalICalendarTag_end)
|
||||
{
|
||||
result = aScanner.SkipWhitespace();
|
||||
if (NS_OK == result)
|
||||
{
|
||||
mTextValue="";
|
||||
result = aScanner.ReadWhile(mTextValue,gIdentChars,PR_TRUE,PR_FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
void CCalICalendarBeginToken::DebugDumpSource(ostream& out) {
|
||||
char buffer[200];
|
||||
mTextValue.ToCString(buffer,sizeof(buffer)-1);
|
||||
out << "BEGIN:" << buffer;
|
||||
if(!mAttributed)
|
||||
out << "\r\n";
|
||||
}
|
||||
|
||||
CCalICalendarEndToken::CCalICalendarEndToken(eCalICalendarTags aTag) : CCalICalendarToken(aTag) {
|
||||
}
|
||||
|
||||
CCalICalendarEndToken::CCalICalendarEndToken(const nsString& aName) : CCalICalendarToken(aName) {
|
||||
}
|
||||
|
||||
// todo: revisit
|
||||
nsresult CCalICalendarEndToken::Consume(PRUnichar aChar, CScanner& aScanner) {
|
||||
|
||||
//if you're here, we've already Consumed the "END:" chars, and are
|
||||
//ready to Consume the rest of the open tag identifier.
|
||||
//Stop consuming as soon as you see a space or a '\r\n'.
|
||||
//NOTE: We don't Consume the tag attributes here, nor do we eat the ">"
|
||||
|
||||
mTextValue="";
|
||||
nsresult result=aScanner.ReadUntil(mTextValue,kGreaterThan,PR_FALSE);
|
||||
|
||||
char buffer[300];
|
||||
mTextValue.ToCString(buffer,sizeof(buffer)-1);
|
||||
mTypeID= NS_CalICalendarTagToEnum(buffer);
|
||||
|
||||
if(NS_OK==result)
|
||||
result=aScanner.GetChar(aChar); //eat the closing '>;
|
||||
return result;
|
||||
}
|
||||
|
||||
PRInt32 CCalICalendarEndToken::GetTypeID(){
|
||||
if (eCalICalendarTag_unknown==mTypeID) {
|
||||
nsAutoString tmp(mTextValue);
|
||||
tmp.ToUpperCase();
|
||||
char cbuf[200];
|
||||
tmp.ToCString(cbuf, sizeof(cbuf));
|
||||
mTypeID = NS_CalICalendarTagToEnum(cbuf);
|
||||
}
|
||||
return mTypeID;
|
||||
}
|
||||
|
||||
const char* CCalICalendarEndToken::GetClassName(void) {
|
||||
return "/end";
|
||||
}
|
||||
|
||||
PRInt32 CCalICalendarEndToken::GetTokenType(void) {
|
||||
return eCalICalendarToken_end;
|
||||
}
|
||||
|
||||
void CCalICalendarEndToken::DebugDumpSource(ostream& out) {
|
||||
char buffer[200];
|
||||
mTextValue.ToCString(buffer,sizeof(buffer)-1);
|
||||
out << "END:" << buffer << "\r\n";
|
||||
}
|
||||
|
||||
CCalICalendarTextToken::CCalICalendarTextToken() :
|
||||
CCalICalendarToken(eCalICalendarTag_text) {
|
||||
}
|
||||
|
||||
CCalICalendarTextToken::CCalICalendarTextToken(const nsString& aName) :
|
||||
CCalICalendarToken(aName) {
|
||||
mTypeID=eCalICalendarTag_text;
|
||||
}
|
||||
|
||||
const char* CCalICalendarTextToken::GetClassName(void) {
|
||||
return "text";
|
||||
}
|
||||
|
||||
PRInt32 CCalICalendarTextToken::GetTokenType(void) {
|
||||
return eCalICalendarToken_text;
|
||||
}
|
||||
|
||||
//todo: revisit
|
||||
nsresult CCalICalendarTextToken::Consume(PRUnichar aChar, CScanner& aScanner) {
|
||||
static nsAutoString terminals("&<\r");
|
||||
nsresult result=NS_OK;
|
||||
PRBool done=PR_FALSE;
|
||||
|
||||
while((NS_OK==result) && (!done)) {
|
||||
result=aScanner.ReadUntil(mTextValue,terminals,PR_FALSE,PR_FALSE);
|
||||
if(NS_OK==result) {
|
||||
result=aScanner.Peek(aChar);
|
||||
if(kCR==aChar) {
|
||||
result=aScanner.GetChar(aChar); //strip off the \r
|
||||
result=aScanner.Peek(aChar); //then see what's next.
|
||||
switch(aChar) {
|
||||
case kCR:
|
||||
result=aScanner.GetChar(aChar); //strip off the \r
|
||||
mTextValue.Append("\n\n");
|
||||
break;
|
||||
case kNewLine:
|
||||
//which means we saw \r\n, which becomes \n
|
||||
result=aScanner.GetChar(aChar); //strip off the \n
|
||||
//now fall through on purpose...
|
||||
default:
|
||||
mTextValue.Append("\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
else done=PR_TRUE;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
CCalICalendarNewlineToken::CCalICalendarNewlineToken() : CCalICalendarToken(eCalICalendarTag_newline) {
|
||||
}
|
||||
|
||||
CCalICalendarNewlineToken::CCalICalendarNewlineToken(const nsString& aName) : CCalICalendarToken(aName) {
|
||||
mTypeID=eCalICalendarTag_newline;
|
||||
}
|
||||
|
||||
const char* CCalICalendarNewlineToken::GetClassName(void) {
|
||||
return "CRLF";
|
||||
}
|
||||
|
||||
PRInt32 CCalICalendarNewlineToken::GetTokenType(void) {
|
||||
return eCalICalendarToken_newline;
|
||||
}
|
||||
|
||||
nsString& CCalICalendarNewlineToken::GetStringValueXXX(void) {
|
||||
static nsAutoString theStr("\n");
|
||||
return theStr;
|
||||
}
|
||||
|
||||
nsresult CCalICalendarNewlineToken::Consume(PRUnichar aChar, CScanner& aScanner) {
|
||||
mTextValue=aChar;
|
||||
|
||||
//we already read the \r or \n, let's see what's next!
|
||||
PRUnichar nextChar;
|
||||
nsresult result=aScanner.Peek(nextChar);
|
||||
|
||||
if(NS_OK==result) {
|
||||
switch(aChar) {
|
||||
case kNewLine:
|
||||
if(kCR==nextChar) {
|
||||
result=aScanner.GetChar(nextChar);
|
||||
mTextValue+=nextChar;
|
||||
}
|
||||
break;
|
||||
case kCR:
|
||||
if(kNewLine==nextChar) {
|
||||
result=aScanner.GetChar(nextChar);
|
||||
mTextValue+=nextChar;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
CCalICalendarAttributeToken::CCalICalendarAttributeToken() : CCalICalendarToken(eCalICalendarTag_unknown) {
|
||||
}
|
||||
|
||||
CCalICalendarAttributeToken::CCalICalendarAttributeToken(const nsString& aName) :
|
||||
CCalICalendarToken(aName),
|
||||
mTextKey() {
|
||||
mLastAttribute=PR_FALSE;
|
||||
}
|
||||
|
||||
CCalICalendarAttributeToken::CCalICalendarAttributeToken(const nsString& aKey,
|
||||
const nsString& aName) :
|
||||
CCalICalendarToken(aName) {
|
||||
mTextKey = aKey;
|
||||
mLastAttribute=PR_FALSE;
|
||||
}
|
||||
|
||||
void CCalICalendarAttributeToken::Reinitialize(PRInt32 aTag, const nsString& aString){
|
||||
CCalICalendarToken::Reinitialize(aTag,aString);
|
||||
mTextKey.Truncate();
|
||||
mLastAttribute=PR_FALSE;
|
||||
}
|
||||
|
||||
const char* CCalICalendarAttributeToken::GetClassName(void) {
|
||||
return "attr";
|
||||
}
|
||||
|
||||
PRInt32 CCalICalendarAttributeToken::GetTokenType(void) {
|
||||
return eCalICalendarToken_attribute;
|
||||
}
|
||||
|
||||
void CCalICalendarAttributeToken::DebugDumpToken(ostream& out) {
|
||||
char buffer[200];
|
||||
mTextKey.ToCString(buffer,sizeof(buffer)-1);
|
||||
out << "[" << GetClassName() << "] " << buffer << "=";
|
||||
mTextValue.ToCString(buffer,sizeof(buffer)-1);
|
||||
out << buffer << ": " << mTypeID << endl;
|
||||
}
|
||||
|
||||
PRInt32 CalICalendarConsumeQuotedString(PRUnichar aChar,nsString& aString,CScanner& aScanner){
|
||||
PRInt32 result=kNotFound;
|
||||
switch(aChar) {
|
||||
case kQuote:
|
||||
result=aScanner.ReadUntil(aString,kQuote,PR_TRUE);
|
||||
break;
|
||||
case kApostrophe:
|
||||
result=aScanner.ReadUntil(aString,kApostrophe,PR_TRUE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
PRUnichar ch=aString.Last();
|
||||
if(ch!=aChar)
|
||||
aString+=aChar;
|
||||
return result;
|
||||
}
|
||||
|
||||
// todo: revisit
|
||||
PRInt32 CalICalendarConsumeAttributeValueText(PRUnichar,nsString& aString,CScanner& aScanner){
|
||||
|
||||
PRInt32 result=kNotFound;
|
||||
static nsAutoString terminals(":;");
|
||||
|
||||
result=aScanner.ReadUntil(aString,terminals,PR_FALSE,PR_FALSE);
|
||||
return result;
|
||||
}
|
||||
|
||||
PRInt32 ConsumeAttributeValueText(PRUnichar,nsString& aString,CScanner& aScanner) {
|
||||
PRInt32 result=kNotFound;
|
||||
static nsAutoString terminals(":;");
|
||||
result=aScanner.ReadUntil(aString,terminals,PR_FALSE,PR_FALSE);
|
||||
return result;
|
||||
}
|
||||
|
||||
// todo: revisit
|
||||
nsresult CCalICalendarAttributeToken::Consume(PRUnichar aChar, CScanner& aScanner) {
|
||||
|
||||
aScanner.SkipWhitespace(); //skip leading whitespace
|
||||
nsresult result=aScanner.Peek(aChar);
|
||||
if(NS_OK==result) {
|
||||
static nsAutoString terminals("\b\t\n\r \"=");
|
||||
result=aScanner.ReadUntil(mTextKey,terminals,PR_TRUE,PR_FALSE);
|
||||
|
||||
//now it's time to Consume the (optional) value...
|
||||
if(NS_OK == (result=aScanner.SkipWhitespace())) {
|
||||
//Skip ahead until you find an equal sign or a '>'...
|
||||
if(NS_OK == (result=aScanner.Peek(aChar))) {
|
||||
if(kEqual==aChar){
|
||||
result=aScanner.GetChar(aChar); //skip the equal sign...
|
||||
if(NS_OK==result) {
|
||||
result=aScanner.SkipWhitespace(); //now skip any intervening whitespace
|
||||
if(NS_OK==result) {
|
||||
result=aScanner.GetChar(aChar); //and grab the next char.
|
||||
if(NS_OK==result) {
|
||||
if((kQuote==aChar) || (kApostrophe==aChar)) {
|
||||
mTextValue=aChar;
|
||||
result=CalICalendarConsumeQuotedString(aChar,mTextValue,aScanner);
|
||||
}
|
||||
else {
|
||||
mTextValue=aChar; //it's an alphanum attribute...
|
||||
result=ConsumeAttributeValueText(aChar,mTextValue,aScanner);
|
||||
}
|
||||
}//if
|
||||
if(NS_OK==result)
|
||||
result=aScanner.SkipWhitespace();
|
||||
}//if
|
||||
}//if
|
||||
}//if
|
||||
}//if
|
||||
// }if
|
||||
}
|
||||
if(NS_OK==result) {
|
||||
result=aScanner.Peek(aChar);
|
||||
mLastAttribute= PRBool((kColon==aChar) || (kEOF==result));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void CCalICalendarAttributeToken::DebugDumpSource(ostream& out) {
|
||||
char buffer[200];
|
||||
mTextKey.ToCString(buffer,sizeof(buffer)-1);
|
||||
out << " " << buffer;
|
||||
if(mTextValue.Length()){
|
||||
mTextValue.ToCString(buffer,sizeof(buffer)-1);
|
||||
out << "=" << buffer;
|
||||
}
|
||||
if(mLastAttribute)
|
||||
out<<">";
|
||||
}
|
||||
|
||||
CCalICalendarWhitespaceToken::CCalICalendarWhitespaceToken() :
|
||||
CCalICalendarToken(eCalICalendarTag_whitespace) {
|
||||
}
|
||||
|
||||
CCalICalendarWhitespaceToken::CCalICalendarWhitespaceToken(const nsString& aName) :
|
||||
CCalICalendarToken(aName) {
|
||||
mTypeID=eCalICalendarTag_whitespace;
|
||||
}
|
||||
|
||||
const char* CCalICalendarWhitespaceToken::GetClassName(void) {
|
||||
return "ws";
|
||||
}
|
||||
|
||||
PRInt32 CCalICalendarWhitespaceToken::GetTokenType(void) {
|
||||
return eCalICalendarToken_whitespace;
|
||||
}
|
||||
|
||||
nsresult CCalICalendarWhitespaceToken::Consume(PRUnichar aChar, CScanner& aScanner) {
|
||||
|
||||
mTextValue=aChar;
|
||||
|
||||
nsresult result=aScanner.ReadWhile(mTextValue,gWhitespace,PR_FALSE,PR_FALSE);
|
||||
if(NS_OK==result) {
|
||||
mTextValue.StripChars("\r");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
const char* CalICalendarGetTagName(PRInt32 aTag) {
|
||||
const char* result = NS_CalICalendarEnumToTag((nsCalICalendarTag) aTag);
|
||||
if (0 == result) {
|
||||
if(aTag>=eCalICalendarTag_userdefined)
|
||||
result = gUserdefined;
|
||||
else result= gEmpty;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
@ -0,0 +1,274 @@
|
|||
#! /usr/local/bin/perl
|
||||
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
# the License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is Mozilla Communicator client code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are Copyright (C) 1998
|
||||
# Netscape Communications Corporation. All Rights Reserved.
|
||||
|
||||
######################################################################
|
||||
|
||||
# Table of tag names; it doesn't have to be sorted because code
|
||||
# below will do it. However, for the sake of ease of additions, keep
|
||||
# it sorted so that its easy to tell where to add a new tag and that
|
||||
# the tag hasn't already been added.
|
||||
$i = 0;
|
||||
$tags[$i++] = "action";
|
||||
$tags[$i++] = "attach";
|
||||
$tags[$i++] = "attendee";
|
||||
$tags[$i++] = "begin";
|
||||
$tags[$i++] = "calscale";
|
||||
$tags[$i++] = "categories";
|
||||
$tags[$i++] = "class";
|
||||
$tags[$i++] = "comment";
|
||||
$tags[$i++] = "completed";
|
||||
$tags[$i++] = "contact";
|
||||
$tags[$i++] = "created";
|
||||
$tags[$i++] = "daylight";
|
||||
$tags[$i++] = "description";
|
||||
$tags[$i++] = "dtend";
|
||||
$tags[$i++] = "dtstart";
|
||||
$tags[$i++] = "due";
|
||||
$tags[$i++] = "duration";
|
||||
$tags[$i++] = "end";
|
||||
$tags[$i++] = "exdate";
|
||||
$tags[$i++] = "exrule";
|
||||
$tags[$i++] = "freebusy";
|
||||
$tags[$i++] = "geo";
|
||||
$tags[$i++] = "last_modified";
|
||||
$tags[$i++] = "location";
|
||||
$tags[$i++] = "method";
|
||||
$tags[$i++] = "organizer";
|
||||
$tags[$i++] = "percent_complete";
|
||||
$tags[$i++] = "priority";
|
||||
$tags[$i++] = "prodid";
|
||||
$tags[$i++] = "rdate";
|
||||
$tags[$i++] = "rrule";
|
||||
$tags[$i++] = "recurrence_id";
|
||||
$tags[$i++] = "related_to";
|
||||
$tags[$i++] = "repeat";
|
||||
$tags[$i++] = "request_status";
|
||||
$tags[$i++] = "resources";
|
||||
$tags[$i++] = "sequence";
|
||||
$tags[$i++] = "standard";
|
||||
$tags[$i++] = "status";
|
||||
$tags[$i++] = "summary";
|
||||
$tags[$i++] = "transp";
|
||||
$tags[$i++] = "trigger";
|
||||
$tags[$i++] = "tzid";
|
||||
$tags[$i++] = "tzname";
|
||||
$tags[$i++] = "tzoffsetfrom";
|
||||
$tags[$i++] = "tzoffsetto";
|
||||
$tags[$i++] = "tzurl";
|
||||
$tags[$i++] = "uid";
|
||||
$tags[$i++] = "url";
|
||||
$tags[$i++] = "valarm";
|
||||
$tags[$i++] = "vcalendar";
|
||||
$tags[$i++] = "version";
|
||||
$tags[$i++] = "vevent";
|
||||
$tags[$i++] = "vfreebusy";
|
||||
$tags[$i++] = "vjournal";
|
||||
$tags[$i++] = "vtimezone";
|
||||
$tags[$i++] = "vtodo";
|
||||
|
||||
######################################################################
|
||||
|
||||
# These are not tags; rather they are extra values to place into the
|
||||
# tag enumeration after the normal tags. These do not need to be sorted
|
||||
# and they do not go into the tag table, just into the tag enumeration.
|
||||
$extra = 0;
|
||||
$extra_tags[$extra++] = "text";
|
||||
$extra_tags[$extra++] = "whitespace";
|
||||
$extra_tags[$extra++] = "newline";
|
||||
$extra_tags[$extra++] = "entity";
|
||||
$extra_tags[$extra++] = "userdefined";
|
||||
|
||||
######################################################################
|
||||
|
||||
# Sort the tag table before using it
|
||||
@tags = sort @tags;
|
||||
|
||||
$copyright = "/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the \"License\"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an \"AS IS\"
|
||||
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
* the License for the specific language governing rights and limitations
|
||||
* under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator client code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape Communications
|
||||
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
||||
* Netscape Communications Corporation. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/* Do not edit - generated by gentags.pl */
|
||||
";
|
||||
|
||||
######################################################################
|
||||
|
||||
$file_base = @ARGV[0];
|
||||
|
||||
# Generate the header file first
|
||||
open(HEADER_FILE, ">$file_base.h");
|
||||
|
||||
# Print out copyright and do not edit notice
|
||||
print HEADER_FILE $copyright;
|
||||
print HEADER_FILE "#ifndef " . $file_base . "_h___\n";
|
||||
print HEADER_FILE "#define " . $file_base . "_h___\n";
|
||||
print HEADER_FILE "#include \"nscalicalendarpars.h\"\n";
|
||||
|
||||
# Print out enum's for the tag symbols
|
||||
print HEADER_FILE "enum nsCalICalendarTag {\n";
|
||||
print HEADER_FILE " /* this enum must be first and must be zero */\n";
|
||||
print HEADER_FILE " eCalICalendarTag_unknown=0,\n\n";
|
||||
print HEADER_FILE " /* begin tag enums */\n ";
|
||||
$width = 2;
|
||||
print HEADER_FILE $str;
|
||||
for ($j = 0; $j < $i; $j++) {
|
||||
$lower = $tags[$j];
|
||||
$lower =~ tr/A-Z/a-z/;
|
||||
$str = "eCalICalendarTag_" . $lower . "=" . ($j + 1);
|
||||
$str = $str . ", ";
|
||||
$len = length($str);
|
||||
if ($width + $len > 78) {
|
||||
print HEADER_FILE "\n ";
|
||||
$width = 2;
|
||||
}
|
||||
print HEADER_FILE $str;
|
||||
$width = $width + $len;
|
||||
}
|
||||
print HEADER_FILE "\n\n /* The remaining enums are not for tags */\n ";
|
||||
|
||||
# Print out extra enum's that are not in the tag table
|
||||
$width = 2;
|
||||
for ($k = 0; $k < $extra; $k++) {
|
||||
$lower = $extra_tags[$k];
|
||||
$lower =~ tr/A-Z/a-z/;
|
||||
$str = "eCalICalendarTag_" . $lower . "=" . ($j + $k + 1);
|
||||
if ($k < $extra - 1) {
|
||||
$str = $str . ", ";
|
||||
}
|
||||
$len = length($str);
|
||||
if ($width + $len > 78) {
|
||||
print HEADER_FILE "\n ";
|
||||
$width = 2;
|
||||
}
|
||||
print HEADER_FILE $str;
|
||||
$width = $width + $len;
|
||||
}
|
||||
|
||||
print HEADER_FILE "\n};\n#define NS_CALICALENDAR_TAG_MAX " . $j . "\n\n";
|
||||
print HEADER_FILE "extern NS_CALICALENDARPARS nsCalICalendarTag NS_CalICalendarTagToEnum(const char* aTag);\n";
|
||||
print HEADER_FILE "extern NS_CALICALENDARPARS const char* NS_CalICalendarEnumToTag(nsCalICalendarTag aEnum);\n\n";
|
||||
print HEADER_FILE "#endif /* " . $file_base . "_h___ */\n";
|
||||
close(HEADER_FILE);
|
||||
|
||||
######################################################################
|
||||
|
||||
# Generate the source file
|
||||
open(CPP_FILE, ">$file_base.cpp");
|
||||
print CPP_FILE $copyright;
|
||||
print CPP_FILE "#include \"nsCRT.h\"\n";
|
||||
print CPP_FILE "#include \"$file_base.h\"\n\n";
|
||||
|
||||
# Print out table of tag names
|
||||
print CPP_FILE "static char* tagTable[] = {\n ";
|
||||
$width = 2;
|
||||
for ($j = 0; $j < $i; $j++) {
|
||||
$upper = $tags[$j];
|
||||
$upper =~ tr/a-z/A-Z/;
|
||||
$upper =~ s/_/-/;
|
||||
$str = "\"" . $upper . "\"";
|
||||
if ($j < $i - 1) {
|
||||
$str = $str . ", ";
|
||||
}
|
||||
$len = length($str);
|
||||
if ($width + $len > 78) {
|
||||
print CPP_FILE "\n ";
|
||||
$width = 2;
|
||||
}
|
||||
print CPP_FILE $str;
|
||||
$width = $width + $len;
|
||||
}
|
||||
print CPP_FILE "\n};\n";
|
||||
|
||||
# Finally, dump out the search routine that takes a char* and finds it
|
||||
# in the table.
|
||||
print CPP_FILE "
|
||||
nsCalICalendarTag NS_CalICalendarTagToEnum(const char* aTag) {
|
||||
int low = 0;
|
||||
int high = NS_CALICALENDAR_TAG_MAX - 1;
|
||||
while (low <= high) {
|
||||
int middle = (low + high) >> 1;
|
||||
int result = nsCRT::strcasecmp(aTag, tagTable[middle]);
|
||||
if (result == 0)
|
||||
return (nsCalICalendarTag) (middle + 1);
|
||||
if (result < 0)
|
||||
high = middle - 1;
|
||||
else
|
||||
low = middle + 1;
|
||||
}
|
||||
return eCalICalendarTag_userdefined;
|
||||
}
|
||||
|
||||
const char* NS_CalICalendarEnumToTag(nsCalICalendarTag aTagID) {
|
||||
if ((int(aTagID) <= 0) || (int(aTagID) > NS_CALICALENDAR_TAG_MAX)) {
|
||||
return 0;
|
||||
}
|
||||
return tagTable[int(aTagID) - 1];
|
||||
}
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
#include <stdio.h>
|
||||
|
||||
class nsCalICalendarTestTagTable {
|
||||
public:
|
||||
nsCalICalendarTestTagTable() {
|
||||
const char *tag;
|
||||
nsCalICalendarTag id;
|
||||
|
||||
// Make sure we can find everything we are supposed to
|
||||
for (int i = 0; i < NS_CALICALENDAR_TAG_MAX; i++) {
|
||||
tag = tagTable[i];
|
||||
id = NS_CalICalendarTagToEnum(tag);
|
||||
NS_ASSERTION(id != eCalICalendarTag_userdefined, \"can't find tag id\");
|
||||
const char* check = NS_CalICalendarEnumToTag(id);
|
||||
NS_ASSERTION(check == tag, \"can't map id back to tag\");
|
||||
}
|
||||
|
||||
// Make sure we don't find things that aren't there
|
||||
id = NS_CalICalendarTagToEnum(\"@\");
|
||||
NS_ASSERTION(id == eCalICalendarTag_userdefined, \"found @\");
|
||||
id = NS_CalICalendarTagToEnum(\"zzzzz\");
|
||||
NS_ASSERTION(id == eCalICalendarTag_userdefined, \"found zzzzz\");
|
||||
|
||||
tag = NS_CalICalendarEnumToTag((nsCalICalendarTag) 0);
|
||||
NS_ASSERTION(0 == tag, \"found enum 0\");
|
||||
tag = NS_CalICalendarEnumToTag((nsCalICalendarTag) -1);
|
||||
NS_ASSERTION(0 == tag, \"found enum -1\");
|
||||
tag = NS_CalICalendarEnumToTag((nsCalICalendarTag) (NS_CALICALENDAR_TAG_MAX + 1));
|
||||
NS_ASSERTION(0 == tag, \"found past max enum\");
|
||||
}
|
||||
};
|
||||
nsCalICalendarTestTagTable validateTagTable;
|
||||
#endif
|
||||
|
||||
";
|
||||
|
||||
close(CPP_FILE);
|
Загрузка…
Ссылка в новой задаче