施放警告"使用Golang绑定在libtorrent中输入

时间:2014-12-17 11:35:55

标签: casting go bittorrent libtorrent

我正在使用libtorrent-go

在Golang开发个人项目

当我收到"save_resume_data_alert"类型的提醒时,我会接听它并按照libtorrent documentation

中的说明进行搜索
...
        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 {}
}

1 个答案:

答案 0 :(得分:1)

如上所述,libtorrent-go开发人员回答了我,所以我是出于后人的原因转发答案。

SWIG-Golang documentation中记录了使用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())