* HTTP Request [#d7c99347] ネットワーク上のファイルをドキュメントとして開く場合は loadComponentFromURL メソッドで開くことができます。また、画像ファイルなどをダウンロード、入手する場合には css.ucb.SimpleFileAccess サービスが利用できます。 一方で POST メソッドでファイルを受け取る場合には上記の方法が利用できません。この場合には css.ucb.UniversalContentBroker サービスを利用します。 http や https プロトコルの場合には css.ucb.WebDAVContentProvider サービスが利用されます。 少し複雑ですが、次のようにして https プロトコルのアドレスに POST メソッドで要求、ファイルを入力として受け取ることができます。 #code(basic){{ Sub HttpRequest_post sURL = "https://chart.googleapis.com/chart" sBody = "cht=qr&chs=100x100&chl=QR" oInput = Post(sURL, sBody) msgbox oInput.available() End Sub Function Post(sURL As String, sBody As String) As Variant oUCB = CreateUnoService("com.sun.star.ucb.UniversalContentBroker") oId = oUCB.createContentIdentifier(sURL) oContent = oUCB.queryContent(oId) oDataSink = CreateUnoListener("XDataSink_", _ "com.sun.star.io.XActiveDataSink") oCommandEnv = CreateUnoListener("XCommandEnv_", _ "com.sun.star.ucb.XCommandEnvironment") oBodyStream = CreateUnoService("com.sun.star.io.Pipe") oTextOutput = CreateUnoService("com.sun.star.io.TextOutputStream") oTextOutput.setOutputStream(oBodyStream) oTextOutput.writeString(sBody) oTextOUtput.closeOutput() oPostArgs = CreateUnoStruct("com.sun.star.ucb.PostCommandArgument2") oPostArgs.Source = oBodyStream oPostArgs.Sink = oDataSink aCommand = CreateUnoStruct("com.sun.star.ucb.Command") aCommand.Name = "post" aCommand.Argument = oPostArgs oRet = oContent.execute(aCommand, -1, oCommandEnv) oInput = oDataSink.getInputStream() Post = oInput End Function Dim oStream As Variant Function XDataSink_setInputStream(oLocStream As Variant) oStream = oLocStream End Function Function XDataSink_getInputStream() As Variant XDataSink_getInputStream = oStream End Function Function XCommandEnv_getInteractionHandler()' As Variant XCommandEnv_getInteractionHandler = CreateUnoListener(_ "XInteractionHandle_", "com.sun.star.task.XInteractionHandler") End Function Function XCommandEnv_getProgressHandler()' As Variant XCommandEnv_getProgressHandler = CreateUnoListener(_ "XProgressHandle_", "com.sun.star.ucb.XProgressHandler") End Function Function XInteractionHandle_handle(oRequest) End Function Function XProgressHandle_push(nStatus) End Function Function XProgressHandle_update(nStatus) End Function Function XProgressHandle_pop() End Function }} ** InteractionHandler [#ubabf1a3] css.task.XInteractionHandler インターフェースを使用してユーザーによる動作を行わせることができます。例えば、ダイアログの OK ボタンを押すといったような、ユーザーによる認証や操作をすべき場所で使われています。 HTTPのリクエストで認証が必要な場所でも利用されており、ユーザー名とパスワードを入力するダイアログの表示などで利用されます。 次のハンドラは URL へアクセスした際の認証を取り扱います。 #code(basic){{ Sub InteractionHandler_handle(req) r = req.getRequest() If CheckExceptionType(r, "com.sun.star.ucb.URLAuthenticationRequest") Then conts = req.getContinuations() for i = 0 to ubound(conts) step 1 cont = conts(i) If HasUnoInterfaces(cont, "com.sun.star.ucb.XInteractionSupplyAuthentication2") Then cont.setUserName("foo") cont.setPassword("bar") cont.select() Exit For End If next End If End Sub Function CheckExceptionType(e, sType As String) As Boolean ret = False idlclass = CreateUnoService("com.sun.star.reflection.CoreReflection").getType(e) If not IsNull(idlclass) Then ret = (idlclass.getTypeClass() = com.sun.star.uno.TypeClass.EXCEPTION and _ idlclass.getName() = sType) End If CheckExceptionType = ret End Function }} |