diff options
Diffstat (limited to 'framework/source/jobs/joburl.cxx')
-rw-r--r-- | framework/source/jobs/joburl.cxx | 323 |
1 files changed, 228 insertions, 95 deletions
diff --git a/framework/source/jobs/joburl.cxx b/framework/source/jobs/joburl.cxx index 611597d68e65..7a6a27d18c95 100644 --- a/framework/source/jobs/joburl.cxx +++ b/framework/source/jobs/joburl.cxx @@ -2,9 +2,9 @@ * * $RCSfile: joburl.cxx,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: cd $ $Date: 2002-10-14 11:11:04 $ + * last change: $Author: hr $ $Date: 2003-03-25 18:21:46 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -121,6 +121,10 @@ namespace framework{ 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>]} @@ -133,81 +137,43 @@ JobURL::JobURL( /*IN*/ const ::rtl::OUString& sURL ) { // 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 (sToken.matchIgnoreAsciiCaseAsciiL(JOBURL_EVENT_STR,JOBURL_EVENT_LEN,0)) + if ( + (JobURL::implst_split(sToken,JOBURL_EVENT_STR,JOBURL_EVENT_LEN,sPartValue,sPartArguments)) && + (sPartValue.getLength()>0 ) + ) { - // if an event occures more then once ... - // mark this instance as non valid and break further operations - if ((m_eRequest & E_EVENT) == E_EVENT) - { - m_eRequest = E_UNKNOWN; - return; - } - // set the part value - m_sEvent = sToken.copy(JOBURL_EVENT_LEN); - m_eRequest |= E_EVENT; - - // but don't forget to validate it too - if (m_sEvent.getLength()<1) - { - m_eRequest = E_UNKNOWN; - return; - } + m_sEvent = sPartValue ; + m_sEventArgs = sPartArguments; + m_eRequest |= E_EVENT ; } else // check for "alias=" - if (sToken.matchIgnoreAsciiCaseAsciiL(JOBURL_ALIAS_STR,JOBURL_ALIAS_LEN,0)) + if ( + (JobURL::implst_split(sToken,JOBURL_ALIAS_STR,JOBURL_ALIAS_LEN,sPartValue,sPartArguments)) && + (sPartValue.getLength()>0 ) + ) { - // if an alias occures more then once ... - // mark this instance as non valid and break further operations - if ((m_eRequest & E_ALIAS) == E_ALIAS) - { - m_eRequest = E_UNKNOWN; - return; - } - // set the part value - m_sAlias = sToken.copy(JOBURL_ALIAS_LEN); - m_eRequest |= E_ALIAS; - - // but don't forget to validate it too - if (m_sAlias.getLength()<1) - { - m_eRequest = E_UNKNOWN; - return; - } + m_sAlias = sPartValue ; + m_sAliasArgs = sPartArguments; + m_eRequest |= E_ALIAS ; } else // check for "service=" - if (sToken.matchIgnoreAsciiCaseAsciiL(JOBURL_SERVICE_STR,JOBURL_SERVICE_LEN,0)) + if ( + (JobURL::implst_split(sToken,JOBURL_SERVICE_STR,JOBURL_SERVICE_LEN,sPartValue,sPartArguments)) && + (sPartValue.getLength()>0 ) + ) { - // if an service occures more then once ... - // mark this instance as non valid and break further operations - if ((m_eRequest & E_SERVICE) == E_SERVICE) - { - m_eRequest = E_UNKNOWN; - return; - } - // set the part value - m_sService = sToken.copy(JOBURL_SERVICE_LEN); - m_eRequest |= E_SERVICE; - - // but don't forget to validate it too - if (m_sService.getLength()<1) - { - m_eRequest = E_UNKNOWN; - return; - } - } - // found and unexpected token - // URL is not valid then. - else - { - m_eRequest = E_UNKNOWN; - return; + m_sService = sPartValue ; + m_sServiceArgs = sPartArguments; + m_eRequest |= E_SERVICE ; } } while(t!=-1); @@ -261,6 +227,24 @@ sal_Bool JobURL::getEvent( /*OUT*/ ::rtl::OUString& sEvent ) const } //________________________________ + +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; +} + +//________________________________ /** @short get the alias item of this job URL @descr Because the three possible parts of such URL (event, alias, service) @@ -294,6 +278,24 @@ sal_Bool JobURL::getAlias( /*OUT*/ ::rtl::OUString& sAlias ) const } //________________________________ + +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; +} + +//________________________________ /** @short get the service item of this job URL @descr Because the three possible parts of such URL (event, service, service) @@ -327,6 +329,86 @@ sal_Bool JobURL::getService( /*OUT*/ ::rtl::OUString& sService ) const } //________________________________ + +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; +} + +//________________________________ +/** + @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. @@ -340,34 +422,40 @@ sal_Bool JobURL::getService( /*OUT*/ ::rtl::OUString& sService ) const void JobURL::impldbg_checkIt() { // check simple URL's - JobURL::impldbg_checkURL("vnd.sun.star.job:event=onMyEvent" , E_EVENT , "onMyEvent", "" , "" ); - JobURL::impldbg_checkURL("vnd.sun.star.job:alias=myAlias" , E_ALIAS , "" , "myAlias", "" ); - JobURL::impldbg_checkURL("vnd.sun.star.job:service=css.Service", E_SERVICE, "" , "" , "css.Service"); - JobURL::impldbg_checkURL("vnd.sun.star.job:service=," , E_UNKNOWN, "" , "" , "" ); + 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" ); - JobURL::impldbg_checkURL("vnd.sun.star.job:service=css.Service,alias=myAlias" , E_ALIAS | E_SERVICE , "" , "myAlias", "css.Service" ); - JobURL::impldbg_checkURL("vnd.sun.star.job:service=css.Service ,alias=myAlias" , E_ALIAS | E_SERVICE , "" , "myAlias", "css.Service "); - JobURL::impldbg_checkURL("vnd.sun.star.job:service=css.Service, alias=myAlias" , E_UNKNOWN , "" , "" , "" ); - JobURL::impldbg_checkURL("vnd.sun.star.job : event=onMyEvent" , E_UNKNOWN , "" , "" , "" ); - JobURL::impldbg_checkURL("vnd.sun.star.job:event=onMyEvent,event=onMyEvent,service=css.Service", E_UNKNOWN , "" , "" , "" ); + 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" ); - JobURL::impldbg_checkURL("vnd.SUN.star.job:eVEnt=onMyEVENT,aliAs=myALIAS,serVice=css.SERVICE", E_EVENT | E_ALIAS | E_SERVICE , "onMyEVENT", "myALIAS", "css.SERVICE" ); + 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, "", "", ""); - JobURL::impldbg_checkURL("vnd.sun.star.job service=css.Service" , E_UNKNOWN, "", "", ""); - JobURL::impldbg_checkURL("vnd.sun.star.job:service,css.Service" , E_UNKNOWN, "", "", ""); - JobURL::impldbg_checkURL("vnd.sun.star.job:service," , E_UNKNOWN, "", "", ""); - JobURL::impldbg_checkURL("vnd.sun.star.job:,alias,service,event=" , E_UNKNOWN, "", "", ""); - JobURL::impldbg_checkURL("vnd.sun.star.job:alias=a,service=s,event=", E_UNKNOWN, "", "", ""); + 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" ); } //________________________________ @@ -392,16 +480,31 @@ void JobURL::impldbg_checkIt() @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 ) +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 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; @@ -423,6 +526,14 @@ void JobURL::impldbg_checkURL( /*IN*/ const sal_Char* pURL , (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 @@ -432,8 +543,10 @@ void JobURL::impldbg_checkURL( /*IN*/ const sal_Char* pURL , ) { bOK = ( - (!aURL.getEvent(sEvent)) && - (sEvent.getLength()==0 ) + (!aURL.getEvent(sEvent) ) && + (sEvent.getLength()==0 ) && + (!aURL.getEventArgs(sEventArgs)) && + (sEventArgs.getLength()==0 ) ); } @@ -449,6 +562,14 @@ void JobURL::impldbg_checkURL( /*IN*/ const sal_Char* pURL , (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 @@ -458,8 +579,10 @@ void JobURL::impldbg_checkURL( /*IN*/ const sal_Char* pURL , ) { bOK = ( - (!aURL.getAlias(sAlias)) && - (sAlias.getLength()==0 ) + (!aURL.getAlias(sAlias) ) && + (sAlias.getLength()==0 ) && + (!aURL.getAliasArgs(sAliasArgs)) && + (sAliasArgs.getLength()==0 ) ); } @@ -475,6 +598,14 @@ void JobURL::impldbg_checkURL( /*IN*/ const sal_Char* pURL , (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 @@ -484,8 +615,10 @@ void JobURL::impldbg_checkURL( /*IN*/ const sal_Char* pURL , ) { bOK = ( - (!aURL.getService(sService)) && - (sService.getLength()==0 ) + (!aURL.getService(sService) ) && + (sService.getLength()==0 ) && + (!aURL.getServiceArgs(sServiceArgs)) && + (sServiceArgs.getLength()==0 ) ); } |