diff --git a/ext/rhoconnect-client/RhoConnectClient.rb b/ext/rhoconnect-client/RhoConnectClient.rb
index e5d0a33..4c27521 100644
--- a/ext/rhoconnect-client/RhoConnectClient.rb
+++ b/ext/rhoconnect-client/RhoConnectClient.rb
@@ -103,7 +103,13 @@ def self.getSourceNameById( sourceId )
nil
end
-
+ def self.setOIDCToken( token )
+ setProtocolExtras(
+ {
+ 'headers' => { 'Authorization' => "Bearer #{token}" }
+ }
+ )
+ end
# vvv DEPRECATED vvv
diff --git a/ext/rhoconnect-client/ext/RhoConnectClient.xml b/ext/rhoconnect-client/ext/RhoConnectClient.xml
index bcd8670..289860b 100644
--- a/ext/rhoconnect-client/ext/RhoConnectClient.xml
+++ b/ext/rhoconnect-client/ext/RhoConnectClient.xml
@@ -307,6 +307,18 @@ Be sure to review the [Ruby API Usage](/guide/api_ruby) guide for important info
+
+
+ Sets extras to be added to protocol requests.
+
+
+ Hash of extras
+
+
+
+
+
+
1.0.0
diff --git a/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.cpp b/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.cpp
index 9b0ca15..2dcb1f2 100644
--- a/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.cpp
+++ b/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.cpp
@@ -191,6 +191,30 @@ void RhoConnectClientImpl::login( const rho::String& login, const rho::String&
handleSyncResult(oResult);
}
+
+void RhoConnectClientImpl::setProtocolExtras( const rho::Hashtable& extras, rho::apiGenerator::CMethodResult& oResult) {
+
+ rho::sync::CSyncEngine::ProtocolExtras parsedExtras;
+
+ for ( auto it = extras.begin(); it != extras.end(); ++it ) {
+
+ rho::Hashtable< rho::String, rho::String > parsedExtra;
+
+ rho::json::CJSONEntry json( it->second.c_str() );
+ if ( json.isObject() ) {
+ for( rho::json::CJSONStructIterator jobj( json ); !jobj.isEnd(); jobj.next()) {
+ if ( jobj.getCurValue().isString()) {
+ parsedExtra.put( jobj.getCurKey(), jobj.getCurString() );
+ }
+ }
+ }
+
+ parsedExtras.put( it->first, parsedExtra );
+
+ }
+
+ getSyncThread()->addQueueCommand(new sync::CSyncThread::CSyncSetProtoExtrasCommand( parsedExtras ));
+}
void RhoConnectClientImpl::handleSyncResult(rho::apiGenerator::CMethodResult& oResult) {
if ( getSyncEngine().isNoThreadedMode() ) {
diff --git a/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.h b/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.h
index 672d309..cf1dffd 100644
--- a/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.h
+++ b/ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.h
@@ -45,6 +45,7 @@ class RhoConnectClientImpl : public CRhoConnectClientSingletonBase
virtual void getLastSyncObjectCount( const rho::String& sourceName, rho::apiGenerator::CMethodResult& oResult);
virtual void setSourceProperty( const rho::String& sourceName, const rho::String& propertyName, const rho::String& propertyValue, rho::apiGenerator::CMethodResult& oResult);
virtual void getSourceProperty( const rho::String& sourceName, const rho::String& propertyName, rho::apiGenerator::CMethodResult& oResult);
+ virtual void setProtocolExtras( const rho::Hashtable& extras, rho::apiGenerator::CMethodResult& oResult);
private:
void handleSyncResult(rho::apiGenerator::CMethodResult& oResult);
diff --git a/ext/rhoconnect-client/ext/shared/sync/SyncEngine.cpp b/ext/rhoconnect-client/ext/shared/sync/SyncEngine.cpp
index 4617e9e..708b59b 100755
--- a/ext/rhoconnect-client/ext/shared/sync/SyncEngine.cpp
+++ b/ext/rhoconnect-client/ext/shared/sync/SyncEngine.cpp
@@ -1078,7 +1078,18 @@ void CSyncEngine::login(String name, String password, const CSyncNotification& o
//try {
loadAllSources();
- NetResponse resp = getNet().pullCookies( getProtocol().getLoginUrl(), getProtocol().getLoginBody(name, password), this );
+ Hashtable reqHeaders;
+ alterRequestHeaders(reqHeaders);
+ NetResponse resp = getNet().doRequest( "POST", getProtocol().getLoginUrl(), getProtocol().getLoginBody(name,password), this, &reqHeaders );
+
+ String strSession = "";
+
+ if ( resp.getRespCode() == 200 )
+ {
+ strSession = resp.getCookies().c_str();
+ }
+
+
int nErrCode = RhoAppAdapter.getErrorFromResponse(resp);
if ( nErrCode != RhoAppAdapter.ERR_NONE )
{
@@ -1086,7 +1097,6 @@ void CSyncEngine::login(String name, String password, const CSyncNotification& o
return;
}
- String strSession = resp.getCharData();
if ( strSession.length() == 0 )
{
LOG(ERROR) + "Return empty session.";
@@ -1203,6 +1213,16 @@ String CSyncEngine::getSyncServer() const {
return RHOCONF().getString("syncserver");
}
+void CSyncEngine::alterRequestHeaders( Hashtable& headers )
+{
+ if ( m_protocolExtras.containsKey("headers") ) {
+ const Hashtable& extraHeaders = m_protocolExtras.get("headers");
+ for ( auto it = extraHeaders.begin(); it != extraHeaders.end(); ++it ) {
+ headers.put(it->first,it->second);
+ }
+ }
+}
+
static String getHostFromUrl( const String& strUrl )
{
diff --git a/ext/rhoconnect-client/ext/shared/sync/SyncEngine.h b/ext/rhoconnect-client/ext/shared/sync/SyncEngine.h
index 06a95a4..89666b8 100644
--- a/ext/rhoconnect-client/ext/shared/sync/SyncEngine.h
+++ b/ext/rhoconnect-client/ext/shared/sync/SyncEngine.h
@@ -93,6 +93,8 @@ class CSyncEngine : public net::IRhoSession
void clearProperties();
};
+ typedef rho::Hashtable< rho::String, rho::Hashtable< rho::String, rho::String >> ProtocolExtras;
+
private:
VectorPtr m_sources;
NetRequest m_NetRequest, m_NetRequestClientID;
@@ -112,6 +114,8 @@ class CSyncEngine : public net::IRhoSession
net::CNetRequestWrapper getNetClientID(){ return getNetRequest(&m_NetRequestClientID); }
+ ProtocolExtras m_protocolExtras;
+
public:
CSyncEngine();
~CSyncEngine(void){}
@@ -185,6 +189,10 @@ class CSyncEngine : public net::IRhoSession
void setNonThreadedMode(boolean b){m_bNoThreaded = b;}
void applyChangedValues(db::CDBAdapter& db);
+
+ void setProtocolExtras( const ProtocolExtras& e ) { m_protocolExtras = e; }
+ void alterRequestHeaders( Hashtable& headers );
+
private:
bool recoverSearch( const String& strUrl, const String& strBody, int& errorCode, String& strError, int nProgressStep );
diff --git a/ext/rhoconnect-client/ext/shared/sync/SyncSource.cpp b/ext/rhoconnect-client/ext/shared/sync/SyncSource.cpp
index 6c7d100..070db2d 100644
--- a/ext/rhoconnect-client/ext/shared/sync/SyncSource.cpp
+++ b/ext/rhoconnect-client/ext/shared/sync/SyncSource.cpp
@@ -391,6 +391,8 @@ void CSyncSource::doSyncClientChanges()
{
Hashtable reqHeaders;
reqHeaders.put(getProtocol().getClientIDHeader(), getSync().getClientID());
+ getSync().alterRequestHeaders(reqHeaders);
+
if ( m_arMultipartItems.size() > 0 )
{
CMultipartItem* pItem = new CMultipartItem();
@@ -644,6 +646,7 @@ void CSyncSource::syncServerChanges()
String strUrl = getProtocol().getServerQueryUrl(getName(), getSync().getClientID(), getSync().getSyncPageSize());
Hashtable reqHeaders;
reqHeaders.put(getProtocol().getClientIDHeader(), getSync().getClientID());
+ getSync().alterRequestHeaders(reqHeaders);
if ( !m_bTokenFromDB && getToken() > 1 )
strUrl += "&token=" + convertToStringA(getToken());
diff --git a/ext/rhoconnect-client/ext/shared/sync/SyncThread.cpp b/ext/rhoconnect-client/ext/shared/sync/SyncThread.cpp
index e88230e..a402a76 100644
--- a/ext/rhoconnect-client/ext/shared/sync/SyncThread.cpp
+++ b/ext/rhoconnect-client/ext/shared/sync/SyncThread.cpp
@@ -184,37 +184,39 @@ void CSyncThread::checkShowStatus(CSyncCommand& oSyncCmd)
void CSyncThread::processCommand(IQueueCommand* pCmd)
{
CSyncCommand& oSyncCmd = *((CSyncCommand*)pCmd);
- switch(oSyncCmd.m_nCmdCode)
+ checkShowStatus(oSyncCmd);
+ oSyncCmd.executeForSyncEngine( m_oSyncEngine );
+}
+
+void CSyncThread::CSyncCommand::executeForSyncEngine( CSyncEngine& sync )
+{
+ switch(m_nCmdCode)
{
case scSyncAll:
- checkShowStatus(oSyncCmd);
- m_oSyncEngine.doSyncAllSources(oSyncCmd.m_strQueryParams,oSyncCmd.m_bSyncOnlyChangedSources);
- break;
- case scSyncOne:
- {
- checkShowStatus(oSyncCmd);
- m_oSyncEngine.doSyncSource(CSyncEngine::CSourceID(oSyncCmd.m_nCmdParam,oSyncCmd.m_strCmdParam), oSyncCmd.m_strQueryParams );
- }
- break;
- case scSearchOne:
- {
- checkShowStatus(oSyncCmd);
- m_oSyncEngine.doSearch( ((CSyncSearchCommand&)oSyncCmd).m_arSources, oSyncCmd.m_strCmdParam, ((CSyncSearchCommand&)oSyncCmd).m_strFrom,
- ((CSyncSearchCommand&)oSyncCmd).m_bSyncChanges,
- oSyncCmd.m_nCmdParam);
- }
+ sync.doSyncAllSources(m_strQueryParams,m_bSyncOnlyChangedSources);
break;
- case scLogin:
- {
- CSyncLoginCommand& oLoginCmd = (CSyncLoginCommand&)oSyncCmd;
- checkShowStatus(oSyncCmd);
- m_oSyncEngine.login(oLoginCmd.m_strName, oLoginCmd.m_strPassword, *oLoginCmd.m_pNotify );
- }
+ case scSyncOne:
+ sync.doSyncSource(CSyncEngine::CSourceID(m_nCmdParam,m_strCmdParam), m_strQueryParams );
break;
}
}
+void CSyncThread::CSyncSearchCommand::executeForSyncEngine(CSyncEngine &sync)
+{
+ sync.doSearch( m_arSources, m_strCmdParam, m_strFrom, m_bSyncChanges, m_nCmdParam);
+}
+
+void CSyncThread::CSyncLoginCommand::executeForSyncEngine(CSyncEngine &sync)
+{
+ sync.login(m_strName, m_strPassword, *m_pNotify );
+}
+
+void CSyncThread::CSyncSetProtoExtrasCommand::executeForSyncEngine(CSyncEngine &sync)
+{
+ sync.setProtocolExtras( m_extras );
+}
+
void CSyncThread::setPollInterval(int nInterval)
{
// if ( nInterval == 0 )
@@ -272,6 +274,8 @@ String CSyncThread::CSyncCommand::toString()
return "Login";
case scSearchOne:
return "Search";
+ case scSetProtoExtras:
+ return "SetProtoExtras";
}
return "Unknown; Code : " + convertToStringA(m_nCmdCode);
diff --git a/ext/rhoconnect-client/ext/shared/sync/SyncThread.h b/ext/rhoconnect-client/ext/shared/sync/SyncThread.h
index 4094840..3634999 100644
--- a/ext/rhoconnect-client/ext/shared/sync/SyncThread.h
+++ b/ext/rhoconnect-client/ext/shared/sync/SyncThread.h
@@ -62,7 +62,7 @@ namespace sync {
class CSyncThread : public common::CThreadQueue
{
public:
- enum ESyncCommands{ scNone = 0, scSyncAll, scSyncOne, scLogin, scSearchOne};
+ enum ESyncCommands{ scNone = 0, scSyncAll, scSyncOne, scLogin, scSearchOne, scSetProtoExtras };
private:
@@ -126,6 +126,8 @@ class CSyncThread : public common::CThreadQueue
virtual String toString();
+ virtual void executeForSyncEngine( CSyncEngine& sync );
+
};
class CSyncLoginCommand : public CSyncCommand
@@ -140,6 +142,8 @@ class CSyncThread : public common::CThreadQueue
m_strPassword = password;
m_pNotify = pNotify;
}
+
+ virtual void executeForSyncEngine( CSyncEngine& sync );
};
class CSyncSearchCommand : public CSyncCommand
@@ -149,12 +153,29 @@ class CSyncThread : public common::CThreadQueue
boolean m_bSyncChanges;
rho::Vector m_arSources;
- CSyncSearchCommand(String from, String params, const rho::Vector& arSources, boolean sync_changes, int nProgressStep) : CSyncCommand(CSyncThread::scSearchOne,params,nProgressStep, false, "")
+ CSyncSearchCommand(String from, String params, const rho::Vector& arSources, boolean sync_changes, int nProgressStep) :
+ CSyncCommand(CSyncThread::scSearchOne,params,nProgressStep, false, "")
{
m_strFrom = from;
m_bSyncChanges = sync_changes;
m_arSources = arSources;
}
+
+ virtual void executeForSyncEngine( CSyncEngine& sync );
+ };
+
+ class CSyncSetProtoExtrasCommand : public CSyncCommand
+ {
+ CSyncEngine::ProtocolExtras m_extras;
+ public:
+ CSyncSetProtoExtrasCommand( const CSyncEngine::ProtocolExtras& extras ) :
+ CSyncCommand(CSyncThread::scSetProtoExtras,"",false,"",false),
+ m_extras(extras)
+ {
+
+ }
+
+ virtual void executeForSyncEngine( CSyncEngine& sync );
};
private: