office-gobmx/framework/source/jobs/joburl.cxx
2008-10-14 05:23:43 +00:00

660 lines
24 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: joburl.cxx,v $
* $Revision: 1.6.82.1 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_framework.hxx"
//________________________________
// my own includes
#include <jobs/joburl.hxx>
#include <threadhelp/readguard.hxx>
#include <threadhelp/writeguard.hxx>
#include <general.h>
//________________________________
// interface includes
//________________________________
// includes of other projects
#include <rtl/ustrbuf.hxx>
#include <vcl/svapp.hxx>
//________________________________
// namespace
namespace framework{
//________________________________
// non exported const
//________________________________
// non exported definitions
//________________________________
// declarations
//________________________________
/**
@short special ctor
@descr It initialize this new instance with a (hopyfully) valid job URL.
This URL will be parsed. After that we set our members right,
so other interface methods of this class can be used to get
all items of this URL. Of course it will be possible to know,
if this URL was valid too.
@param sURL
the job URL for parsing
*/
JobURL::JobURL( /*IN*/ const ::rtl::OUString& sURL )
: ThreadHelpBase( &Application::GetSolarMutex() )
{
#ifdef ENABLE_COMPONENT_SELF_CHECK
JobURL::impldbg_checkIt();
#endif
m_eRequest = E_UNKNOWN;
// syntax: vnd.sun.star.job:{[event=<name>],[alias=<name>],[service=<name>]}
// check for "vnd.sun.star.job:"
if (sURL.matchIgnoreAsciiCaseAsciiL(JOBURL_PROTOCOL_STR,JOBURL_PROTOCOL_LEN,0))
{
sal_Int32 t = JOBURL_PROTOCOL_LEN;
do
{
// seperate all token of "{[event=<name>],[alias=<name>],[service=<name>]}"
::rtl::OUString sToken = sURL.getToken(0, JOBURL_PART_SEPERATOR, t);
::rtl::OUString sPartValue ;
::rtl::OUString sPartArguments;
// check for "event="
if (
(JobURL::implst_split(sToken,JOBURL_EVENT_STR,JOBURL_EVENT_LEN,sPartValue,sPartArguments)) &&
(sPartValue.getLength()>0 )
)
{
// set the part value
m_sEvent = sPartValue ;
m_sEventArgs = sPartArguments;
m_eRequest |= E_EVENT ;
}
else
// check for "alias="
if (
(JobURL::implst_split(sToken,JOBURL_ALIAS_STR,JOBURL_ALIAS_LEN,sPartValue,sPartArguments)) &&
(sPartValue.getLength()>0 )
)
{
// set the part value
m_sAlias = sPartValue ;
m_sAliasArgs = sPartArguments;
m_eRequest |= E_ALIAS ;
}
else
// check for "service="
if (
(JobURL::implst_split(sToken,JOBURL_SERVICE_STR,JOBURL_SERVICE_LEN,sPartValue,sPartArguments)) &&
(sPartValue.getLength()>0 )
)
{
// set the part value
m_sService = sPartValue ;
m_sServiceArgs = sPartArguments;
m_eRequest |= E_SERVICE ;
}
}
while(t!=-1);
}
}
//________________________________
/**
@short knows, if this job URL object hold a valid URL inside
@return <TRUE/> if it represent a valid job URL.
*/
sal_Bool JobURL::isValid() const
{
/* SAFE { */
ReadGuard aReadLock(m_aLock);
return (m_eRequest!=E_UNKNOWN);
}
//________________________________
/**
@short get the event item of this job URL
@descr Because the three possible parts of such URL (event, alias, service)
can't be combined, this method can(!) return a valid value - but it's
not a must. Thats why the return value must be used too, to detect a missing
event value.
@param sEvent
returns the possible existing event value
e.g. "vnd.sun.star.job:event=myEvent" returns "myEvent"
@return <TRUE/> if an event part of the job URL exist and the out parameter
sEvent was filled.
@attention The out parameter will be reseted everytime. Don't use it if method returns <FALSE/>!
*/
sal_Bool JobURL::getEvent( /*OUT*/ ::rtl::OUString& sEvent ) const
{
/* SAFE { */
ReadGuard aReadLock(m_aLock);
sEvent = ::rtl::OUString();
sal_Bool bSet = ((m_eRequest & E_EVENT) == E_EVENT);
if (bSet)
sEvent = m_sEvent;
aReadLock.unlock();
/* } SAFE */
return bSet;
}
//________________________________
/**
@short get the alias item of this job URL
@descr Because the three possible parts of such URL (event, alias, service)
can't be combined, this method can(!) return a valid value - but it's
not a must. Thats why the return value must be used too, to detect a missing
alias value.
@param sAlias
returns the possible existing alias value
e.g. "vnd.sun.star.job:alias=myAlias" returns "myAlias"
@return <TRUE/> if an alias part of the job URL exist and the out parameter
sAlias was filled.
@attention The out parameter will be reseted everytime. Don't use it if method returns <FALSE/>!
*/
sal_Bool JobURL::getAlias( /*OUT*/ ::rtl::OUString& sAlias ) const
{
/* SAFE { */
ReadGuard aReadLock(m_aLock);
sAlias = ::rtl::OUString();
sal_Bool bSet = ((m_eRequest & E_ALIAS) == E_ALIAS);
if (bSet)
sAlias = m_sAlias;
aReadLock.unlock();
/* } SAFE */
return bSet;
}
//________________________________
/**
@short get the service item of this job URL
@descr Because the three possible parts of such URL (event, service, service)
can't be combined, this method can(!) return a valid value - but it's
not a must. Thats why the return value must be used too, to detect a missing
service value.
@param sAlias
returns the possible existing service value
e.g. "vnd.sun.star.job:service=com.sun.star.Service" returns "com.sun.star.Service"
@return <TRUE/> if an service part of the job URL exist and the out parameter
sService was filled.
@attention The out parameter will be reseted everytime. Don't use it if method returns <FALSE/>!
*/
sal_Bool JobURL::getService( /*OUT*/ ::rtl::OUString& sService ) const
{
/* SAFE { */
ReadGuard aReadLock(m_aLock);
sService = ::rtl::OUString();
sal_Bool bSet = ((m_eRequest & E_SERVICE) == E_SERVICE);
if (bSet)
sService = m_sService;
aReadLock.unlock();
/* } SAFE */
return bSet;
}
//________________________________
/**
@short searches for a special identifier in the given string and split it
@descr If the given identifier could be found at the beginning of the given string,
this method split it into different parts and return it.
Following schema is used: <partidentifier>=<partvalue>[?<partarguments>]
@param sPart
the string, which should be analyzed
@param pPartIdentifier
the part identifier value, which must be found at the beginning of the
parameter <var>sPart</var>
@param nPartLength
the length of the ascii value <var>pPartIdentifier</var>
@param rPartValue
returns the part value if <var>sPart</var> was splitted successfully
@param rPartArguments
returns the part arguments if <var>sPart</var> was splitted successfully
@return <TRUE/> if the identifier could be found and the string was splitted.
<FALSE/> otherwhise.
*/
sal_Bool JobURL::implst_split( /*IN*/ const ::rtl::OUString& sPart ,
/*IN*/ const sal_Char* pPartIdentifier ,
/*IN*/ sal_Int32 nPartLength ,
/*OUT*/ ::rtl::OUString& rPartValue ,
/*OUT*/ ::rtl::OUString& rPartArguments )
{
// first search for the given identifier
sal_Bool bPartFound = (sPart.matchIgnoreAsciiCaseAsciiL(pPartIdentifier,nPartLength,0));
// If it exist - we can split the part and return TRUE.
// Otherwhise we do nothing and return FALSE.
if (bPartFound)
{
// But may the part has optional arguments - seperated by a "?".
// Do so - we set the return value with the whole part string.
// Arguments will be set to an empty string as default.
// If we detect the right sign - we split the arguments and overwrite the default.
::rtl::OUString sValueAndArguments = sPart.copy(nPartLength);
::rtl::OUString sValue = sValueAndArguments ;
::rtl::OUString sArguments;
sal_Int32 nArgStart = sValueAndArguments.indexOf('?',0);
if (nArgStart!=-1)
{
sValue = sValueAndArguments.copy(0,nArgStart);
++nArgStart; // ignore '?'!
sArguments = sValueAndArguments.copy(nArgStart);
}
rPartValue = sValue ;
rPartArguments = sArguments;
}
return bPartFound;
}
//________________________________
/**
@short special debug method
@descr It's the entry point method to start a self component check for this class.
It's used for internal purposes only and never a part of a legal product.
Use it for testing and debug only!
*/
#ifdef ENABLE_COMPONENT_SELF_CHECK
#define LOGFILE_JOBURL "joburl.log"
void JobURL::impldbg_checkIt()
{
// check simple URL's
JobURL::impldbg_checkURL("vnd.sun.star.job:event=onMyEvent" , E_EVENT , "onMyEvent", "" , "" , NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job:alias=myAlias" , E_ALIAS , "" , "myAlias", "" , NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job:service=css.Service", E_SERVICE, "" , "" , "css.Service", NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job:service=;" , E_UNKNOWN, "" , "" , "" , NULL, NULL, NULL);
// check combinations
// Note: No additional spaces or tabs are allowed after a seperator occured.
// Tab and spaces before a seperator will be used as value!
JobURL::impldbg_checkURL("vnd.sun.star.job:event=onMyEvent;alias=myAlias;service=css.Service" , E_EVENT | E_ALIAS | E_SERVICE , "onMyEvent", "myAlias", "css.Service" , NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job:service=css.Service;alias=myAlias" , E_ALIAS | E_SERVICE , "" , "myAlias", "css.Service" , NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job:service=css.Service ;alias=myAlias" , E_ALIAS | E_SERVICE , "" , "myAlias", "css.Service ", NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job:service=css.Service; alias=myAlias" , E_UNKNOWN , "" , "" , "" , NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job : event=onMyEvent" , E_UNKNOWN , "" , "" , "" , NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job:event=onMyEvent;event=onMyEvent;service=css.Service", E_UNKNOWN , "" , "" , "" , NULL, NULL, NULL);
// check upper/lower case
// fix parts of the URL are case insensitive (e.g. "vnd.SUN.star.job:eVEnt=")
// values are case sensitive (e.g. "myAlias" )
JobURL::impldbg_checkURL("vnd.SUN.star.job:eVEnt=onMyEvent;aliAs=myAlias;serVice=css.Service", E_EVENT | E_ALIAS | E_SERVICE , "onMyEvent", "myAlias", "css.Service" , NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.SUN.star.job:eVEnt=onMyEVENT;aliAs=myALIAS;serVice=css.SERVICE", E_EVENT | E_ALIAS | E_SERVICE , "onMyEVENT", "myALIAS", "css.SERVICE" , NULL, NULL, NULL);
// check stupid URLs
JobURL::impldbg_checkURL("vnd.sun.star.jobs:service=css.Service" , E_UNKNOWN, "", "", "", NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job service=css.Service" , E_UNKNOWN, "", "", "", NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job:service;css.Service" , E_UNKNOWN, "", "", "", NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job:service;" , E_UNKNOWN, "", "", "", NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job:;alias;service;event=" , E_UNKNOWN, "", "", "", NULL, NULL, NULL);
JobURL::impldbg_checkURL("vnd.sun.star.job:alias=a;service=s;event=", E_UNKNOWN, "", "", "", NULL, NULL, NULL);
// check argument handling
JobURL::impldbg_checkURL("vnd.sun.star.job:event=onMyEvent?eventArg1,eventArg2=3,eventArg4," , E_EVENT , "onMyEvent", "" , "" , "eventArg1,eventArg2=3,eventArg4,", NULL , NULL );
JobURL::impldbg_checkURL("vnd.sun.star.job:alias=myAlias?aliasArg1,aliasarg2" , E_EVENT , "" , "myAlias", "" , NULL , "aliasArg1,aliasarg2", NULL );
JobURL::impldbg_checkURL("vnd.sun.star.job:service=css.myService?serviceArg1" , E_EVENT , "" , "" , "css.myService", NULL , NULL , "serviceArg1" );
JobURL::impldbg_checkURL("vnd.sun.star.job:service=css.myService?serviceArg1;alias=myAlias?aliasArg=564", E_EVENT | E_ALIAS, "" , "myAlias", "css.myService", NULL , "aliasArg=564" , "serviceArg1" );
}
//________________________________
/**
@short helper debug method
@descr It uses the given parameter to create a new instance of a JobURL.
They results will be compared with the exepected ones.
The a log will be written, which contains some detailed informations
for this sub test.
@param pURL
the job URL, which should be checked
@param eExpectedPart
the expected result
@param pExpectedEvent
the expected event value
@param pExpectedAlias
the expected alias value
@param pExpectedService
the expected service value
@param pExpectedEventArgs
the expected event arguments
@param pExpectedAliasArgs
the expected alias arguments
@param pExpectedServiceArgs
the expected service arguments
*/
void JobURL::impldbg_checkURL( /*IN*/ const sal_Char* pURL ,
/*IN*/ sal_uInt32 eExpectedPart ,
/*IN*/ const sal_Char* pExpectedEvent ,
/*IN*/ const sal_Char* pExpectedAlias ,
/*IN*/ const sal_Char* pExpectedService ,
/*IN*/ const sal_Char* pExpectedEventArgs ,
/*IN*/ const sal_Char* pExpectedAliasArgs ,
/*IN*/ const sal_Char* pExpectedServiceArgs )
{
::rtl::OUString sEvent ;
::rtl::OUString sAlias ;
::rtl::OUString sService ;
::rtl::OUString sEventArgs ;
::rtl::OUString sAliasArgs ;
::rtl::OUString sServiceArgs;
::rtl::OUString sURL (::rtl::OUString::createFromAscii(pURL));
sal_Bool bOK = sal_True;
JobURL aURL(sURL);
// check if URL is invalid
if (eExpectedPart==E_UNKNOWN)
bOK = !aURL.isValid();
// check if URL has the expected event part
if (
(bOK ) &&
((eExpectedPart & E_EVENT) == E_EVENT)
)
{
bOK = (
(aURL.isValid() ) &&
(aURL.getEvent(sEvent) ) &&
(sEvent.getLength()>0 ) &&
(sEvent.compareToAscii(pExpectedEvent)==0)
);
if (bOK && pExpectedEventArgs!=NULL)
{
bOK = (
(aURL.getEventArgs(sEventArgs) ) &&
(sEventArgs.compareToAscii(pExpectedEventArgs)==0)
);
};
}
// check if URL has no event part
if (
(bOK ) &&
((eExpectedPart & E_EVENT) != E_EVENT)
)
{
bOK = (
(!aURL.getEvent(sEvent) ) &&
(sEvent.getLength()==0 ) &&
(!aURL.getEventArgs(sEventArgs)) &&
(sEventArgs.getLength()==0 )
);
}
// check if URL has the expected alias part
if (
(bOK ) &&
((eExpectedPart & E_ALIAS) == E_ALIAS)
)
{
bOK = (
(aURL.isValid() ) &&
(aURL.getAlias(sAlias) ) &&
(sAlias.getLength()>0 ) &&
(sAlias.compareToAscii(pExpectedAlias)==0)
);
if (bOK && pExpectedAliasArgs!=NULL)
{
bOK = (
(aURL.getAliasArgs(sAliasArgs) ) &&
(sAliasArgs.compareToAscii(pExpectedAliasArgs)==0)
);
};
}
// check if URL has the no alias part
if (
(bOK ) &&
((eExpectedPart & E_ALIAS) != E_ALIAS)
)
{
bOK = (
(!aURL.getAlias(sAlias) ) &&
(sAlias.getLength()==0 ) &&
(!aURL.getAliasArgs(sAliasArgs)) &&
(sAliasArgs.getLength()==0 )
);
}
// check if URL has the expected service part
if (
(bOK ) &&
((eExpectedPart & E_SERVICE) == E_SERVICE)
)
{
bOK = (
(aURL.isValid() ) &&
(aURL.getService(sService) ) &&
(sService.getLength()>0 ) &&
(sService.compareToAscii(pExpectedService)==0)
);
if (bOK && pExpectedServiceArgs!=NULL)
{
bOK = (
(aURL.getServiceArgs(sServiceArgs) ) &&
(sServiceArgs.compareToAscii(pExpectedServiceArgs)==0)
);
};
}
// check if URL has the no service part
if (
(bOK ) &&
((eExpectedPart & E_SERVICE) != E_SERVICE)
)
{
bOK = (
(!aURL.getService(sService) ) &&
(sService.getLength()==0 ) &&
(!aURL.getServiceArgs(sServiceArgs)) &&
(sServiceArgs.getLength()==0 )
);
}
::rtl::OUStringBuffer sMsg(256);
sMsg.appendAscii("\"" );
sMsg.append (sURL );
sMsg.appendAscii("\" ");
if (bOK)
{
sMsg.appendAscii("... OK\n");
}
else
{
sMsg.appendAscii("... failed\n");
sMsg.appendAscii("expected was: ");
if (eExpectedPart==E_UNKNOWN)
sMsg.appendAscii("E_UNKNOWN");
if ((eExpectedPart & E_EVENT) == E_EVENT)
{
sMsg.appendAscii("| E_EVENT e=\"");
sMsg.appendAscii(pExpectedEvent );
sMsg.appendAscii("\"" );
}
if ((eExpectedPart & E_ALIAS) == E_ALIAS)
{
sMsg.appendAscii("| E_ALIAS a=\"");
sMsg.appendAscii(pExpectedAlias );
sMsg.appendAscii("\"" );
}
if ((eExpectedPart & E_SERVICE) == E_SERVICE)
{
sMsg.appendAscii("| E_SERVICE s=\"");
sMsg.appendAscii(pExpectedService );
sMsg.appendAscii("\"" );
}
sMsg.appendAscii("\tbut it was : " );
sMsg.append (aURL.impldbg_toString());
sMsg.appendAscii("\n" );
}
WRITE_LOGFILE(LOGFILE_JOBURL, U2B(sMsg.makeStringAndClear()))
}
//________________________________
/**
@short helper debug method
@descr It returns a representation of the internal object state
as string notation.
@returns The formated string representation.
*/
::rtl::OUString JobURL::impldbg_toString() const
{
/* SAFE { */
ReadGuard aReadLock(m_aLock);
::rtl::OUStringBuffer sBuffer(256);
if (m_eRequest==E_UNKNOWN)
sBuffer.appendAscii("E_UNKNOWN");
if ((m_eRequest & E_EVENT) == E_EVENT)
sBuffer.appendAscii("| E_EVENT");
if ((m_eRequest & E_ALIAS) == E_ALIAS)
sBuffer.appendAscii("| E_ALIAS");
if ((m_eRequest & E_SERVICE) == E_SERVICE)
sBuffer.appendAscii("| E_SERVICE");
sBuffer.appendAscii("{ e=\"" );
sBuffer.append (m_sEvent );
sBuffer.appendAscii("\" - a=\"");
sBuffer.append (m_sAlias );
sBuffer.appendAscii("\" - s=\"");
sBuffer.append (m_sService );
sBuffer.appendAscii("\" }" );
aReadLock.unlock();
/* } SAFE */
return sBuffer.makeStringAndClear();
}
//________________________________
sal_Bool JobURL::getServiceArgs( /*OUT*/ ::rtl::OUString& sServiceArgs ) const
{
/* SAFE { */
ReadGuard aReadLock(m_aLock);
sServiceArgs = ::rtl::OUString();
sal_Bool bSet = ((m_eRequest & E_SERVICE) == E_SERVICE);
if (bSet)
sServiceArgs = m_sServiceArgs;
aReadLock.unlock();
/* } SAFE */
return bSet;
}
//________________________________
sal_Bool JobURL::getEventArgs( /*OUT*/ ::rtl::OUString& sEventArgs ) const
{
/* SAFE { */
ReadGuard aReadLock(m_aLock);
sEventArgs = ::rtl::OUString();
sal_Bool bSet = ((m_eRequest & E_EVENT) == E_EVENT);
if (bSet)
sEventArgs = m_sEventArgs;
aReadLock.unlock();
/* } SAFE */
return bSet;
}
//________________________________
sal_Bool JobURL::getAliasArgs( /*OUT*/ ::rtl::OUString& sAliasArgs ) const
{
/* SAFE { */
ReadGuard aReadLock(m_aLock);
sAliasArgs = ::rtl::OUString();
sal_Bool bSet = ((m_eRequest & E_ALIAS) == E_ALIAS);
if (bSet)
sAliasArgs = m_sAliasArgs;
aReadLock.unlock();
/* } SAFE */
return bSet;
}
#endif // ENABLE_COMPONENT_SELF_CHECK
} // namespace framework