簡體   English   中英

使用Golang綁定在libtorrent中強制轉換“警報”類型

[英]Casting an “alert” type in libtorrent, using Golang bindings

我正在使用libtorrent-go在Golang中開發個人項目

當我收到類型為"save_resume_data_alert"的警報時,我將其拾起並必須按照libtorrent文檔中的說明進行投射

...
        save_resume_data_alert const* rd = alert_cast<save_resume_data_alert>(a);
...

但是我真的不知道如何在golang中使用它! 當前代碼:

package main

import (
    lt "github.com/steeve/libtorrent-go"

    "log"
    "time"
)

func main() {

    randomTorrent := lt.NewAdd_torrent_params()
    randomTorrent.SetUrl("PUT A MAGNET LINK HERE")
    randomTorrent.SetSave_path(".")

    ec := lt.NewError_code()
    torrentSession := lt.NewSession()
    torrentSession.Set_alert_mask(status_notification + storage_notification)
    torrentSession.Listen_on(lt.NewStd_pair_int_int(6900, 6999), ec)
    if ec.Value() != 0 {
        log.Println(ec.Message())
    }

    torrentHandle := torrentSession.Add_torrent(randomTorrent, ec)
    if ec.Value() != 0 {
        log.Println(ec.Message())
    }

    go func() {
        for {
            if torrentSession.Wait_for_alert(lt.Seconds(10)).Swigcptr() == 0 {
                log.Println("Alert timeout occurred!")
            }

            alert := torrentSession.Pop_alert()
            switch alert.What() {
            default:
                log.Printf("Alert: %#v", alert.What())
            case "metadata_received_alert":
                log.Println("Received Metadata!! finally!")
                torrentHandle.Save_resume_data()
            case "save_resume_data_alert":
                log.Println("Wrote Metadata!")
                // need to actually write the resume_data :( can't find how
            case "save_resume_data_failed_alert":
                log.Println("Failed Metadata!")
            }
        }
    }()

    select {}
}

如上所述, libtorrent-go開發人員回答了我,因此出於后代原因,我轉發了答案。

SWIG-Golang文檔中介紹了使用SWIG庫在Golang中強制轉換C ++結構。
特別是在此聲明中:

給定接口類型的值,Go代碼可以通過調用Swigcptr方法來檢索指向C ++類型的指針。 這將返回SwigcptrClassName類型的值,這只是uintptr的名稱。 Go類型轉換可用於將該值轉換為其他C ++類型,但是請注意,此轉換將不進行類型檢查,並且實質上等效於reinterpret_cast。 這僅應用於非常特殊的情況,例如C ++將使用dynamic_cast的情況。

在我上面發布的那段特定代碼中,需要以下代碼才能使其正常工作:

case "save_resume_data_alert":
  log.Println("Wrote Metadata!")
  // need to actually write the resume_data :( can't find how
  SaveRDAlert := lt.SwigcptrSave_resume_data_alert(alert.Swigcptr())
  log.Printf("Resume Data: %#v", SaveRDAlert.GetResume_data())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM