Updated ContentSink to use newer LoadURL API.

This commit is contained in:
jsun%netscape.com 1998-11-06 19:20:45 +00:00
Родитель 4d74918979
Коммит 5b03cdb5a4
4 изменённых файлов: 315 добавлений и 17 удалений

Просмотреть файл

@ -29,9 +29,13 @@
#include "nsCalICalendarDTD.h" #include "nsCalICalendarDTD.h"
#include "nsICalICalendarParserObject.h" #include "nsICalICalendarParserObject.h"
#include "nsICalICalendarContentSink.h" #include "nsICalICalendarContentSink.h"
#include "nsIXPFCICalContentSink.h"
#include "nsIXPFCContentSink.h"
//#include "nsCalICalendarParserCIID.h" //#include "nsCalICalendarParserCIID.h"
class nsCalICalendarContentSink : public nsICalICalendarContentSink, class nsCalICalendarContentSink : public nsICalICalendarContentSink,
public nsIXPFCICalContentSink,
public nsIXPFCContentSink,
public nsIContentSink public nsIContentSink
{ {
public: public:
@ -43,7 +47,7 @@ public:
//nsICalICalendarContentSink //nsICalICalendarContentSink
NS_IMETHOD Init(); NS_IMETHOD Init();
NS_IMETHOD SetViewerContainer(nsIWebViewerContainer * aViewerContainer); /*NS_IMETHOD SetViewerContainer(nsIWebViewerContainer * aViewerContainer);*/
//nsIContentSink //nsIContentSink
NS_IMETHOD OpenContainer(const nsIParserNode& aNode); NS_IMETHOD OpenContainer(const nsIParserNode& aNode);
@ -62,6 +66,10 @@ private:
public: public:
NS_IMETHOD_(PRBool) IsContainer(const nsIParserNode& aNode); NS_IMETHOD_(PRBool) IsContainer(const nsIParserNode& aNode);
NS_IMETHOD SetViewerContainer(nsIWebViewerContainer * aViewerContainer);
NS_IMETHOD SetContentSinkContainer(nsISupports * aContentSinkContainer);
NS_IMETHOD SetCalendarList(nsIArray * aCalendarList);
private: private:
nsIWebViewerContainer * mViewerContainer ; nsIWebViewerContainer * mViewerContainer ;
@ -70,6 +78,7 @@ private:
nsIArray * mContainerList ; nsIArray * mContainerList ;
PRUint32 mState; PRUint32 mState;
nsIArray * mCalendarList;
}; };

Просмотреть файл

@ -33,7 +33,7 @@ class nsICalICalendarContentSink : public nsISupports
public: public:
NS_IMETHOD Init() = 0 ; NS_IMETHOD Init() = 0 ;
NS_IMETHOD SetViewerContainer(nsIWebViewerContainer * aViewerContainer) = 0; /*NS_IMETHOD SetViewerContainer(nsIWebViewerContainer * aViewerContainer) = 0; */
}; };

Просмотреть файл

@ -16,8 +16,17 @@
* Reserved. * Reserved.
*/ */
#include "jdefines.h"
#include "nsCalICalendarContentSink.h" #include "nsCalICalendarContentSink.h"
#include "nscalcoreicalCIID.h" #include "nscalcoreicalCIID.h"
#include "nsICalendar.h"
#include "nsICalProperty.h"
#include "nsICalICalendarContainer.h"
#include "nsICalTimeBasedEvent.h"
#include "nsICalVEvent.h"
#include "nsIXPFCICalContentSink.h"
#include "nsxpfcCIID.h"
//#include "nsCalICalendarTokens.h" //#include "nsCalICalendarTokens.h"
//#include "nsCalICalendarDTD.h" //#include "nsCalICalendarDTD.h"
//#include "nsCalICalendarParserCIID.h" //#include "nsCalICalendarParserCIID.h"
@ -39,22 +48,77 @@ static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIContentSinkIID, NS_ICONTENT_SINK_IID); static NS_DEFINE_IID(kIContentSinkIID, NS_ICONTENT_SINK_IID);
static NS_DEFINE_IID(kICalICalendarContentSinkIID, NS_ICALICALENDAR_CONTENT_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(kICalICalendarParserObjectIID, NS_ICALICALENDAR_PARSER_OBJECT_IID);
static NS_DEFINE_IID(kICalICalendarContainerIID, NS_ICALICALENDARCONTAINER_IID);
static NS_DEFINE_IID(kCCalICalendarVCalendarCID, NS_CALICALENDARVCALENDAR_CID); static NS_DEFINE_IID(kCCalICalendarVCalendarCID, NS_CALICALENDARVCALENDAR_CID);
//static NS_DEFINE_IID(kCCalICalendarVCalendarCID, NS_ICALENDAR_CID);
static NS_DEFINE_IID(kCCalICalendarVEventCID, NS_CALICALENDARVEVENT_CID); static NS_DEFINE_IID(kCCalICalendarVEventCID, NS_CALICALENDARVEVENT_CID);
static NS_DEFINE_IID(kCCalICalendarVTodoCID, NS_CALICALENDARVTODO_CID); static NS_DEFINE_IID(kCCalICalendarVTodoCID, NS_CALICALENDARVTODO_CID);
static NS_DEFINE_IID(kCCalICalendarVJournalCID, NS_CALICALENDARVJOURNAL_CID); static NS_DEFINE_IID(kCCalICalendarVJournalCID, NS_CALICALENDARVJOURNAL_CID);
static NS_DEFINE_IID(kCCalICalendarVFreebusyCID, NS_CALICALENDARVFREEBUSY_CID); static NS_DEFINE_IID(kCCalICalendarVFreebusyCID, NS_CALICALENDARVFREEBUSY_CID);
static NS_DEFINE_IID(kCCalICalendarVTimeZoneCID, NS_CALICALENDARVTIMEZONE_CID); static NS_DEFINE_IID(kCCalICalendarVTimeZoneCID, NS_CALICALENDARVTIMEZONE_CID);
static NS_DEFINE_IID(kCCalICalendarVAlarmCID, NS_CALICALENDARVALARM_CID); static NS_DEFINE_IID(kCCalICalendarVAlarmCID, NS_CALICALENDARVALARM_CID);
static NS_DEFINE_IID(kICalendarIID, NS_ICALENDAR_IID);
static NS_DEFINE_IID(kICalTimeBasedEventIID, NS_ICALTIMEBASEDEVENT_IID);
static NS_DEFINE_IID(kCCalVEventCID, NS_CALICALENDARVEVENT_CID);
static NS_DEFINE_IID(kICalPropertyIID, NS_ICALPROPERTY_IID);
static NS_DEFINE_IID(kCCalStringPropertyCID, NS_CALSTRINGPROPERTY_CID);
static NS_DEFINE_IID(kCCalDateTimePropertyCID, NS_CALDATETIMEPROPERTY_CID);
static NS_DEFINE_IID(kCCalIntegerPropertyCID, NS_CALINTEGERPROPERTY_CID);
static NS_DEFINE_IID(kICalXPFCICalContentSinkIID, NS_IXPFC_ICAL_CONTENT_SINK_IID);
static NS_DEFINE_IID(kIXPFCContentSinkIID, NS_IXPFC_CONTENT_SINK_IID);
//static NS_DEFINE_IID(kCXPFCObserverManagerCID, NS_XPFC_OBSERVERMANAGER_CID);
//static NS_DEFINE_IID(kIXPFCObserverManagerIID, NS_IXPFC_OBSERVERMANAGER_IID);
nsCalICalendarContentSink::nsCalICalendarContentSink()
{
NS_INIT_REFCNT();
static NS_DEFINE_IID(kCStackCID, NS_STACK_CID);
nsresult res = nsRepository::CreateInstance(kCStackCID, nsnull,
kCStackCID, (void **) &mXPFCStack);
if (NS_OK != res)
return;
mXPFCStack->Init();
mCalendarList = nsnull;
#if 0
static NS_DEFINE_IID(kCArrayCID, NS_ARRAY_CID);
#ifdef NS_WIN32
#define XPFC_DLL "xpfc10.dll"
#else
#define XPFC_DLL "libxpfc10.so"
#endif
static NS_DEFINE_IID(kCArrayIteratorCID, NS_ARRAY_ITERATOR_CID);
nsRepository::RegisterFactory(kCArrayCID, XPFC_DLL, PR_FALSE, PR_FALSE);
nsRepository::RegisterFactory(kCArrayIteratorCID, XPFC_DLL, PR_FALSE, PR_FALSE);
if (nsnull == mCalendarList)
{
res = nsRepository::CreateInstance(kCArrayCID, nsnull,
kCArrayCID, (void **)&mCalendarList);
if (NS_OK == res)
{
mCalendarList->Init();
}
}
#endif
nsCalICalendarContentSink::nsCalICalendarContentSink() {
} }
nsCalICalendarContentSink::~nsCalICalendarContentSink() { nsCalICalendarContentSink::~nsCalICalendarContentSink() {
NS_IF_RELEASE(mCalendarList);
} }
NS_IMETHODIMP nsCalICalendarContentSink::Init() { NS_IMETHODIMP nsCalICalendarContentSink::Init()
{
nsresult res;
return NS_OK; return NS_OK;
} }
@ -69,9 +133,15 @@ nsresult nsCalICalendarContentSink::QueryInterface(const nsIID& aIID, void** aIn
else if (aIID.Equals(kIContentSinkIID)) { else if (aIID.Equals(kIContentSinkIID)) {
*aInstancePtr = (nsIContentSink*)(this); *aInstancePtr = (nsIContentSink*)(this);
} }
else if (aIID.Equals(kIXPFCContentSinkIID)) {
*aInstancePtr = (nsIXPFCContentSink*)(this);
}
else if (aIID.Equals(kICalICalendarContentSinkIID)) { else if (aIID.Equals(kICalICalendarContentSinkIID)) {
*aInstancePtr = (nsICalICalendarContentSink*)(this); *aInstancePtr = (nsICalICalendarContentSink*)(this);
} }
else if (aIID.Equals(kICalXPFCICalContentSinkIID)) {
*aInstancePtr = (nsIXPFCICalContentSink*)(this);
}
else { else {
*aInstancePtr=0; *aInstancePtr=0;
return NS_NOINTERFACE; return NS_NOINTERFACE;
@ -83,11 +153,13 @@ nsresult nsCalICalendarContentSink::QueryInterface(const nsIID& aIID, void** aIn
NS_IMPL_ADDREF(nsCalICalendarContentSink); NS_IMPL_ADDREF(nsCalICalendarContentSink);
NS_IMPL_RELEASE(nsCalICalendarContentSink); NS_IMPL_RELEASE(nsCalICalendarContentSink);
/*
nsresult nsCalICalendarContentSink::SetViewerContainer(nsIWebViewerContainer * aViewerContainer) nsresult nsCalICalendarContentSink::SetViewerContainer(nsIWebViewerContainer * aViewerContainer)
{ {
mViewerContainer = aViewerContainer; mViewerContainer = aViewerContainer;
return NS_OK; return NS_OK;
} }
*/
NS_IMETHODIMP nsCalICalendarContentSink::OpenContainer(const nsIParserNode& aNode) NS_IMETHODIMP nsCalICalendarContentSink::OpenContainer(const nsIParserNode& aNode)
{ {
@ -102,14 +174,15 @@ NS_IMETHODIMP nsCalICalendarContentSink::OpenContainer(const nsIParserNode& aNod
if (NS_OK != res) if (NS_OK != res)
return res; return res;
res = nsRepository::CreateInstance(aclass, nsnull, kICalICalendarParserObjectIID, res = nsRepository::CreateInstance(aclass, nsnull,
(void **) &object); kICalICalendarParserObjectIID,
(void **)&object);
if (NS_OK != res) if (NS_OK != res)
return res; return res;
AddToHierarchy(*object, PR_TRUE); AddToHierarchy(*object, PR_TRUE);
object->Init(); object->Init();
ConsumeAttributes(aNode,*object); ConsumeAttributes(aNode,*object);
// todo: finish // todo: finish
return NS_OK; return NS_OK;
@ -117,17 +190,53 @@ NS_IMETHODIMP nsCalICalendarContentSink::OpenContainer(const nsIParserNode& aNod
NS_IMETHODIMP nsCalICalendarContentSink::CloseContainer(const nsIParserNode& aNode) NS_IMETHODIMP nsCalICalendarContentSink::CloseContainer(const nsIParserNode& aNode)
{ {
//nsISupports * container = (nsISupports *)mXPFCStack->Pop();
// todo: finish nsISupports * container = (nsISupports *)mXPFCStack->Pop();
//NS_IF_RELEASE(container); nsISupports * parent = (nsISupports *) mXPFCStack->Top();
nsresult res = NS_OK;
nsICalendar * cal = nsnull;
nsICalVEvent * event = nsnull;
if (parent != nsnull && container != nsnull)
{
// todo: use ICalComponent instead
res = container->QueryInterface(kCCalVEventCID, (void **) &event);
if (NS_OK == res)
{
res = parent->QueryInterface(kICalendarIID, (void **) & cal);
if (NS_OK == res)
{
if (event->IsValid())
cal->AddEvent(event);
}
//NS_RELEASE(cal);
}
NS_RELEASE(event);
}
else if (parent == nsnull && container != nsnull)
{
// todo: finish
res = container->QueryInterface(kICalendarIID, (void **) &cal);
if (NS_OK == res)
{
if (nsnull != mCalendarList)
{
mCalendarList->Append(cal);
NS_ADDREF(cal);
}
}
}
NS_IF_RELEASE(container);
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP nsCalICalendarContentSink::AddLeaf(const nsIParserNode& aNode) NS_IMETHODIMP nsCalICalendarContentSink::AddLeaf(const nsIParserNode& aNode)
{ {
nsICalICalendarParserObject * object = nsnull; nsICalICalendarParserObject * object = nsnull;
nsICalICalendarContainer * container = nsnull;
eCalICalendarTags tag = (eCalICalendarTags) aNode.GetNodeType(); eCalICalendarTags tag = (eCalICalendarTags) aNode.GetNodeType();
nsresult res; nsresult res;
nsCID aclass; nsCID aclass;
@ -138,15 +247,33 @@ NS_IMETHODIMP nsCalICalendarContentSink::AddLeaf(const nsIParserNode& aNode)
nsnull, nsnull,
kICalICalendarParserObjectIID, kICalICalendarParserObjectIID,
(void **)&object); (void **)&object);
if (NS_OK != res) if (NS_OK == res)
return res; {
nsICalICalendarContainer * parent = (nsICalICalendarContainer *) mXPFCStack->Top();
if (nsnull != parent)
{
res = parent->QueryInterface(kICalICalendarContainerIID, (void **) &container);
nsICalProperty * sp = nsnull;
if (res == NS_OK)
{
// it's a container
res = object->QueryInterface(kICalPropertyIID, (void **) &sp);
if (res == NS_OK)
container->StoreProperty(tag, sp, 0);
//NS_RELEASE(sp);
}
}
}
#if 0
AddToHierarchy(*object, PR_FALSE); AddToHierarchy(*object, PR_FALSE);
object->Init(); object->Init();
ConsumeAttributes(aNode, *object); ConsumeAttributes(aNode, *object);
#endif
//ConsumePropertyValues(aNode, *object); //ConsumePropertyValues(aNode, *object);
return NS_OK; return NS_OK;
@ -159,6 +286,36 @@ NS_IMETHODIMP nsCalICalendarContentSink::WillBuildModel(void)
NS_IMETHODIMP nsCalICalendarContentSink::DidBuildModel(PRInt32 aQualityLevel) NS_IMETHODIMP nsCalICalendarContentSink::DidBuildModel(PRInt32 aQualityLevel)
{ {
#if 0
static NS_DEFINE_IID(kXPFCSubjectIID, NS_IXPFC_SUBJECT_IID);
static NS_DEFINE_IID(kXPFCObserverIID, NS_IXPFC_OBSERVER_IID);
nsIIterator * iterator;
mCalendarList->CreateIterator(&iterator);
iterator->Init();
nsCalendar * item;
nsICalendar * cal;
nsICalendar * cal2;
nsIXPFCSubject * subject;
nsIXPFCSubject * subject2;
nsIXPFCObserver * observer;
nsIXPFCObserver * observer2;
nsIXPFCObserverManager * om;
nsServiceManager::GetService(kCXPFCObserverManagerCID, kIXPFCObserverManagerIID, (nsISupports**)&om);
while (!(iterator->IsDone()))
{
item = (nsCalendar *) iterator->CurrentItem();
}
#endif
return NS_OK; return NS_OK;
} }
@ -209,6 +366,30 @@ NS_IMETHODIMP nsCalICalendarContentSink::CIDFromTag(eCalICalendarTags tag, nsCID
aClass = kCCalICalendarVAlarmCID; aClass = kCCalICalendarVAlarmCID;
break; break;
case eCalICalendarTag_dtstart:
case eCalICalendarTag_dtstamp:
case eCalICalendarTag_dtend:
case eCalICalendarTag_created:
case eCalICalendarTag_last_modified:
aClass = kCCalDateTimePropertyCID;
break;
case eCalICalendarTag_summary:
case eCalICalendarTag_calscale:
case eCalICalendarTag_method:
case eCalICalendarTag_version:
case eCalICalendarTag_status:
case eCalICalendarTag_description:
case eCalICalendarTag_transp:
case eCalICalendarTag_location:
aClass = kCCalStringPropertyCID;
break;
case eCalICalendarTag_sequence:
case eCalICalendarTag_priority:
aClass = kCCalIntegerPropertyCID;
break;
default: default:
return (NS_ERROR_UNEXPECTED); return (NS_ERROR_UNEXPECTED);
break; break;
@ -273,7 +454,88 @@ NS_IMETHODIMP nsCalICalendarContentSink::ConsumePropertyValues(const nsIParserNo
NS_IMETHODIMP nsCalICalendarContentSink::AddToHierarchy(nsICalICalendarParserObject& aObject, NS_IMETHODIMP nsCalICalendarContentSink::AddToHierarchy(nsICalICalendarParserObject& aObject,
PRBool aPush) PRBool aPush)
{ {
nsICalICalendarContainer * parent = (nsICalICalendarContainer *) mXPFCStack->Top();
nsICalICalendarContainer * containerToPush = nsnull;
nsresult res = aObject.QueryInterface(kICalICalendarContainerIID, (void **) &containerToPush);
if (res == NS_OK)
{
if (aPush == PR_TRUE)
mXPFCStack->Push(containerToPush);
return NS_OK;
}
return NS_OK; return NS_OK;
/*
nsICalICalendarContainer * parent = (nsICalICalendarContainer *) mXPFCStack->Top();
nsICalICalendarContainer * containerToPush = nsnull;
nsresult res = aObject.QueryInterface(kICalICalendarContainerIID, (void **) &containerToPush);
if (NS_OK != res)
return res;
if (parent == nsnull)
{
//if (aPush == PR_TRUE)
// mXPFCStack->Push(containerToPush);
}
else
{
nsICalICalendarContainer * container = nsnull;
res = parent->QueryInterface(kICalendarIID, (void **) &container);
if (res == NS_OK)
{
// it's a calendar
res = aObject.QueryInterface(kIParserNodeIID, (void **) &containerToPush);
if (res == NS_OK)
{
}
eCalICalendarTags tag = (eCalICalendarTags) aObject.GetNodeType();
res = container->QueryInterface(kICalendar
switch (tag)
{
case eCalICalendarTags_vevent:
parent->AddVEvent(container);
case eCalICalendarTags_version:
parennt->SetVersion(container);
}
res = aObject.QueryInterface(kICalICalendarVEventIID, (void **)&container);
if (res == NS_OK)
parent->AddVEvent(container);
}
//if (aPush == PR_TRUE)
// mXPFCStack->Push(containerToPush);
}
if (mState == CALICALENDAR_PARSING_VCALENDAR)
{
nsICalendar * container = nsnull;
nsICalendar * parent = nsnull;
nsresult res = aObject.QueryInterface(kCCalendarIID, (void **) &container);
parent = (nsICalendar *) mXPFCStack->Top();
if (parent == nsnull)
{
if (aPush == PR_TRUE)
mXPFCStack->Push(container);
}
else
{
}
}
return NS_OK;
*/
} }
PRBool nsCalICalendarContentSink::IsContainer(const nsIParserNode& aNode) PRBool nsCalICalendarContentSink::IsContainer(const nsIParserNode& aNode)
@ -292,3 +554,31 @@ PRBool nsCalICalendarContentSink::IsContainer(const nsIParserNode& aNode)
return container; return container;
} }
nsresult nsCalICalendarContentSink::SetContentSinkContainer(nsISupports *
aContentSinkContainer)
{
nsresult res;
nsIArray * array;
static NS_DEFINE_IID(kCArrayCID, NS_ARRAY_CID);
res = aContentSinkContainer->QueryInterface(kCArrayCID, (void **)&array);
if (NS_OK == res)
{
res = SetCalendarList(array);
NS_RELEASE(array);
}
return res;
}
nsresult nsCalICalendarContentSink::SetViewerContainer(nsIWebViewerContainer * aViewerContainer)
{
mViewerContainer = aViewerContainer;
return NS_OK;
}
nsresult nsCalICalendarContentSink::SetCalendarList(nsIArray * aCalendarList)
{
mCalendarList = aCalendarList;
NS_ADDREF(aCalendarList);
return NS_OK;
}

Просмотреть файл

@ -373,8 +373,7 @@ nsresult nsCalICalendarDTD::HandleBeginToken(CToken* aToken)
case eCalICalendarTag_vtimezone: case eCalICalendarTag_vtimezone:
{ {
// todo: xxx: close any already open containers; // todo: xxx: close any already open containers;
if (eCalICalendarTag_begin == aToken->GetTypeID()) mSink->OpenContainer(*attrNode);
mSink->OpenContainer(*attrNode);
} }
break; break;